Introduction to Software Testing Chapter 5.2 Program-based Grammars Paul Ammann & Jeff Offutt www.introsoftwaretesting.com.

Slides:



Advertisements
Similar presentations
Mutation Testing. Mutation testing is a fault-based testing technique. It has been empirically and theoretically validated that a program will be well.
Advertisements

Paul Ammann & Jeff Offutt
Introduction to Software Testing Chapter 9.2 Challenges in Testing Software – Software Testability Paul Ammann & Jeff Offutt
Introduction to Software Testing Chapter 2.1, 2.2 Overview Graph Coverage Criteria Paul Ammann & Jeff Offutt
Introduction to Software Testing Chapter 5.5 Input Space Grammars Paul Ammann & Jeff Offutt
Introduction to Software Testing Chapter 9.5 Input Space Grammars Paul Ammann & Jeff Offutt
1 Software Testing and Quality Assurance Lecture 9 - Software Testing Techniques.
Introduction to Software Testing Chapter 9.1 Syntax-based Testing Paul Ammann & Jeff Offutt
Debugging and Injecting Course Software Testing & Verification 2014/15 Wishnu Prasetya The debugging part uses Andreas Zeller’s slides. This is extra.
Software Testing Sudipto Ghosh CS 406 Fall 99 November 9, 1999.
Introduction to Software Testing Chapter 5.5 Input Space Grammars Paul Ammann & Jeff Offutt
Introduction to Software Testing Chapter 9.4 Model-Based Grammars Paul Ammann & Jeff Offutt
Software Testing and Validation SWE 434
Introduction to Software Testing Chapter 1 Introduction Paul Ammann & Jeff Offutt
Introduction to Software Testing Chapter 2.4 Graph Coverage for Design Elements Paul Ammann & Jeff Offutt
Kyle Mundt February 3,  Richard Lipton, 1971  A way of testing your tests  Alter your code in various ways  Check to see if tests fail on altered.
© SERG Dependable Software Systems (Mutation) Dependable Software Systems Topics in Mutation Testing and Program Perturbation Material drawn from [Offutt.
Introduction to Software Testing
Software Testing and Maintenance Lecture 4 Graph Coverage for Design Element Paul Ammann & Jeff Offutt Instructor: Hossein Momeni Mazandaran.
Introduction to Software Testing Chapter 8.1 Building Testing Tools –Instrumentation Paul Ammann & Jeff Offutt
SWE 637: Test Criteria and Definitions Tao Xie Prepared based on Slides by ©Paul Ammann and Jeff Offutt Revised by Tao Xie.
Software testing techniques Software testing techniques Mutation testing Presentation on the seminar Kaunas University of Technology.
Test Coverage CS-300 Fall 2005 Supreeth Venkataraman.
637 – Introduction (Ch 1) Introduction to Software Testing Chapter 1 Jeff Offutt Information & Software Engineering SWE 437 Software Testing
Introduction to Software Testing Chapter 9.3 Integration and Object- Oriented Testing Paul Ammann & Jeff Offutt
Introduction to Software Testing Chapter 5.1 Syntax-based Testing Paul Ammann & Jeff Offutt
Syntax-Based Testing Mingzhe Du Hongying Du Dharani Chintapatla.
Introduction to Software Testing Chapter 5.3 Integration and Object-Oriented Testing Paul Ammann & Jeff Offutt
1 Graph Coverage (4). Reading Assignment P. Ammann and J. Offutt “Introduction to Software Testing” ◦ Section
Introduction to Software Testing Chapters 1-5 Coverage Summary Paul Ammann & Jeff Offutt
Introduction to Software Testing Paul Ammann & Jeff Offutt Updated 24-August 2010.
Introduction to Software Testing (2nd edition) Chapter 7.4 Graph Coverage for Design Elements Paul Ammann & Jeff Offutt
Software Testing and Maintenance Lecture 2.1 Overview Graph Coverage
Introduction to Software Testing Chapter 5.3 Integration and Object-Oriented Testing Paul Ammann & Jeff Offutt
Introduction to Software Testing Chapter 5.3 Integration and Object-Oriented Testing Paul Ammann & Jeff Offutt
Software Testing Part II March, Fault-based Testing Methodology (white-box) 2 Mutation Testing.
Software Testing Syntax-based Testing. Syntax Coverage Four Structures for Modeling Software Graphs Logic Input Space Syntax Use cases Specs Design Source.
Introduction to Software Testing Chapter 9.2 Program-based Grammars Paul Ammann & Jeff Offutt
Introduction to Software Testing Chapter 3.1 Logic Coverage Paul Ammann & Jeff Offutt.
Workshop on Integrating Software Testing into Programming Courses (WISTPC14:2) Friday July 18, 2014 Introduction to Software Testing.
Mutation Testing Breaking the application to test it.
Introduction to Software Testing Model-Driven Test Design and Coverage testing Paul Ammann & Jeff Offutt Update.
MUTACINIS TESTAVIMAS Benediktas Knispelis, IFM-2/2 Mutation testing.
Mutation Testing Laraib Zahid & Mariam Arshad. What is Mutation Testing?  Fault-based Testing: directed towards “typical” faults that could occur in.
Is Mutation Analysis Ready for Prime Time? Jeff Offutt George Mason University Based on the book Introduction.
Software Testing and Quality Assurance Practical Considerations (1) 1.
Software Testing and Quality Assurance Syntax-Based Testing (2) 1.
Introduction to Software Testing (2nd edition) Chapter 5 Criteria-Based Test Design Paul Ammann & Jeff Offutt
Paul Ammann & Jeff Offutt
Paul Ammann & Jeff Offutt
Paul Ammann & Jeff Offutt
Paul Ammann & Jeff Offutt
Introduction to Software Testing Chapter 9.2 Program-based Grammars
Mutation Testing Moonzoo Kim School of Computing KAIST
Mutation testing Julius Purvinis IFM-0/2.
Syntax-based Testing CS 4501 / 6501 Software Testing
Introduction to Software Testing Chapter 5.1 Syntax-based Testing
Introduction to Software Testing Chapter 9.2 Program-based Grammars
Paul Ammann & Jeff Offutt
Paul Ammann & Jeff Offutt
Paul Ammann & Jeff Offutt
Introduction to Software Testing Chapter 5.2 Program-based Grammars
Software Testing Syntax-based Testing.
Introduction to Software Testing Chapter 5.1 Syntax-based Testing
Mutation Testing Moonzoo Kim School of Computing KAIST
Introduction to Software Testing Chapter 8.5 Logic Coverage for FSMs
Paul Ammann & Jeff Offutt
Paul Ammann & Jeff Offutt
Mutation Testing Faults are introduced into the program by creating many versions of the program called mutants. Each mutant contains a single fault. Test.
Presentation transcript:

Introduction to Software Testing Chapter 5.2 Program-based Grammars Paul Ammann & Jeff Offutt

Introduction to Software Testing (Ch 5), © Ammann & Offutt 2 Applying Syntax-based Testing to Programs Syntax-based criteria originated with programs and have been used most with programs BNF criteria are most commonly used to test compilers Mutation testing criteria are most commonly used for unit testing and integration testing of classes

Introduction to Software Testing (Ch 5), © Ammann & Offutt 3 Instantiating Grammar-Based Testing Grammar-Based Testing Program-basedIntegrationModel-BasedInput-Based Compiler testing Valid and invalid strings Grammar String mutation Program mutation Valid strings Mutants are not tests Must kill mutants Input validation testing XML and others Valid strings Grammar Test how classes interact Valid strings Mutants are not tests Must kill mutants Includes OO String mutation FSMs Model checking Valid strings Traces are tests String mutation Input validation testing XML and others Invalid strings No ground strings Mutants are tests String mutation 5.2

Introduction to Software Testing (Ch 5), © Ammann & Offutt 4 BNF Testing for Compilers (5.2.1) Testing compilers is very complicated –Millions of correct programs ! –Compilers must recognize and reject incorrect programs BNF criteria can be used to generate programs to test all language features that compilers must process This is a very specialized application and not discussed in detail

Introduction to Software Testing (Ch 5), © Ammann & Offutt 5 Program-based Grammars (5.2.2) The original and most widely known application of syntax-based testing is to modify programs Operators modify a ground string (program under test) to create mutant programs Mutant programs must compile correctly (valid strings) Mutants are not tests, but used to find tests Once mutants are defined, tests must be found to cause mutants to fail when executed This is called “killing mutants”

Introduction to Software Testing (Ch 5), © Ammann & Offutt 6 Killing Mutants If mutation operators are designed well, the resulting tests will be very powerful Different operators must be defined for different programming languages and goals Testers can keep adding tests until all mutants have been killed –Dead mutant : A test case has killed it –Stillborn mutant : Syntactically illegal –Trivial mutant : Almost every test can kill it –Equivalent mutant : No test can kill it (equivalent to original program) Given a mutant m  M for a ground string program P and a test t, t is said to kill m if and only if the output of t on P is different from the output of t on m.

Introduction to Software Testing (Ch 5), © Ammann & Offutt 7 Program-based Grammars Original Method int Min (int A, int B) { int minVal; minVal = A; if (B < A) { minVal = B; } return (minVal); } // end Min With Embedded Mutants int Min (int A, int B) { int minVal; minVal = A; ∆ 1 minVal = B; if (B < A) ∆ 2 if (B > A) ∆ 3 if (B < minVal) { minVal = B; ∆ 4 Bomb (); ∆ 5 minVal = A; ∆ 6 minVal = failOnZero (B); } return (minVal); } // end Min 6 mutants Each represents a separate program Replace one variable with another Changes operator Immediate runtime failure … if reached Immediate runtime failure if B==0 else does nothing

Introduction to Software Testing (Ch 5), © Ammann & Offutt 8 Syntax-Based Coverage Criteria Mutation Coverage (MC) : For each m M, TR contains exactly one requirement, to kill m. Mutation Coverage (MC) : For each m  M, TR contains exactly one requirement, to kill m. The RIP model from chapter 1: Reachability : The test causes the faulty statement to be reached (in mutation – the mutated statement) Infection : The test causes the faulty statement to result in an incorrect state Propagation : The incorrect state propagates to incorrect output The RIP model leads to two variants of mutation coverage …

Introduction to Software Testing (Ch 5), © Ammann & Offutt 9 Syntax-Based Coverage Criteria 1) Strongly Killing Mutants: Given a mutant m  M for a program P and a test t, t is said to strongly kill m if and only if the output of t on P is different from the output of t on m 2) Weakly Killing Mutants: Given a mutant m  M that modifies a location l in a program P, and a test t, t is said to weakly kill m if and only if the state of the execution of P on t is different from the state of the execution of m immediately on t after l Weakly killing satisfies reachability and infection, but not propagation

Introduction to Software Testing (Ch 5), © Ammann & Offutt 10 Weak Mutation Weak Mutation Coverage (WMC) : For each m M, TR contains exactly one requirement, to weakly kill m. Weak Mutation Coverage (WMC) : For each m  M, TR contains exactly one requirement, to weakly kill m. “Weak mutation” is so named because it is easier to kill mutants under this assumption Weak mutation also requires less analysis Some mutants can be killed under weak mutation but not under strong mutation (no propagation) In practice, there is little difference

Introduction to Software Testing (Ch 5), © Ammann & Offutt 11 Weak Mutation Example The complete test specification to kill mutant 1: Reachability : true // Always get to that statement Infection : A ≠ B Propagation: (B < A) = false // Skip the next assignment Full Test Specification : true  (A ≠ B)  ((B < A) = false) ≡ (A ≠ B)  (B ≥ A) ≡ (B > A) (A = 5, B = 3) will weakly kill mutant 1, but not strongly minVal = A; ∆ 1 minVal = B; if (B < A) minVal = B; Mutant 1 in the Min( ) example is:

Introduction to Software Testing (Ch 5), © Ammann & Offutt 12 Equivalent Mutation Example Mutant 3 in the Min() example is equivalent: minVal = A; if (B < A) ∆ 3 if (B < minVal) The infection condition is “(B < A) != (B < minVal)” However, the previous statement was “minVal = A” –Substituing, we get: “(B < A) != (B < A)” Thus no input can kill this mutant

Introduction to Software Testing (Ch 5), © Ammann & Offutt 13 1 boolean isEven (int X) 2 { 3 if (X < 0) 4 X = 0 - X; ∆ 4 X = 0; 5 if (float) (X/2) == ((float) X) / return (true); 7 else 8 return (false); 9 } Strong Versus Weak Mutation Reachability : X < 0 Infection : X != 0 (X = -6) will kill mutant 4 under weak mutation Propagation : ((float) ((0-X)/2) == ((float) 0-X) / 2.0) != ((float) (0/2) == ((float) 0) / 2.0) That is, X is not even … Thus (X = -6) does not kill the mutant under strong mutation

Introduction to Software Testing (Ch 5), © Ammann & Offutt 14 Automated steps Testing Programs with Mutation Input test method Prog Create mutants Run T on P Run mutants: schema-based weak selective Eliminate ineffective TCs Generate test cases Run equivalence detector Threshold reached ? Define threshold no P (T) correct ? yes Fix P no

Introduction to Software Testing (Ch 5), © Ammann & Offutt 15 Why Mutation Works This is not an absolute ! The mutants guide the tester to a very effective set of tests A very challenging problem : –Find a fault and a set of mutation-adequate tests that do not find the fault Of course, this depends on the mutation operators … Fundamental Premise of Mutation Testing If the software contains a fault, there will usually be a set of mutants that can only be killed by a test case that also detects that fault

Introduction to Software Testing (Ch 5), © Ammann & Offutt 16 Designing Mutation Operators At the method level, mutation operators for different programming languages are similar Mutation operators do one of two things: –Mimic typical programmer mistakes ( incorrect variable name ) –Encourage common test heuristics ( cause expressions to be 0 ) Researchers design lots of operators, then experimentally select the most useful Effective Mutation Operators If tests that are created specifically to kill mutants created by a collection of mutation operators O = {o1, o2, …} also kill mutants created by all remaining mutation operators with very high probability, then O defines an effective set of mutation operators

Introduction to Software Testing (Ch 5), © Ammann & Offutt 17 Mutation Operators for Java Each occurrence of one of the arithmetic operators +, -,*, /, and % is replaced by each of the other operators. In addition, each is replaced by the special mutation operators leftOp, and rightOp. 2. AOR –– Arithmetic Operator Replacement: Each arithmetic expression (and subexpression) is modified by the functions abs(), negAbs(), and failOnZero(). 1. ABS –– Absolute Value Insertion: Each occurrence of one of the relational operators (, ≥, =, ≠) is replaced by each of the other operators and by falseOp and trueOp. 3. ROR –– Relational Operator Replacement:

Introduction to Software Testing (Ch 5), © Ammann & Offutt 18 Mutation Operators for Java (2) Each occurrence of one of the logical operators (and - &&, or - ||, and with no conditional evaluation - &, or with no conditional evaluation - |, not equivalent - ^) is replaced by each of the other operators; in addition, each is replaced by falseOp, trueOp, leftOp, and rightOp. 4. COR –– Conditional Operator Replacement: 5. SOR –– Shift Operator Replacement: Each occurrence of one of the shift operators >, and >>> is replaced by each of the other operators. In addition, each is replaced by the special mutation operator leftOp. Each occurrence of one of the logical operators (bitwise and - &, bitwise or - |, exclusive or - ^) is replaced by each of the other operators; in addition, each is replaced by leftOp and rightOp. 6. LOR –– Logical Operator Replacement:

Introduction to Software Testing (Ch 5), © Ammann & Offutt 19 Mutation Operators for Java (3) Each occurrence of one of the assignment operators (+=, -=, *=, /=, %=, &=, |=, ^=, >=, >>>=) is replaced by each of the other operators. 7. ASR –– Assignment Operator Replacement: 8. UOI –– Unary Operator Insertion: Each unary operator (arithmetic +, arithmetic -, conditional !, logical ~) is inserted in front of each expression of the correct type. Each unary operator (arithmetic +, arithmetic -, conditional !, logical~) is deleted. 9. UOD –– Unary Operator Deletion:

Introduction to Software Testing (Ch 5), © Ammann & Offutt 20 Mutation Operators for Java (4) Each variable reference is replaced by every other variable of the appropriate type that is declared in the current scope. 10. SVR –– Scalar Variable Replacement: 11. BSR –– Bomb Statement Replacement: Each statement is replaced by a special Bomb() function.

Introduction to Software Testing (Ch 5), © Ammann & Offutt 21 Subsumption of Other Criteria Mutation is widely considered the strongest test criterion –And most expensive ! Mutation subsumes other criteria by including specific mutation operators Subsumption actually only makes sense for weak mutation – other criteria impose local requirements, like weak mutation –Node coverage –Edge coverage –Clause coverage –General active clause coverage –Correlated active clause coverage –All-defs data flow coverage