Stefan Lieser
Wer erstellt regelmäßig Unit Tests?
Wer kennt seine Testabdeckung?
Wer erstellt Tests um Bugs zu reproduzieren?
Wer erstellt Tests vor der Implementierung ?
TDD
Test Driven Development
Test First
Revolution!
Zeit TestCode
Test = hinterher
Sprache formt das Denken
Sapir-Whorf Hypothese
?
BDD
Behavior Driven Development
Evolution
Specification First
Test Specification
Testen?
Das machen die Tester!
Das kostet zu viel Zeit!
Mein Code ist fehlerfrei!
Dafür sind wir da!
Sollen wir arbeitslos werden?
Ihr habt keine Ahnung!
TDD Entwicklung
Tests für vorhandenen Code
Vertrauen
Reduktion
Dokumentation
Offenbarung
Verhalten
Mockups
User Stories
Als Shopbenutzer möchte ich Bücher in meinen Warenkorb legen um meine Bestellung besser überblicken zu können.
Who What Why
Role Gole Motivation
Technologie
Business Domain
Sprache der Domain verwenden
Business und Technik verwenden die selbe Sprache! It‘s all behavior
Gegeben ein MessageBoardController Wenn die Index Action aufgerufen wird und wenn 10 Nachrichten vorhanden sind Dann sollen die 5 neusten Nachrichten aus dem Repository ermittelt werden
Gegeben ein Nachrichten System Wenn es dargestellt wird Dann zeigt es die 5 neusten Nachrichten
Als Benutzer des Nachrichten Systems möchte ich die 5 neusten Nachrichten sehen damit die Nachrichten auf meinen Bildschirm passen
BDD = Automatisierte Akzeptanztests
Unit Tests: Der Code ist richtig. Akzeptanztests: Es ist der richtige Code.
Syntax
Assert.AreEqual(5, x); Assert.That(x, Is.EqualTo(5)); x.ShouldBeEqualTo(5); x.should_be_equal_to(5);
Arrange/Act/Assert
Setup/Exercise/Verify
[TestFixture] public class ClassicalTDD { private I Service Service; private AuftragsAbwicklung auftragsAbwicklung; private IAuftrag auftrag; [Test] public void AuftragsAbwicklung_sendet_ _wenn_der_Auftrag_ausgeliefert_wird() { // Arrange Service = MockRepository.GenerateMock (); auftrag = MockRepository.GenerateStub (); auftragsAbwicklung = new AuftragsAbwicklung( Service); // Act auftragsAbwicklung.Liefern(auftrag); // Assert Service.AssertWasCalled(x => x.Send()); auftrag.AssertWasCalled(x => x.Ausgeliefert()); }
Context/Specification
[Concern(typeof(AuftragsAbwicklung))] public class Wenn_ein_Auftrag_ausgeliefert_wird : InstanceContextSpecification { private I Service Service; private IAuftrag auftrag; protected override void establish_context() { Service = dependency (); auftrag = dependency (); } protected override AuftragsAbwicklung create_sut() { return new AuftragsAbwicklung( Service); } protected override void because() { sut.Liefern(auftrag); } [Observation] public void wird_eine_ _gesendet() { Service.was_told_to(x => x.Send()); } [Observation] public void wird_der_Auftrag_in_den_Status_Ausgeliefert_versetzt() { auftrag.was_told_to(x => x.Ausgeliefert()); }
BDD Frameworks
JP Boodhoo xunit.bddextensions (Björn Rochel) SpecUnit (Scott Bellware)
NBehave (Dan North) enthält Behave# und NSpec MSpec (Aaron Jensen)
Bildnachweis Sonstige/Zafira_Crash_Test.jpg