In software testing, there are many paths between the entry and exit of a software program. So it’s difficult to fully test all paths of even a simple unit. This is a challenge when we design test cases. We need to eliminate redundant tests by providing adequate test coverage for effective testing. One of the ways to do so, we can apply a method called basis path testing.
First of all, basis path testing is a white box method for designing test cases. The method was first proposed by McCabe in 1980's. It is a hybrid of path testing and branch testing methods. Path testing is designed to execute all or selected paths through a computer program. And branch testing is designed to execute each outcome from each decision point in a computer program. Thus, basis path testing analyzes the control flow graph of the program and uses McCabe Cyclomatic complexity to determine the number of independent paths to generate test cases for each path. It guarantees complete branch coverage (all control flow graphs’ edges), but without covering all possible control flow graphs.
The principle behind basis path testing is that all independent paths of the program have to be tested at least once. Below are the steps of this technique:
- Draw a control flow graph.
- Determine Cyclomatic complexity.
- Find a basis set of paths.
- Generate test cases for each path.
Step 1: Draw a control flow graph
Basic control flow graph structures:
On a control flow graph, we can see that:
Arrows or edges represent flows of control.
- Circles or nodes represent actions.
- Areas bounded by edges and nodes are called regions.
- A predicate node is a node containing a condition.
Below is an example of control flow graph:
Step 2: Determine Cyclomatic complexity
Cyclomatic complexity is a software metric used to indicate the complexity of a program. It is a measure of the number of linearly independent paths.
There are several different methods to calculate Cyclomatic complexity:
1. Cyclomatic complexity = edges - nodes + 2p
Where p = number of unconnected parts of the graph.
From the example in Step 1we see that the graph has 8 edges and7 nodes, and the number of unconnected parts of the graph is 1 so the Cyclomatic complexity = 8-7+ 2*1= 3.
2. Cyclomatic complexity= Number of Predicate Nodes + 1
From the example in Step 1, we can redraw it as below to show predicate nodes clearly:
As we see, there are two predicate nodes in the graph. So the Cyclomatic complexity = 2+1= 3.
3. Cyclomatic complexity =number of regions in the control flow graph
Follow our example, we have three regions in the control flow graph as below
So the Cyclomatic complexity = 3.
Step 3: Find a basis set of paths
The Cyclomatic complexity tells us the number of paths to evaluate for basis path testing. In the example, we have 3 paths, and our basis set of paths is:
Path 1: 1, 2, 3, 5, 6, 7.
Path 2: 1, 2, 4, 5, 6, 7.
Path 3: 1, 6, 7.
Step 4: Generate test cases for each path
After determining the basis set of path, we can generate the test case for each path. Usually we need at least one test case to cover one path. In the example, however, Path 3 is already covered by Path 1 and 2 so we only need to write 2 test cases.
In conclusion, basis path testing helps us to reduce redundant tests. It suggests independent paths from which we write test cases needed to ensure that every statement and condition can be executed at least one time.