for test factoring
play

for Test Factoring David Saff, Michael D. Ernst MIT CSAIL PASTE, - PowerPoint PPT Presentation

Mock Object Creation for Test Factoring David Saff, Michael D. Ernst MIT CSAIL PASTE, 2004 June 2/24 Motivation Continuous testing plug-in for the Eclipse IDE* Test suite: 30 secs 1 sec / plug-in test Set up Eclipse Problem:


  1. Mock Object Creation for Test Factoring David Saff, Michael D. Ernst MIT CSAIL PASTE, 2004 June

  2. 2/24 Motivation • Continuous testing plug-in for the Eclipse IDE* • Test suite: 30 secs 1 sec / plug-in test Set up Eclipse • Problem: find out about errors faster • Solution: mock objects to replace Eclipse framework * Saff, Ernst, ETX 2004: Continuous testing in Eclipse

  3. 3/24 Outline • Mock objects introduced • Test factoring introduced • Mock object creation for test factoring • Conclusion

  4. 4/24 Outline • Mock objects introduced • Test factoring introduced • Mock object creation for test factoring • Conclusion

  5. 5/24 Unit test for plug-in Provided Checked Plug-in

  6. 6/24 System Test for plug-in Provided Checked Plug-in Eclipse

  7. 7/24 Unit Test with Mock Object Provided Checked Provided Provided Checked Checked Plug-in Provided Checked Mock Objects replacing Eclipse A mock object: • provides part of the functionality of the original object(s) • is focused on allowing the test to proceed

  8. 8/24 Mock objects for our example • Using a debugger, determined: – 147 static calls from plug-in to framework • Defined on 49 classes – 8 callbacks from framework to plug-in • Substantial work to define mock objects. • How well can we automate this process without additional manual effort?

  9. 9/24 Outline • Mock objects introduced • Test factoring introduced • Mock object creation for test factoring • Conclusion

  10. 10/24 What is a factored test? • Split a system test into several smaller factored tests that – exercise less code than system test – can be added to the suite and prioritized • Find out about errors faster – embody assumptions about future code changes

  11. 11/24 Pros and cons of factored tests • Pro : factored test should be faster if system test – is slow – requires an expensive resource or human interaction • Pro : isolates bugs in subsystems • Con : if assumptions about how developer will change the code are violated, can lead to: – false negatives: OK, some delay – false positives: bad, distract developer

  12. 12/24 Change language Change language: the set of tolerated changes db.insertRecord(“alice”, “617”); db.insertRecord(“bob”, “314”); Change method order? Replace with equivalent call? db.insertRecord(“bob”, “314”); db.insertRecords( db.insertRecord(“alice”, “617”); “alice: 617, bob: 314” ); • When change language is violated, factored test must be discarded and re-created – Can detect violation through analysis, or incorrect result.

  13. 13/24 A small catalog of test factorings • Like refactorings, test factorings can be catalogued, reasoned about, and automated Separate Sequential Code: Also “Unroll Loop”, “Inline Method”, etc. to produce sequential code

  14. 14/24 A small catalog of test factorings Plug-in Introduce Mock: Mocked Eclipse Original test Mocked Plug-in Eclipse

  15. 15/24 Related work Early warning if assumptions hold Developer makes change Produce Run Run This work factored original factored (static + tests tests tests dynamic) Correct test results Slice Run based on factored Binkley ’97 tests change (static)

  16. 16/24 Outline • Mock objects introduced • Test factoring introduced • Mock object creation for test factoring • Conclusion

  17. 17/24 Basic Procedure: Trace Capture Tested Realm “Boundary” Params, Returns, Callbacks Mocked Realm MockExpectations

  18. 18/24 Basic Procedure: code generation • MockExpectations encodes a state machine: MockExpectations 0 DebugPlugin.getDefault() → [object id 347] 1 [object id 347] .getLaunchManager() → [object id 78] 2 [object id 78] . uniqueLaunchNameFrom(“a”) → “a134” 3

  19. 19/24 Expanding the change language • Current tolerated change language includes: – Extract method – Inline method • Using static analysis on mocked code, improve the procedure to include: – Reorder calls to independent objects – Add or remove calls to pure methods

  20. 20/24 Reorder calls to independent objects • Group objects that share state into state sets • One MockExpectations per state set: MockExpectations A MockExpectations B 0 1 2 3 0 1 2 3 MockExpectations C 0 1 2 3

  21. 21/24 Add or remove pure method calls • Allow reordering, addition, removal of calls to pure methods: MockExpectations 0 DebugPlugin.getDefault() → [object id 347] [object id 347] .getLaunchManager() → [object id 78] [object id 78] . uniqueLaunchNameFrom(“a”) → “a134” [object id 78] . removeLaunch(“a134”) → NEXT STATE 1

  22. 22/24 Outline • Mock objects introduced • Test factoring introduced • Mock object creation for test factoring • Conclusion

  23. 23/24 Future work • Develop a framework for test factoring • Implement the “Implement Mock” factoring • Analytic evaluation of framework – Capture real-project change data* – Measure notification time, false positives • Case studies of test factoring in practice – How do developers feel about the feedback they receive? * Saff, Ernst, ISSRE 2003: Reducing wasted development time via continuous testing

  24. 24/24 Conclusion • Test factoring can indicate errors earlier • “Introduce Mock” is an important test factoring for complicated systems • We propose: – Dynamic analysis for building mock objects – Static analysis for increasing the change language • Mail: saff@mit.edu

  25. 25/24

  26. 26/24 A small catalog of test factorings • Separate Sequential Test: – [graphic] • Unroll Loop: – [graphic] • Introduce Mock: – [graphic]

  27. 27/24 Frequent testing is good: • Frequent manual testing in agile methodologies • Frequent automatic testing in continuous testing . • A testing framework should minimize the cost of frequent testing – Suite completes rapidly – First failing test completes rapidly

  28. 28/24 Getting faster to the first failing test • Default: B1 B2 A1 A2 A3 • Test selection: A1 A2 A3 • Test prioritization: A2 A1 B2 B1 A3 • Test factoring: A2’ A1’ B2’ B1’ A3’ A2 A1 B2 B1 …

  29. 29/24 Dynamic, change-independent test factoring • Dynamic: instrument and run the original test • Change-independent: factoring happens before any changes are made. – Requires a hypothesized change language • Binkley ’97: Static, change -dependent test factoring

  30. 30/24 Automatic test factoring: change-dependence • Change-dependent test factoring: – After tested code is changed, generate new tests with same result as old tests for that change . Better • Change-independent test factoring: – Before tested code is changed, generate new tests that have the same result as old tests for some set of changes.

  31. 31/24 Automatic test factoring: static vs. dynamic analysis • Static analysis (Binkley ’97) – Analyze code to determine mock object behavior – Well-suited for change-dependent factoring – May fail • without source • when dependent on file system or user interaction – Guaranteed change language may be restrictive • Dynamic analysis (this work) – Instrument and run the original test, gather logs – May run original test after factored test fails

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend