public int returnInput(int input, boolean condition1, boolean condition2, boolean condition3) {
int x = input;
int y = 0;
if (condition1)
x++;
if (condition2)
x--;
if (condition3)
y=x;
return y;
}
Statement coverage
In order to execute every statement we need only one testcase which would set all conditions to true, every line of a code (statement) is touched.
shouldReturnInput(x, true, true, true) - 100% statement covered
But only half of branches are covered and only one path.
Branch coverage
You can visualize every "if-statment" as two branches (true-branch and false-branch). So it can clearly be seen that the above testcase follows only "true-branches" of every "if-statement". Only 50% of branches are covered.
In order to cover 100% of branches we would need to add following testcase:
shouldReturnInput(x, false, false, false)
With these two testcases we have 100% statements covered, 100% branches covered
Path coverage
Nevertheless there is still a concept of path coverage. In order to understand path coverage it is good to visualize the above code in a form of a binary tree

As you probably see the above two testcases cover only two paths t-t-t and f-f-f while in fact there are 8 separate paths:
1-2-3
t -t -t - covered with testcase 1
t -t -f
t -f -t
t -f -f
f -t -t
f -t -f
f -f -t
f -f -f - covered with testcase 2
omg, this is crystal clear. Thank you!
OdpowiedzUsuń