mockist vs classicists tdd
TRANSCRIPT
● „London School“: Steve Freeman, Nat Pryce
● XP 2000 paper „Endo-Testing: Unit Testing with Mock Objects “
● OOPSLA 2004 „Mock Roles, not Objects“
● „Growing Object Oriented Software“ #GOOS 2009
MOCKISTS
● Problem Zu viele integrierte Tests => Isoliert testen
● Mocks [& Interfaces]
● Behaviour Verification
● Outside-In Design
MOCKISTS
Weniger Mocks,
• nur an Prozessgrenze
• mehr Integrierte Tests
Design
• bottom up vs emergent
CLASSICISTS
Akzeptanztest
1. Pass the Tests
2. Reveal Intention & No Duplication
3. Fewest Elements
4 RULES OF
SIMPLE DESIGN
"BeckDesignRules", Martin Fowler
Akzeptanztest
1. Pass the Tests
2. Reveal Intention & No Duplication
3. Fewest Elements
4 RULES OF
SIMPLE DESIGN
aufwendiges Setup
Fehlerfindung
# Testfällen
Langsames Feedback
Refactorability sinkt
Isolationsaufwand
Zu wenig Nutzen
Lesbarkeit
TRADE-OFF
ZU GROSS vs ZU KLEIN
INTEGRATION OPERATION
SEGREGATION PRINCIPLE
"Integration Operation Segregation Principle", Ralf Westphal "Die kniffligen Fälle beim Testen - Sichtbarkeit", Stefan Lieser
INTEGRATION OPERATION
SEGREGATION PRINCIPLE public void sendMailingTo(String email) {
Customer customer = customerDB.findCustomerBy(email); String title = customer.getSex() == Sex.MALE ? "Mr" : customer.getMaritialStatus() == MaritialStatus.MARRIED ? "Mrs" : "Ms"; String content = "Hello " + title + ". " + customer.getName() + ",\n\n" + "We have a special offer for you.\n\n" + "Best regards,\n" + "ACME Customer Service"; mailService.sendMail(email, content);
}
public void sendMailingTo(String email) {
Customer customer = customerDB.findCustomerBy(email); String title = customer.getSex() == Sex.MALE ? "Mr" : customer.getMaritialStatus() == MaritialStatus.MARRIED ? "Mrs" : "Ms"; String content = "Hello " + title + ". " + customer.getName() + ",\n\n" + "We have a special offer for you.\n\n" + "Best regards,\n" + "ACME Customer Service"; mailService.sendMail(email, content);
}
INTEGRATION OPERATION
SEGREGATION PRINCIPLE
public void sendMailingTo(String email) {
Customer customer = customerDB.findCustomerBy(email); String title = customer.getSex() == Sex.MALE ? "Mr" : customer.getMaritialStatus() == MaritialStatus.MARRIED ? "Mrs" : "Ms"; String content = "Hello " + title + ". " + customer.getName() + ",\n\n" + "We have a special offer for you.\n\n" + "Best regards,\n" + "ACME Customer Service"; mailService.sendMail(email, content);
}
INTEGRATION OPERATION
SEGREGATION PRINCIPLE
public void sendMailingTo(String email) {
Customer customer = customerDB.findCustomerBy(email); String content = renderContent(customer); mailService.sendMail(email, content);
} private String renderContent(Customer customer) {
String title = customer.getSex() == Sex.MALE ? "Mr" : customer.getMaritialStatus() == MaritialStatus.MARRIED ? "Mrs" : "Ms"; return "Hello " + title + ". " + customer.getName() + ",\n\n" + "We have a special offer for you.\n\n" + "Best regards,\n" + "ACME Customer Service";
}
INTEGRATION OPERATION
SEGREGATION PRINCIPLE
public void sendMailingTo(String email) {
Customer customer = customerDB.findCustomerBy(email); String content = renderContent(customer); mailService.sendMail(email, content);
} private String renderContent(Customer customer) {
String title = customer.getSex() == Sex.MALE ? "Mr" : customer.getMaritialStatus() == MaritialStatus.MARRIED ? "Mrs" : "Ms"; return "Hello " + title + ". " + customer.getName() + ",\n\n" + "We have a special offer for you.\n\n" + "Best regards,\n" + "ACME Customer Service";
}
TESTS?
N Unittests
public void sendMailingTo(String email) {
Customer customer = customerDB.findCustomerBy(email); String content = renderContent(customer); mailService.sendMail(email, content);
} private String renderContent(Customer customer) {
String title = customer.getSex() == Sex.MALE ? "Mr" : customer.getMaritialStatus() == MaritialStatus.MARRIED ? "Mrs" : "Ms"; return "Hello " + title + ". " + customer.getName() + ",\n\n" + "We have a special offer for you.\n\n" + "Best regards,\n" + "ACME Customer Service";
}
TESTS? 1 Integrierter Test
N Unittests
PUSH LOGIC
DOWN THE STACK
Siehe "The Failures of “Intro to TDD”" - Justin Searls
public String signup(String username) throws Exception {
if(userDB.findUserBy(username) == null) { userDB.createUser(new User(username)); return "Welcome " + username;
} else { return "Username ' " + username + "' " + "already taken, please choose another";
} }
BEDINGTE
INTERAKTION
DESIGN
ALGORITHMUS
if (unsicher) Emergent
else if (drittsys) Inside-Out
else if (isoliert) Outside-In Mockist
else Outside-In Fake-It
DESIGN
ALGORITHMUS
if (unsicher) Emergent
else if (drittsys) Inside-Out
else if (isoliert) Outside-In Mockist
else Outside-In Fake-It
DESIGN
ALGORITHMUS
if (unsicher) Emergent
else if (drittsys) Inside-Out
else if (isoliert) Outside-In Mockist
else Outside-In Fake-It
DESIGN
ALGORITHMUS
if (unsicher) Emergent
else if (drittsys) Inside-Out
else if (isoliert) Outside-In Mockist
else Outside-In Fake-It
SCHULEN
if (unsicher) Emergent
else if (drittsys) Inside-Out
else if (isoliert) Outside-In MOCKIST
else Outside-In Fake-It
CLASSICIST
QUELLEN
• "Growing Object Oriented Systems", Nat Pryce, Steve Freeman
• "Mocks Aren't Stubs", Martin Fowler
• "Integration Operation Segregation Principle", Ralf Westphal
• „Die kniffligen Fälle beim Testen – Sichtbarkeit“, Stefan Lieser
• "The Failures of “Intro to TDD”" Justin Searls