Coverage

  • Statement Coverage (aka Line Coverage)
    • Covers all lines
  • Branch Coverage
    • Covers all branches (both if-else statements)
  • Path Coverage
    • Covers all paths
  • Mutation Coverage
  • Tools:
    • jacoco
    • pitest

Statement Coverage vs Branch Coverage

public int getNameLength(boolean isCoolUser) {
    User user = null;
    if (isCoolUser) {
        user = new John();
    }
    return user.getName().length(); // NPE if user == null
}
  • To Cover all statements: (1 Test case)
    • isCoolUser = true
  • To Cover all branches: (2 Test cases)
    • isCoolUser = true
    • isCoolUser = false
  • It is necessary as you can see that if you don’t cover all the branches then you will get NPE

Simpler example

int fun(int a, int b) {
    if (a > 0) {
        if (b > 0) {
            return 1;
        }
    } else {
        return 2;
    }
}
  • To cover all statements (2 Test cases)
    • a = 10, b = 10
    • a = -1, b = anything
  • To cover all branches (3 Test cases)
    • a = 10, b = 10
    • a = 10, b = -1
    • a = -1, b = anything