270 likes | 285 Views
Chapter 9, Testing. Terminology. Reliability: The measure of success with which the observed behavior of a system confirms to some specification of its behavior. Failure: Any deviation of the observed behavior from the specified behavior.
E N D
Terminology • Reliability: The measure of success with which the observed behavior of a system confirms to some specification of its behavior. • Failure: Any deviation of the observed behavior from the specified behavior. • Error: The system is in a state such that further processing by the system will lead to a failure. • Fault (Bug): The mechanical or algorithmic cause of an error. There are many different types of errors and different ways how we can deal with them.
Faults in the Interface specification Mismatch between what the client needs and what the server offers Mismatch between requirements and implementation Algorithmic Faults Missing initialization Branching errors (too soon, too late) Missing test for nil Mechanical Faults (very hard to find) Documentation does not match actual conditions or operating procedures Errors Stress or overload errors Capacity or boundary errors Timing errors Throughput or performance errors Examples of Faults and Errors
How to Deal with Errors • Error prevention(Fault Avoidance) - before system is released: • Use good programming methodology to reduce complexity • Use version control to prevent inconsistent system (configuration mgmt) • Apply verification to prevent algorithmic bugs • Review of code by inspection team • Error detection (Fault detection) - while system is running: • Testing: Create failures in a planned way • Debugging: Start with an unplanned failures • Monitoring: Deliver information about state. Find performance bugs • Error recovery (Fault Tolerance) - recover from failure while system is running: • Data base systems (atomic transactions) • Modular redundancy • Recovery blocks
Some Observations • It is impossible to completely test any nontrivial module or any system • Theoretical limitations: Halting problem • Practial limitations: Prohibitive in time and cost • Testing can only show the presence of bugs, not their absence (Dijkstra) • Often more effective to have independent tester • Programmer often sticks to the data set that makes the program work • A program often does not work when tried by somebody else. • Don’t let this be the end-user!
Testing Activities Requirements Analysis Document Subsystem Code Requirements Analysis Document Unit System Design Document T est Tested Subsystem User Manual Subsystem Code Unit T est Integration Tested Subsystem Functional Test Test Functioning System Integrated Subsystems Tested Subsystem Subsystem Code Unit T est All tests by developer
Testing Activities ctd Client’s Understanding of Requirements User Environment Global Requirements Accepted System Validated System Functioning System Performance Acceptance Installation Test Test Test Usable System Tests by client Tests by developer User’s understanding System in Use Tests (?) by user
Quality Assurance encompasses Testing Quality Assurance Usability Testing Scenario Testing Prototype Testing Product Testing Fault Avoidance Fault Tolerance Atomic Transactions Modular Redundancy Verification Configuration Management Fault Detection Reviews Debugging Walkthrough Inspection Testing Correctness Debugging Performance Debugging Integration Testing System Testing Component Testing
Testing Concepts • Component – part of system that can be isolated for testing • Test case – set of inputs and expected results that tries to cause failures and detect faults • Black box tests – input/output behavior of component • White box tests – internal structure of component • Test stub – partial implementation of components on which the tested component depends • Test driver – partial implementation of a component that depends on the tested component
Testing Concepts (cont) • Correction – a change made to a component, to repair a fault • A correction can introduce new faults! Then what? • Problem Tracking • Documentation of every failure, error, and fault • Used with configuration management to find the new faults • Regression testing • After a change, re-execute all prior tests to ensure that previously working functionality has not been affected • Rationale Maintenance • Documentation of rationale of the change • Developers can avoid new faults by reviewing assumptions and rationales of the other developers
Component Testing • Unit Testing: • Individual subsystem • Carried out by developers • Goal: Confirm that each subsystem is correctly coded and carries out the intended functionality • Integration Testing: • Groups of subsystems (collection of classes) and eventually the entire system • Carried out by developers • Goal: Test the interfaces among the subsystems
System Testing • System Testing: • The entire system • Carried out by developers • Goal: Determine if the system meets the requirements (functional and global) • Acceptance Testing: • Evaluates the system delivered by developers • Carried out by the client. May involve executing typical transactions on site on a trial basis • Goal: Demonstrate that the system meets customer requirements and is ready to use • Implementation (Coding) and testing go hand in hand
Unit Testing • Informal: • Incremental coding • Static Analysis: • Hand execution: Reading the source code • Walk-Through (informal presentation to others) • Code Inspection (formal presentation to others) • Automated Tools checking for • syntactic and semantic errors • departure from coding standards • Dynamic Analysis: • Black-box testing (Test the input/output behavior) • White-box testing (Test the internal logic of the subsystem or object) • Data-structure based testing (Data types determine test cases)
Black-box Testing • Focus: I/O behavior. If for any given input, we can predict the output, then the module passes the test. • Almost always impossible to generate all possible inputs ("test cases") • Need to reduce number of test cases: • Equivalence Testing • Divide input conditions into equivalence classes • Choose test cases for each equivalence class. (Example: If all negative inputs should behave the same, just test one negative) • Boundary Testing • Special case of equivalence testing • Select elements from the “edges” of equivalence classes • Developers often overlook special cases at the boundary • Example: use of >= instead of >
White-box Testing • Focus: Thoroughness (Coverage). Every statement in the component is executed at least once. • Path testing • Exercise all possible paths through a piece of code • Start with flow graph, and graph all possible paths (including all choices at branch statements and loops) • Limitation: Doesn’t always detect things that are missing. • State-based testing • Focuses more on object-oriented systems • Derive test cases with start state, transition stimuli, and expected end state • Difficulty: must include sequences to put system in desired start state before transitions are tested
1 2 3 4 5 6 7 8 9 White-box Testing Example: Determining the Paths • FindMean (FILE ScoreFile) • { float SumOfScores = 0.0; • int NumberOfScores = 0; • float Mean=0.0; float Score; • Read(ScoreFile, Score); • while (! EOF(ScoreFile)) { • if (Score > 0.0 ) { • SumOfScores = SumOfScores + Score; • NumberOfScores++; • } • Read(ScoreFile, Score); • } • /* Compute the mean and print the result */ • if (NumberOfScores > 0) { • Mean = SumOfScores / NumberOfScores; • printf(“ The mean score is %f\n”, Mean); • } else • printf (“No scores found in file\n”); • }
White-box Testing: White-box testing often tests what is done, instead of what should be done Cannot detect missing use cases Black-box Testing: Potential combinatorial explosion of test cases (valid & invalid data) Often not clear whether the selected test cases uncover a particular error Does not discover extraneous use cases ("features") Both types of testing are needed White-box testing and black box testing are the extreme ends of a testing continuum. Comparison of White & Black-box Testing