320 likes | 359 Views
Learn the role of unit testing, testing strategies, black box and white box methods, limits of testing, and various coverage methods. Explore example programs and understand mutation testing.
E N D
Unit Testing CSSE 376, Software Quality Assurance Rose-Hulman Institute of Technology March 27, 2007
Outline • Role of unit testing • Testing strategies • Black box methods • White box methods
Role of Unit Testing • Assure minimum quality of units before integration into system • Focus attention on relatively small units • Marks end of development step
Limits of Testing • Testing can never demonstrate the absence of errors • Exhaustive testing is infeasible • Testing may be done imperfectly
Strategies for Unit Testing • Black box • use only specification of program • test implementation against its specification • White box • use structure or other properties of a program to generate tests
Black Box Methods • Equivalence partitioning • Boundary value analysis
White Box Methods • Coverage • statement • branch • path • Cyclomatic • Dataflow • Mutation • Error Based
Coverage Methods • Statement • execute each statement • Branch • execute each branch • Path • execute each path
Statement Coverage • Execute each statement in the program • Considered minimum criterion for most unit testing • May be difficult to achieve for error cases
Example Program 1: if (a < 0) { 2: return 0 } 3: r = 0; 4: c = a; 5: while (c > 0) { 6: r = r + b; 7: c = c - 1; } 8: return r;
Statement Tests a = 3, b = 4 executes 1, 3, 4, 5, 6, 7, 5, 6, 7, 5, 6, 7, 5, 8 a = -3, b = 2 executes 1, 2
Branch Coverage • Execute each branch of the program at least once • Differs from statement coverage only for "if" statements without "else"s and case statements without default cases.
Dataflow Testing • More than branch coverage, but less than path coverage • Uses information about references to variables to select paths
Definitions and Uses • Defining node • input statement • lhs of assignment • Usage node • output statement • rhs of assignment • control statement
Suspicious Paths • Variable is defined (set to a new value) but never referenced • Variable is referenced but never defined • Variable is defined twice before it is used
DU Paths • Definition-use (du) path wrt V: a path containing a defining node for V at the beginning a usage node for V at the end, and no def's or use's in between • DU testing: execute each du-path of each variable
Example Program 1: if (a < 0) { 2: return 0 } 3: r = 0; 4: c = a; 5: while (c > 0) { 6: r = r + b; 7: c = c - 1; } 8: return r;
Example DU Paths(corrected 3/28/07) Def (c) = {4, 7} Use (c) = {5, 7} Def (r) = {3, 6} Use (r) = {6, 8} du-paths for c: 4 - 5, 7 – 5 du-paths for r: 3 - 4 - 5 - 6, 6 - 7 - 5 - 6, 3 - 4 - 5 - 8,6 - 7 - 5 - 8
Test Cases for DU Paths (corrected 3/28/07) a = 2 1 - 3 - 4 - 5 - 6 - 7 - 5 - 6 - 7 - 5 - 8 Covers du-paths: 4 - 5, 7 - 5, 3 - 4 - 5 - 6, 6 - 7 - 5 - 6
Mutation Testing(As Applied to White-Box) • Path testing exercises the control of a program, not the computations along the paths • Most programs under test are "almost" right
Mutation Method • Pre-process program to generate mutants • Execute all the mutants and the original program • If a mutant differs from the original, then it is "killed" • If all mutants are killed, then test set is adequate.
Example Program function square( x: integer): integer; begin square := x * x end
Example Mutant function square( x: integer): integer; begin square := x + x end
Executing Mutants • Test set {2} does not kill the mutant • Test set {2, 4} does kill the mutant, and it reveals the flaw in the program
Which Mutants? • Examples: • Off by one errors (i+1, i, i-1) • Different variable (i, j, k)
Assumptions ofMutation Testing • Competent Programmer: The perfect program is very close to the program under test • Oracle Hypothesis: You know the output for any input • Continuity: Every complicated mistake can be caught by looking for simple mistakes.
Problems with Mutation • Very expensive • each test runs the whole program • many mutants for every program • Some mutants fail to halt • May be difficult to detect when a mutant is really just an equivalent program • Not reliable: may not try the right mutants