automated t esting of refactoring engines
play

Automated T esting of Refactoring Engines Brett Daniel Danny Dig - PowerPoint PPT Presentation

Automated T esting of Refactoring Engines Brett Daniel Danny Dig Kely Garcia Darko Marinov ESEC/FSE 2007 Refactoring engines are tools that automate the application of refactorings 2 Eclipse and NetBeans 3 Why T est Refactoring


  1. Automated T esting of Refactoring Engines Brett Daniel Danny Dig Kely Garcia Darko Marinov ESEC/FSE 2007

  2. Refactoring engines are tools that automate the application of refactorings 2

  3. Eclipse and NetBeans 3

  4. Why T est Refactoring Engines? ● Widely used ● Complex – Complex inputs: programs – Require nontrivial program analyses and transformation ● Can silently corrupt large bodies of code Refactoring engines contain bugs 4

  5. Example: Encapsulate Field Replaces all field reads and writes with accesses through getter and setter methods class A { class A { 5 int f; private int f; Encapsulate void m( int i) { void m( int i) { Field f = i * f; setF(i * getF()); 4 3 } } } 2 void setF( int f) { this .f = f; } 1 int getF() { return f; } } 5

  6. Eclipse Bug class A { class A { private int f; int f; } void setF( int f) { this .f = f; } int getF() { Encapsulate return this .f; Field } } class B extends A { class B extends A { void m() { void m() { super .getF() = 0; super .f = 0; } } } } super .setF(0); 6

  7. NetBeans Bug class A { class A { int f; private int f; void setF( int f) { this .f = f; } int getF() { Encapsulate return this .f; Field } void m() { void m() { ( new A().f) = 0; ( new A().f) = 0; } } } } new A().setF(0); 7

  8. T esting a Refactoring Engine Program Refactored Refactoring Program Engine Refactoring Warnings Warning Warning 8

  9. State of the Practice ● Manually written tests – Input: Program files and code to invoke refactoring – Output: Hand-refactored program file or warnings ● Automatically executed tests – Eclipse 3.2 has over 2,600 manually-written JUnit tests – NetBeans 6.0M3 has 252 XT est tests 9

  10. Automated T esting ● Goal: Automate input generation and output checking ● Assumptions – T ester has intuition for input programs that might expose bugs ● e.g. Encapsulating inherited fields – It is labor-intensive to manually write many input programs ● e.g. Thousands of ways to reference an inherited field 10

  11. Challenges ● How to “codify” the tester's intuition to create many interesting programs ● How to automatically check that refactoring completes correctly 11

  12. Solution ● Developed ASTGen – Framework for generating abstract syntax trees – Provides library of generators that produce simple AST fragments – T ester writes complex generators composed of smaller generators ● Developed variety of oracles 12

  13. ASTGen Design Goals ● Imperative – T ester can control how to build complex data ● Iterative – Generates inputs lazily, saving memory ● Bounded-Exhaustive – Catches “corner cases” ● Composable – T ester can create complex generators by reusing simpler parts 13

  14. T esting Process ● T ester builds a generator using ASTGen ● T ester instantiates the generator for the test at hand. ● T ester runs generator in a loop. For each generated value: – Run refactoring – Check oracles 14

  15. T esting Encapsulate Field String fieldName = "f"; IGenerator<Program> testGen = new ...(fieldName); for (Program in : testGen) { Refactoring r = new EncapsulateFieldRefactoring(); r.setTargetField(fieldName); Program out = r.performRefactoring(in); checkOracles(out); }

  16. Example Generator ● Double-class field reference generator “Produces pairs of classes related by containment and inheritance. One class declares a field, and the other references the field in some way.” class A { class A { class A { int f; boolean f; int f; } } class B { ... class B extends A { class B { void m() { void m() { void m() { int i = f; super .f = 0; new A().f = true ; } } } } } } } 16

  17. Example Generator “Produces pairs of classes related by containment and inheritance. One class declares a field, and the other references the field in some way.” class A { class A { class A { int f; boolean f; int f; } } class B { ... class B extends A { class B { void m() { void m() { void m() { int i = f; super .f = 0; new A().f = true ; } } } } } } } 17

  18. Example Generator “Produces pairs of classes related by containment and inheritance. One class declares a field, and the other references the field in some way.” class A { class A { class A { int f; boolean f; int f; } } class B { ... class B extends A { class B { void m() { void m() { void m() { int i = f; super .f = 0; new A().f = true ; } } } } } } } 18

  19. Example Generator “Produces pairs of classes related by containment and inheritance. One class declares a field, and the other references the field in some way.” class A { class A { class A { int f; boolean f; int f; } } class B { ... class B extends A { class B { void m() { void m() { void m() { int i = f; super .f = 0; new A().f = true ; } } } } } } } 19

  20. Example Generator “Produces pairs of classes related by containment and inheritance. One class declares a field, and the other references the field in some way.” class A { class A { class A { int f; boolean f; int f; } } class B { ... class B extends A { class B { void m() { void m() { void m() { int i = f; super .f = 0; new A().f = true ; } } } } } } } 20

  21. Composing Generators class A { void m() { Containment class A { class B {} Generator class A {} class B {} } class B {} } } ... × Inheritance class A {} class A {} Generator class B {} class B extends A {} ... × Field Declaration int f; boolean f; public char f; ... Generator × Field Reference f this .f this .A.f new A().f super .f ... Generator 21

  22. Invalid Combinations ● Composition may be invalid class A { class A extends B { class A extends B {} + = class B {} class B {} class B {} } } ● Three solutions – T ester writes filter that verifies values – Dependent generators depends on super .f int f; – Delegate to compiler 22

  23. Oracles ● Check that the program was refactored correctly ● Challenges – Don't know expected output – Semantic equivalence is undecidable – Need to verify that correct structural changes were made 23

  24. Oracles ● DoesCrash – Engine throws exception ● DoesNotCompile (DNC) – Refactored program does not compile ● WarningStatus (WS) – Engine cannot perform refactoring – Presence or lack of WarningStatus may indicate bug 24

  25. Oracles ● Inverse (I) – Refactorings are invertible – Check that a refactoring is undone by its inverse – ASTComparator: Compares normalized AST s ● Custom (C) – Check for desired structural changes ● Differential (Diff) – Perform refactoring in both Eclipse and NetBeans 25

  26. Case Study ● T ested Eclipse and NetBeans ● Eight refactorings – T arget field, method, or class ● Wrote about 50 generators ● Reported 47 new bugs ● Compared effectiveness of oracles 26

  27. Generator Evaluation Bugs Refactoring Generator Inputs Time (m:ss) Ecl NB ClassArrayField 72 0:45 1 0 FieldReference 1512 15:19 4 3 EncapsulateField DoubleClassFieldRef. 3969 41:45 1 2 SingleClassTwoFields 48 1:16 1 0 DoubleClassGetterSetter 417 8:45 3 3 ClassRelationships 1:02 0 0 Rename(Class) 88 MethodReference Rename(Method) 9540 89:12 0 0 Rename(Field) FieldReference 1512 28:20 0 1 Rename(Field) DoubleClassFIeldRef. 3969 76:55 0 0 ... ... ... ... ... ... Total 21 26 ● Generation and compilation time less than refactoring time and oracles ● Human time: T ook about two workdays to produce MethodReference – Reused many generators 27

  28. Oracle Evaluation WS DNC Bugs C/I Diff Refactoring Generator Ecl NB Ecl NB Ecl NB ClassArrayField 0 0 48 0 0 48 1 0 FieldReference 0 0 320 432 14 121 4 3 EncapsulateField DoubleClassFieldRef 0 0 187 256 100 511 1 2 SingleClassTwoFields 0 0 0 0 48 15 1 0 DoubleClassGetterSetter 216 0 162 162 18 216 3 3 Rename(Class) 0 0 0 0 0 0 0 0 ClassRelationships Rename(Method) MethodReference 0 0 0 0 0 0 0 0 Rename(Field) FieldReference 0 0 0 304 0 40 0 1 Rename(Field) DoubleClassFieldRef. 0 0 0 0 0 0 0 0 ... ... ... ... ... ... ... ... 21 26 Total ● DoesNotCompile found the most bugs ● WarningStatus, Inverse, and Differential can give false positives ● Many input programs exhibit same bug 28

  29. Results ● 47 new bugs reported – 21 in Eclipse: 20 confirmed by developers – 26 in NetBeans: 17 confirmed, 3 fixed, 5 duplicates, 1 won't fix – Found others, but did not report duplicate or fixed ● Currently working with NetBeans developers to include ASTGen in testing process 29

  30. Related Work ● Grammar-based test data generation P . Purdom 1972 – P . M. Maurer 1990 – E. G. Sirer and B. N. Bershad 1999 – B. A. Malloy and J. F . Power 2001 – ● Declarative, bounded-exhaustive generation C. Boyapati, S. Khurshid, and D. Marinov 2002 – S. Khurshid and D. Marinov 2004 – R. Lämmel and W. Schulte 2006 – ● QuickCheck K. Claessen and J. Hughes 2000 – 30

  31. Future Work ● More refactorings ● Apply ASTGen to other program analyzers ● Removal of redundant tests, bug targeting ● Reduce or eliminate false alarms – Improved AST Comparator 31

  32. Conclusions ● Despite their popularity, refactoring engines contain bugs ● ASTGen allows one to create many interesting AST s ● We reported 47 new bugs http://mir.cs.uiuc.edu/astgen/ 32

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