Chapter 13
Software Testing Strategies
CHAPTER OVERVIEW AND COMMENTS
This chapter discusses a strategic approach to software testing that is applicable to most software development projects. The recommended process begins unit testing, proceeds to integration testing, then validation testing, and finally system testing.
13.1 A Strategic Approach to Software Testing
Testing is the process of exercising a program with the specific intent of finding errors prior to delivery to the end user.
What Testing Shows
Who Tests the Software?
All s/w testing strategies provide the s/w developer with a template for testing and all have the following generic characteristics:
13.1.1 Verification and Validation
Verification refers to the set of activities that ensure that S/W correctly implements a specific function.
Validation refers to the set of activities that ensure that the S/W has been built is traceable to customer requirements.
Verification: Are we building the product right?
Validation: Are we building the right product?
The definition of Verification and Validation encompasses many of the activities that are encompassed by S/W Quality assurance (SQA).
Testing does provide the last fortress from which quality can be assessed and more pragmatically, errors can be uncovered.
Testing should not be viewed as a safety net that will catch all errors that occurred b/c of weak S/W eng. practices. Stress quality and error detection throughout the S/W process.
13.1.2 Organizing for Software Testing
For every S/W project, there is an inherent conflict of interest that occurs as testing begins. Programmers that built the S/W are asked to test it.
Unfortunately, these developers have a vested interest in demonstrating that the program is error free and work perfectly according to the customer’s req.
An independent test group does not have the conflict that builders of the S/W might experience.
There are often a number of misconceptions that can be erroneously inferred from the preceding discussion:
These aforementioned statements are incorrect.
The role of an Independent Test Group (ITG) is to remove inherent problems associated with letting the builder test the S/w that has been built.
The ITG and S/W eng. Work closely throughout a S/W project to ensure that thorough tests are conducted.
13.2 Strategic Issues
Testing Strategy
Specify product req. in a quantifiable manner long before testing commences “Portability, maintainability, and usability.”
State testing objectives explicitly “test effectiveness, test coverage, mean time to failure, etc.”
Understand the users of the software and develop a profile for each user category. Build use-cases.
Develop a testing plan that emphasizes “rapid cycle testing.” Feedback generated from rapid-cycle tests can be used to control quality levels and the corresponding test strategies.
Build “robust” software that is designed to test itself.
Use effective formal technical reviews as a filter prior to testing.
Conduct formal technical reviews to assess the test strategy and test cases themselves.
Develop a continuous improvement approach for the testing process. The test strategy should be measured by using metrics.
13.3 Test strategies for Traditional Software
13.3.1 Unit Testing
Both black-box and white-box testing techniques have roles in testing individual software modules.
Unit Testing focuses verification effort on the smallest unit of S/W design.
Unit Testing Consideration
Unit Test Considerations:
Module interface is tested to ensure that information properly flows into and out of the program unit under test.
Local data structures are examined to ensure that data stored temporarily maintains its integrity.
All independent paths through the control structure are exercised to ensure that all statements in a module have been executed at least once.
All error handling paths are tested.
If data do not enter and exit properly, all other tests are moot.
Comparison and control flow are closely coupled. Test cases should uncover errors such as
Boundary testing is essential. S/W often fails at its boundaries. Test cases that exercise data structure, control flow, and data values just below, at, and just above maxima and minima are very likely to uncover errors.
Error handling: when error handling is evaluated, potential errors should be tested:
Unit Test Procedures
Because a component is not a stand-alone program, driver and/or stub S/W must be developed for each unit test.
In most applications, a driver is nothing more than a “main program” that accepts test case data, passes such data to the component, and prints relevant results.
Stubs serve to replace modules that are subordinate to the component to be tested. A stub “dummy program” uses the subordinate module’s interface, may do minimal data manipulation, provides verification of entry, and returns control to the module undergoing testing.
13.3.2 Integration Testing Strategies
Section 13.3.2 focuses on integration testing issues. Integration testing often forms the heart of the test specification document. Don't be dogmatic about a "pure" top down or bottom up strategy. Rather, emphasize the need for an approach that is tied to a series of tests that (hopefully) uncover module interfacing problems.
Options:
Integration Testing is a systematic technique for constructing the S/W architecture while at the same time conducting tests to uncover errors associated with interfacing. The objective is to take unit tested components and build a program structure that has been dictated by design.
Top-down Integration
Top-down Integration testing is an incremental approach to construction of the S/W arch.
Modules are integrated by moving downward through the control hierarchy, beginning with the main control module (main program).
Modules subordinate to the main control module are incorporated into the structure in either depth-first or breadth-first manner.
Depth-first integration integrates all components on a major control path of the program structure. Selection of a major path is somewhat arbitrary and depends on application-specific characteristics.
Breadth-first integration incorporates all components directly subordinate at each level, moving across the structure horizontally.
The integration process is performed in a series of 5 steps:
The process continues from step 2 until the entire program structure is built.
Top-down strategy sounds relatively uncomplicated, but, in practice, logistical problems can arise.
Bottom-down Integration
Bottom-down Integration testing begins construction testing with atomic modules.
The Bottom-down Integration strategy may be implemented with the following steps:
Regression testing
Regression testing is the re-execution of some subset of tests that have already been conducted to ensure that changes have not propagated unintended side effects.
Regression testing is the activity that helps to ensure that changes do not introduce unintended behavior or additional errors.
The regression test suite contains three different classes of test cases:
Smoke Testing
Smoke Testing: is integration testing approach that is commonly used when S/W products are being developed.
A common approach for creating “daily builds” for product software
Smoke testing steps:
Smoke testing provides a number of benefits when it is applied on complex, time critical S/W projects.
13.4 Test Strategies for Object-Oriented Software
This section clarifies the differences between OOT and conventional testing with regard to unit testing and integration testing. The key point to unit testing in an OO context is that the lowest testable unit should be the encapsulated class or object (not isolated operations) and all test cases should be written with this goal in mind.
Given the absence of a hierarchical control structure in OO systems integration testing of adding operators to classes is not appropriate.
13.4.1 Unit Testing in the OO Context
An encapsulated class is the focus of unit testing; however, operations within the class and the state behavior of the class are the smallest testable units.
Class testing for OO S/W is analogous to module testing for conventional S/W. It is not advisable to test operations in isolation.
13.4.2 Integration Testing in the OO Context
An important strategy for integration testing of OO S/W is thread-based testing. Threads are sets of classes that respond to an input or event. Use-based tests focus on classes that do not collaborate heavily with other classes.
Thread-based testing integrates the set of classes required to respond to one input or event for the system. Each thread is integrated and tested individually.
Use-Based testing begins the construction of the system by testing those classes (called independent classes) that use very few server (if any) classes.
Next, the dependent classes, which use independent classes, are tested.
This sequence of testing layers of dependent classes continues until the entire system is constructed.
Cluster testing is one-step in the integration testing of OO S/W. a cluster of collaborating classes is exercised by designing test cases that attempt to uncover errors in the collaborations.
13.5 Validation Testing
In this section validation testing is described as the last chance to catch program errors before delivery to the customer. If the users are not happy with what they see, the developers often do not get paid. The key point to emphasize is traceability to requirements. In addition, the importance of alpha and beta testing (in product environments) should be stressed.
High Order Testing
Validation Test Criteria:
Focus is on software requirements. A test plan outlines the classes of tests to be conducted, and a test procedure defines specific test cases. Both the plan and procedure are designed to ensure that all functional req. are satisfied, all behavioral characteristics are achieved, and all performance req. are attained, documentation is correct, and usability and other req. are met.
Configuration Review:
It is important to ensure that the elements of the S/W configuration have been properly developed.
Alpha/Beta testing:
The focus is on customer usage.
The alpha-test is conducted at the developer’s site by end-users. The S/W is used in natural setting with the developer “looking over the shoulder” of typical users and recording errors and usage problems. Alpha tests are conducted in a controlled environment.
The beta-test is conducted at the end-users sites. The developer is generally not present. Beta test is a live application of the S/W in an environment that cannot be controlled by the developer. The end-user records errors and all usage problems encountered during the test and the list is reported to the developer. Then S/W engineers make modifications and then prepare for release of S/W product to the entire customer base.
13.6 System Testing
The focus is on system integration. “Like death and taxes, testing is both unpleasant and inevitable.”
System Testing is a series of different tests whose primary purpose it to fully exercise the computer-based system. The following are the types of system tests:
13.6.1 Recovery Testing
Forces the software to fail in a variety of ways and verifies that recovery is properly performed. “Data recovery”
13.6.2 Security Testing
It verifies that protection mechanisms built into a system will, in fact, protect it from improper penetration.
Beizer “The system’s security must, of course, be tested for invulnerability from frontal attack-but must also be tested for invulnerability from flank or rear attack.” “Social Engineering”
13.6.3 Stress Testing
It executes a system in a manner that demands resources in abnormal quantity, frequency, or volume.
For example:
A variation of stress testing is a technique called sensitivity testing. They attempt to uncover data combinations within valid input classes that may cause instability or improper processing.
13.6.4 Performance Testing
It tests the run-time performance of software within the context of an integrated system.
Performance tests are coupled with stress testing and usually require both H/W and S/W instrumentation. “Processing Cycle, log events”
13.7.1 The Debugging Process
Debugging occurs as a consequence of successful testing. That is, when a test case uncovers an error, debugging is an action that results in the removal of the error.
Debugging is not testing but occurs as a consequence of testing. Debugging process begins with the execution of a test case.
Results are assessed and a lack of correspondence between expected and actual performance is encountered. In many cases, the non-corresponding data are a symptom of an underlying cause as yet hidden. Debugging attempts to match symptom with cause, thereby leading to error correction.
Debugging will always have one of two outcomes:
Why is debugging so difficult?
13.7.2 Psychological Considerations
It appears that debugging prowess is an innate human trait. Although it may be difficult to learn how to debug, a number of approaches to the problem can be proposed.
Three debugging strategies have been proposed:
Each of these strategies can be conducted manually, but modern tools can make the process much more effective.
Brute force is probably the most common and least efficient method for isolating the cause of a software error. Using a “let the computer find the error”, memory dumps, run-time traces, and loading the program with output statements.
Although the mass of information may ultimately lead to success, it more frequently leads to wasted effort and time.
Backtracking: Beginning at the site where a symptom has been uncovered, the source code is traced backwardly until the site of the cause is found. The larger the program, the harder is to find the problem.
Cause elimination: it is maintained by induction or deduction and introduces the concept of binary partitioning. Data related to the error occurrence are organized to isolate potential causes.
A “cause hypothesis” is devised, and the aforementioned data are used to prove or disprove the hypothesis. Alternatively, a list of all possible causes is developed, and tests are conducted to eliminate each.
It initial tests indicate that a particular cause hypothesis shows promise; data are refined in an attempt to isolate the bug.
Source: https://www2.southeastern.edu/Academics/Faculty/galkadi/285/notes/Chapter13.doc
Web site to visit: https://www2.southeastern.edu/
Author of the text: indicated on the source document of the above text
If you are the author of the text above and you not agree to share your knowledge for teaching, research, scholarship (for fair use as indicated in the United States copyrigh low) please send us an e-mail and we will remove your text quickly. Fair use is a limitation and exception to the exclusive right granted by copyright law to the author of a creative work. In United States copyright law, fair use is a doctrine that permits limited use of copyrighted material without acquiring permission from the rights holders. Examples of fair use include commentary, search engines, criticism, news reporting, research, teaching, library archiving and scholarship. It provides for the legal, unlicensed citation or incorporation of copyrighted material in another author's work under a four-factor balancing test. (source: http://en.wikipedia.org/wiki/Fair_use)
The information of medicine and health contained in the site are of a general nature and purpose which is purely informative and for this reason may not replace in any case, the council of a doctor or a qualified entity legally to the profession.
The texts are the property of their respective authors and we thank them for giving us the opportunity to share for free to students, teachers and users of the Web their texts will used only for illustrative educational and scientific purposes only.
All the information in our site are given for nonprofit educational purposes