Von Rot zu Grün – Green Bar Patterns

Standard

Ich wende testgetriebene Entwicklung bereits seit über 10 Jahren an. Kurz zur Erinnerung: Bei TDD (Test-Driven Development) erfolgt die Implementierung in vielen kleinen Iterationen, die aus drei Teilen bestehen:

  • Schreibe einen Test für das erwünschte Verhalten. Der Programmcode erfüllt diesen Test noch nicht oder es gibt ihn noch gar nicht. Manche Testrunner stellen diesen Zustand durch einen roten Balken dar. Daher wird diese Phase oft mit Red bezeichnet.
  • Ändere oder schreibe den Programmcode mit dem kleinstmöglichen Aufwand, damit er den Test erfüllt. Manche Testrunner stellen diesen Zustand durch einen grünen Balken dar. Daher wird diese Phase oft mit Green bezeichnet.
  • Refaktorisiere den Code. Entferne Code-Duplizierung, führe Abstraktionen ein, wenn nötig, usw. Danach führe die Tests nochmal aus. Der Code muss die Tests noch immer erfüllen. Diese Phase wird oft mit Refactor bezeichnet.

Ich habe am Beginn viel über TDD gelesen. Meistens waren es Artikel im Internet. Es gab noch nicht viele Bücher über dieses Thema. Eine Ausnahme war Kent Becks Test-Driven Development. Es ist ein vergleichsweise dünnes Buch, das ich sehr schnell gelesen hatte.

Vor kurzem habe ich das Buch wieder gelesen und dabei wurden mir einige Details wieder bewusst. Dazu gehören die sogenannten “Green Bar Patterns”. Diese Patterns beschreiben, wie wir den Programmcode ändern können, damit er die Tests erfüllt:

  • Triangulation
  • Fake It (‘Til You Make It)
  • Offensichtliche Implementierung

Triangulation

Bei der Triangulation verallgemeinern wir den Code erst, wenn wir zwei oder mehr Tests geschrieben haben. Daraus ergibt sich folgender Ablauf:

  • Zuerst schreiben wir einen Test.
  • Dann machen wir die kleinstmögliche Änderung am Programmcode, damit er diesen Test erfüllt, z.B. geben wir nur den erwarteten Wert zurück.
  • Dann schreiben wir noch einen Test.
  • Erst jetzt abstrahieren wir die Implementierung.

Nehmen wir an, dass wir eine Funktion schreiben wollen, die zwei Zahlen addiert. Der erste Test könnte so aussehen:

    [Test]
    public void Sum_3plus4_Returns7()
    {
      Assert.That(Plus(3, 4), Is.EqualTo(7));
    }

Dann würde diese Implementierung ausreichen, um den Test zu erfüllen:

    public int Plus(int a, int b)
    {
      return 7;
    }

Um den Code verallgemeinern zu können, benötigen wir einen weiteren Test:

    [Test]
    public void Sum_9plus15_Returns24()
    {
      Assert.That(Plus(9, 15), Is.EqualTo(24));
    }

Jetzt können wir die allgemeine Implementierung schreiben:

    public int Plus(int a, int b)
    {
      return a + b;
    }

Beide Tests müssen zu diesem Zeitpunkt funktionieren.

Triangulation wird gerne verwendet, weil die Regeln sehr klar sind. Kent Beck empfiehlt diese Methode nur dann, wenn man sich über die korrekte Implementierung völlig unsicher ist.

Fake It (‘Til You Make It)

Auch bei “Fake It” machen wir nach dem ersten Test nur die kleinstmögliche Änderung am Programmcode, um den einen Test zu erfüllen. Im Unterschied zur Triangulation schreiben wir kein zweites Testbeispiel, sondern verallgemeinern den Code im Refaktorisierungsschritt.

  • Zuerst schreiben wir einen Test.
  • Dann machen wir die kleinste Änderung am Programmcode, damit dieser den Test erfüllt, z.B. durch Rückgabe des erwarteten Werts.
  • Jetzt abstrahieren wir die Implementierung durch Refaktorisierung.

Der erste Test und die zugehörige Implementierung für das obige Beispiel sieht wieder so aus:

    [Test]
    public void Sum_3plus4_Returns7()
    {
      Assert.That(Plus(3, 4), Is.EqualTo(7));
    }

    public int Plus(int a, int b)
    {
      return 7;
    }

Im Refaktorisierungsschritt eliminieren wir die Code-Duplizierung zwischen Test und Implementierung und ersetzen sie durch den richtigen Code:

    public int Plus(int a, int b)
    {
      return a + b;
    }

Wichtig bei “Fake It” ist, den Refaktorisierungsschritt ernst zu nehmen. Nach meiner Beobachtung wird gerne aufs Refaktorisieren vergessen, obwohl es einen so wichtigen Beitrag zum Software-Design darstellt.

Offensichtliche Implementierung

Bisher bestand die Implementierung nach dem ersten Test daraus, dass wir den erwarteten Rückgabewert als Konstante zurückgeben. Aber müssen wir das tun, wenn doch ganz klar ist, wie die Implementierung aussieht? Vor allem in unserem Beispiel mit der Addition zweier Parameter? Natürlich nicht. Wenn vollkommen klar ist, wie die Implementierung aussehen soll, schreiben wir sie einfach.

In unserem Beispiel sieht das so aus:

    [Test]
    public void Sum_3plus4_Returns7()
    {
      Assert.That(Plus(3, 4), Is.EqualTo(7));
    }

Und dann schreiben wir gleich:

    public int Plus(int a, int b)
    {
      return a + b;
    }

Wann verwendet man welche Methode?

Viele TDD-Neulinge fangen mit der offensichtlichen Implementierung an und verzetteln sich dann, weil sie zu große Schritte machen. Andere tendieren zur Triangulation und wundern sich, warum TDD so mühsam ist.

Tatsächlich haben alle drei Methoden ihre Berechtigung. Wir können mit “Fake It” anfangen und zur offensichtlichen Implementierung wechseln, wenn wir merken, dass der Code sehr einfach ist. Wenn die Tests öfter unbeabsichtigt rot bleiben, dann sind wir zu schnell unterwegs und sollten zu “Fake It” oder Triangulation wechseln.

Oft wissen wir nach längerem Nachdenken noch nicht, wie der Code aussehen soll. Dann werden wir mit der Triangulation beginnen und wenn wir sicherer geworden sind, zu einer schnelleren Methode wechseln.

Wenn der Code Schleifen oder Verzweigungen enthalten soll, dann ist er sehr wahrscheinlich nicht mehr einfach. Offensichtliche Implementierung ist dann offensichtlich die falsche Methode.

186 thoughts on “Von Rot zu Grün – Green Bar Patterns

  1. Hi to every one, the contents present at this website are actually amazing for people knowledge, well, keep
    up the good work fellows.

  2. Hi! This post could not be written any better!
    Reading this post reminds me of my previous room mate!
    He always kept chatting about this. I will forward this post to him.
    Fairly certain he will have a good read. Many thanks for sharing!

  3. I do trust all the concepts you have offered to your post.

    They’re very convincing and will definitely work.
    Still, the posts are too brief for newbies. Could you please lengthen them a little
    from subsequent time? Thank you for the post.

  4. wh0cd111561 [url=http://genericdoxycycline.doctor/]generic doxycycline[/url] [url=http://buyzyban.doctor/]buy zyban[/url] [url=http://generictetracycline.doctor/]tetracycline[/url] [url=http://cheapxenical.doctor/]cheap xenical[/url] [url=http://buyseroquel.doctor/]helpful hints[/url]

  5. wh0cd111561 [url=http://buycolchicine.doctor/]colchicine[/url] [url=http://tadalissx.doctor/]tadalis sx[/url] [url=http://cheapprozac.doctor/]prozac without a prescription[/url]

  6. Tremendous issues here. I’m very satisfied to look your post.
    Thank you a lot and I’m taking a look forward to contact you.

    Will you please drop me a e-mail?

  7. Hello there, just became aware of your blog through Google,
    and found that it is really informative. I’m gonna watch out for brussels.

    I will be grateful if you continue this in future. Numerous people
    will be benefited from your writing. Cheers!

  8. Hmm it seems like your blog ate my first comment (it was extremely
    long) so I guess I’ll just sum it up what I had written and say, I’m thoroughly enjoying
    your blog. I too am an aspiring blog blogger but I’m still new
    to the whole thing. Do you have any suggestions for beginner
    blog writers? I’d definitely appreciate it.

  9. Hey! This is kind of off topic but I need some guidance from an established blog.
    Is it difficult to set up your own blog? I’m not very techincal but I can figure things out pretty quick.
    I’m thinking about creating my own but I’m not sure where to
    begin. Do you have any ideas or suggestions? Many thanks

  10. It’s a shame you don’t have a donate button! I’d certainly donate to this
    brilliant blog! I suppose for now i’ll settle for bookmarking and adding
    your RSS feed to my Google account. I look forward to brand new updates and
    will talk about this site with my Facebook group.
    Talk soon!

  11. I used to be suggested this blog through my cousin. I
    am now not certain whether or not this submit is
    written by him as no one else realize such detailed about my difficulty.
    You are amazing! Thank you!

  12. Do you have a spam issue on this site; I also
    am a blogger, and I was wondering your situation; many of us have created some nice procedures and we
    are looking to exchange methods with others, be sure to shoot me an e-mail if interested.

  13. Hey I know this is off topic but I was wondering if you knew of
    any widgets I could add to my blog that automatically tweet
    my newest twitter updates. I’ve been looking for a plug-in like this for quite some
    time and was hoping maybe you would have some experience with something like this.

    Please let me know if you run into anything. I truly enjoy reading
    your blog and I look forward to your new updates.

  14. Facebook Autoliker, Auto Liker, autolike, autoliker, Photo Auto Liker, Status Liker, Facebook Liker, Photo Liker, facebook auto liker, Increase Facebook Likes, Auto Like, Status Auto Liker, Autoliker, auto liker, auto like, Autoliker, Fb Autoliker, Facebook Auto Liker, Autoliker Facebook, Working Auto Liker

  15. What’s Going down i’m new to this, I stumbled upon this I’ve found
    It absolutely helpful and it has aided me out loads.

    I am hoping to give a contribution & help other customers like its helped me.
    Good job.

  16. Nice blog here! Also your website loads up fast! What host are you using?
    Can I get your affiliate link to your host? I wish my web site loaded up as quickly as
    yours lol

  17. ปั๊มไลค์เพจ, ปั้มไลค์เพจ, ไลค์เพจ, เพิ่มไลค์เพจ ราคาถูก, ปั้มไลค์แฟนเพจ, ปั๊มไลค์เพจ facebook, เพิ่มไลค์เพจ, ปั๊มไลค์แฟนเพจ, ปั้มเพจ, เพิ่มไลค์แฟนเพจ, ปั๊มไลค์เพจ

  18. ผู้นำด้านที่ปรึกษาการตลาดออนไลน์ของไทย เพิ่มไลค์ ปั้มไลค์แฟนเพจ รับเพิ่มไลค์แฟนเพจ เพิ่มยอดไลค์ ปั้มไลค์ ปั้มไลค์คนไทย

  19. I’m impressed, I need to say. Actually hardly ever do I encounter a blog that’s each educative and entertaining, and let me let you know, you could have hit the nail on the head. Your thought is outstanding; the problem is something that not sufficient people are talking intelligently about. I am very pleased that I stumbled across this in my search for something referring to this.

  20. I liked up to you’ll receive performed proper here. The cartoon is tasteful, your authored material stylish. nonetheless, you command get bought an nervousness over that you would like be handing over the following. unwell certainly come more in the past once more since precisely the similar nearly very regularly inside case you protect this increase.

  21. Right now it appears like BlogEngine is the best blogging platform out there right now.
    (from what I’ve read) Is that what you’re using on your blog?

  22. hello there and thanks for your info – I’ve certainly picked up anything new from right here. I did alternatively expertise several technical issues the use of this web site, as I skilled to reload the web site many instances previous to I may just get it to load correctly. I have been wondering if your web hosting is OK? Not that I am complaining, however slow loading cases instances will often impact your placement in google and can damage your quality score if advertising and ***********|advertising|advertising|advertising and *********** with Adwords. Well I am adding this RSS to my email and can look out for much extra of your respective fascinating content. Ensure that you replace this again soon..

  23. I’m impressed, I have to say. Actually rarely do I encounter a blog that’s both educative and entertaining, and let me tell you, you’ve hit the nail on the head. Your concept is outstanding; the issue is something that not enough persons are speaking intelligently about. I am very blissful that I stumbled across this in my seek for one thing regarding this.

  24. We are a bunch of volunteers and starting a new scheme in our community.

    Your site offered us with helpful info to work on. You have performed an impressive activity and our whole community shall be grateful to you.

  25. Good day very nice site!! Guy .. Excellent ..
    Superb .. I’ll bookmark your site and take the feeds also?
    I’m happy to seek out a lot of helpful info right here within the
    post, we’d like work out more strategies on this regard, thanks for sharing.
    . . . . .

  26. I was pretty pleased to find this web site. I want to to thank
    you for ones time due to this fantastic read!! I definitely loved every
    little bit of it and i also have you bookmarked to check out new stuff on your web site.

  27. Hi there everyone, it’s my first pay a visit at this site, and piece of writing
    is actually fruitful in support of me, keep
    up posting these types of posts.

  28. Thanks , I’ve just been searching for info approximately this topic
    for ages and yours is the greatest I have found out till
    now. However, what in regards to the bottom line?
    Are you sure in regards to the source?

  29. I loved as much as you will receive carried out right here.
    The sketch is attractive, your authored subject matter stylish.
    nonetheless, you command get bought an edginess over that
    you wish be delivering the following. unwell unquestionably come further formerly
    again since exactly the same nearly a lot often inside case you shield this hike.

  30. I loved as much as you’ll receive carried out right here.

    The sketch is attractive, your authored material stylish.
    nonetheless, you command get got an nervousness over that you wish be
    delivering the following. unwell unquestionably come more
    formerly again as exactly the same nearly a lot often inside case you shield this hike.

  31. You are so awesome! I do not suppose I have read a single thing like
    this before. So nice to discover somebody with some genuine thoughts on this issue.
    Really.. thank you for starting this up. This site is
    one thing that’s needed on the internet, someone with a bit of originality!

  32. Hi, i feel that i saw you visited my weblog thus i got here to “go back the favor”.I’m trying to to find things to enhance my site!I suppose its adequate to make use of some of your concepts!!

  33. I’m not that much of a internet reader to be honest but your blogs really nice, keep it up! I’ll go ahead and bookmark your website to come back down the road. Many thanks

  34. I spent four years trying EVERYTHING in Online Dating, and through a huge amount of trial and error, I produced a system that I will share for you. This book will take you, step by step, through everything you need to know to double, triple or even quadruple the number of women you meet online.

  35. An intriguing discussion will probably be worth comment. I think that you simply write much more about this topic, it might become a taboo subject but generally consumers are inadequate to communicate in on such topics. To another. Cheers

  36. Hello There. I found your blog using msn. This is a really well written article. I?ll be sure to bookmark it and come back to read more of your useful info. Thanks for the post. I?ll certainly return.

  37. Attractive section of content. I just stumbled upon your weblog
    and in accession capital to assert that I get actually enjoyed account your blog posts.
    Any way I will be subscribing to your feeds and even I
    achievement you access consistently quickly.

Leave a Reply

Your email address will not be published.