Olika typer av test doubles (mock/stub-objekt) och hur de kan implementeras
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

Olika typer av test doubles (mock/stub-objekt) och hur de kan implementeras

  • 1,212 views
Uploaded on

Vid automatiserad testning är s.k. test doubles ett viktigt verktyg. Här presenteras olika typer av sådana med exempel på hur de kan implementeras....

Vid automatiserad testning är s.k. test doubles ett viktigt verktyg. Här presenteras olika typer av sådana med exempel på hur de kan implementeras.

Talare är Niklas Lindholm från Appear Networks

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
1,212
On Slideshare
1,211
From Embeds
1
Number of Embeds
1

Actions

Shares
Downloads
1
Comments
0
Likes
0

Embeds 1

http://www.slideshare.net 1

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Test doubles Dummies, stubbar, mockar, spies & fakes Niklas Lindholm Agila Sverige 2010
  • 2. Vad är en test double?
    • Programmeringsvärldens stunt doubles.
    • 3. Gör det möjligt att testa en bit kod i isolation genom att byta ut dess beroenden mot test doubles som kan kontrolleras i testet.
  • 4. Mock-verktyg
    • Mockito (Java)
    • 5. EasyMock (Java)
    • 6. JMock (Java)
    • 7. Rhino.Mocks (.NET)
    • 8. Moq (.NET)
    • 9. Nmock (.NET)
    • Ingen enhetlig terminologi.
    • 10. Ibland är det lättare att själv implementera en test double än att använda ett verktyg.
    • 11. Ibland är det lättare att inte använda test doubles alls utan använda de riktiga beroendena.
  • 12. Stub
    • En stub är preparerad med testspecifika data som den kan returnera om den blir anropad.
    • 13. Man verifierar inte att stuben verkligen blev anropad. Det man verifierar är att klassen man testar gör rätt saker med den data den får från stuben. (S.k. ”state based testing”)
  • 14. Egen stub-implementation @Test public void getMailAdressesForGroup_groupWithUsers_returnsList() throws Exception { UserNotifier userNotifier = new UserNotifier( new UserDbStub(), null ); List<String> adresses = userNotifier.getMailAdressesForGroup( &quot;agroup&quot; ); assertEquals ( &quot;Wrong addresses&quot; , Arrays. asList ( &quot;joe@foo.com&quot; , &quot;bob@bar.org&quot; ), adresses); } private static class UserDbStub implements UserDb { public List<User> getUsersInGroup(String groupName) { return &quot;agroup&quot; .equals(groupName) ? Arrays. asList ( new User( &quot;joe&quot; , &quot;joe@foo.com&quot; ), new User( &quot;bob&quot; , &quot;bob@bar.org&quot; )) : Collections.<User> emptyList (); } }
  • 15. Stub med Mockito @RunWith (MockitoJUnitRunner. class ) public class UserNotifierMockitoTests { @Mock private UserDb userDbStub ; @Test public void getMailAdressesForGroup_groupWithUsers_returnsList() throws Exception { when ( userDbStub .getUsersInGroup( &quot;agroup&quot; )).thenReturn(Arrays. asList ( new User( &quot;joe&quot; , &quot;joe@foo.com&quot; ), new User( &quot;bob&quot; , &quot;bob@bar.org&quot; ))); UserNotifier userNotifier = new UserNotifier( userDbStub , null ); List<String> adresses = userNotifier.getMailAdressesForGroup( &quot;agroup&quot; ); assertEquals ( &quot;Wrong addresses&quot; , Arrays. asList ( &quot;joe@foo.com&quot; , &quot;bob@bar.org&quot; ), adresses); }
  • 16. Mock & Spy
    • Både en mock och en spy används för att verifiera att koden man testar har använt sina beroenden på rätt sätt. (S.k. interaction based testing)
    • 17. Olika definitioner på vad skillnaden är.
    • En spy kommer ihåg hur den blivit anropad så att man kan kontrollera det efteråt.
    • 18. En mock vet i förväg hur den ska bli anropad så att den kan generera ett fel direkt när det inte stämmer.
    Enligt xunitpatterns.com:
  • 19. Egen spy-implementation @Test public void greetUser_validUserName_sendsEmail() { MailSenderSpy mailSenderSpy = new MailSenderSpy(); UserNotifier userNotifier = new UserNotifier( new UserDbStub(), mailSenderSpy); userNotifier.greetUser( &quot;joe&quot; ); assertEquals ( &quot;Wrong email address&quot; , &quot; [email_address] &quot; , mailSenderSpy.getEmailAdress()); } private static class MailSenderSpy implements MailSender { private String emailAdress ; public void sendEmail(String emailAdress) { this . emailAdress = emailAdress; } public String getEmailAdress() { return emailAdress ; } }
  • 20. Mock med Mockito @RunWith (MockitoJUnitRunner. class ) public class UserNotifierMockitoTests { @Mock private UserDb userDbStub ; @Mock private MailSender mailSenderMock ; @Test public void greetUser_validUserName_sendsEmail() throws Exception { when ( userDbStub .getUser( &quot;joe&quot; )).thenReturn( new User( &quot;joe&quot; , &quot;joe@foo.com&quot; )); UserNotifier userNotifier = new UserNotifier( userDbStub , mailSenderMock ); userNotifier.greetUser( &quot;joe&quot; ); verify ( mailSenderMock ).sendEmail( &quot;joe@foo.com&quot; ); } }
  • 21. Fake
    • En fake implementerar logik som simulerar det riktiga beteendet, eller en del av det.
    • 22. Då man inte verifierar interaktionen med en fake kan man se den som en smartare stub.
  • 23. Fake public class MailSenderFake implements MailSender { public void sendEmail(String emailAdress) throws MailSenderException { if (!emailAdress.matches( &quot;[^@]+@[^@]+&quot; )) { throw new InvalidAddressException( &quot;Bad email address: &quot; + emailAdress); } if (emailAdress.endsWith( &quot;.error&quot; )) { throw new CanNotSendMailException( &quot;Failed sending mail to address: &quot; + emailAdress); } } }
  • 24. Dummy
    • En dummy är ett objekt som inte anropas under testet.
    • 25. Den används bara tex som inparameter eller för att verifiera att samma objekt skickas vidare till ett annat beroende.
    • 26. En dummy behöver bara vara av rätt typ.
  • 27. [email_address]