Ich glaube es ist kein Geheimnis, das ich mich immer schwer getan habe Unit Tests konsequent anzuwenden. Die Vorteile wie von vielen Leuten angepriesen sind mir nicht wirklich als solche Erschienen. Mein Problem war immer das ich kein Gefühl dafür entwickelt habe was und vor allem, bis in welche Tiefe ich testen sollte. Ich habe mich dabei ertappt Unit Tests zu schreiben die mittlerweile komplexer waren als das eigentliche Projekt. Selbst das Lesen verschiedener Bücher wie z.B. xUnit Test Patterns: Refactoring Test Code hat mir nichts gebracht. (Anmerkung: Das Buch kann ich absolut nicht empfehlen, nicht mal als Nachschlagewerk). Kurz, ich hatte kein Gefühl dafür was ein guter Unit Test ist und was nicht.

Insofern habe ich mir einfach mal Zeit genommen und einen Haufen anderen Test-Code angeschaut. Vielmehr durch Zufall bin ich von den Test-Code des Projektes Mass Transit zu verschiedenen Blog Posts gestolpert und siehe da, es gab da etwas was mein Interesse geweckt hat. Behavior Driven Development, genauer gesagt wie dort mit Tests verfahren wird.

Hier die Blog Posts die ich meine:

Getting started with BDD style Context/Specification base naming

Refining Context / Specification BDD using Rhino Mocks 3.5

Jan van Ryswyck’s Implementierung habe ich nun als Grundlage genommen um das ganze mal an einem kleinen Demo Projekt zu testen.

shot1

Die Tests lassen sich nun folgendermaßen lesen:

When_retrieving_customer_orders_from_repository_for_customer_ALFKI

  • Then_should_have_at_least_one_order
  • Then_should_be_able_to_get_a_list_of_all_products
  • Then_should_be_able_to_add_a_new_order_with_positions_and_persist_it
  • Then_should_be_able_to_update_an_existing_order
  • Then_should_be_able_to_delete_the_first_order
  • Then_should_be_able_to_update_company_name

Um die Ansicht von Klasse (Context) und TestMethode hierarchisch zu bekommen, muss man in Visual Studio nach der Spalte Class Name gruppieren.

shot2

Mittlerweile hat die Beta von Resharper 4.5 auch eine direkte Integration von MSTest.

shot3 shot4

Das Schreiben der Tests in Bezug auf das Verhalten und dessen Kontext wird nun etwas sein was ich versuchen werde auf meinen zukünftigen Code anzuwenden. Mal schauen wie praktikabel das auf Dauer sein wird.