Bird
Raised Fist0
JUnittesting~15 mins

Why coverage measures test completeness in JUnit - Automation Benefits in Action

Choose your learning style10 modes available
Verify code coverage reflects test completeness
Preconditions (2)
Step 1: Write a simple Java class with 3 methods: add, subtract, multiply
Step 2: Write JUnit tests that call only add and subtract methods
Step 3: Run tests and generate coverage report
Step 4: Observe coverage percentage and which methods are covered
Step 5: Add a test for multiply method
Step 6: Run tests and generate coverage report again
Step 7: Compare coverage reports before and after adding multiply test
✅ Expected Result: Initial coverage report shows coverage for add and subtract only, missing multiply. After adding multiply test, coverage report shows 100% coverage of all methods, demonstrating test completeness.
Automation Requirements - JUnit 5
Assertions Needed:
Assert coverage report includes add and subtract methods after first test run
Assert coverage report includes multiply method after second test run
Assert coverage percentage increases after adding multiply test
Best Practices:
Use descriptive test method names
Use assertions to verify expected outputs
Run coverage tool automatically after tests
Keep tests independent and focused
Automated Solution
JUnit
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;

class Calculator {
    public int add(int a, int b) {
        return a + b;
    }

    public int subtract(int a, int b) {
        return a - b;
    }

    public int multiply(int a, int b) {
        return a * b;
    }
}

public class CalculatorTest {

    Calculator calculator = new Calculator();

    @Test
    void testAdd() {
        assertEquals(5, calculator.add(2, 3));
    }

    @Test
    void testSubtract() {
        assertEquals(1, calculator.subtract(3, 2));
    }

    // Uncomment this test to increase coverage
    /*
    @Test
    void testMultiply() {
        assertEquals(6, calculator.multiply(2, 3));
    }
    */
}

/*
Instructions:
1. Run tests with only testAdd and testSubtract active.
2. Generate coverage report using Jacoco or similar.
3. Observe multiply method is not covered.
4. Uncomment testMultiply method.
5. Run tests and generate coverage report again.
6. Observe coverage is now 100%.
*/

This code defines a simple Calculator class with three methods: add, subtract, and multiply.

The test class CalculatorTest has tests for add and subtract methods initially. The multiply test is commented out.

When you run tests and generate a coverage report, only add and subtract methods are covered, so coverage is partial.

After uncommenting the multiply test and rerunning, coverage report shows all methods covered, reaching 100% coverage.

This demonstrates how coverage measures test completeness by showing which parts of code are tested.

Common Mistakes - 3 Pitfalls
{'mistake': 'Not running coverage tool after tests', 'why_bad': "Without running coverage, you can't see which code is tested or missed.", 'correct_approach': 'Always run coverage tool after tests to get accurate coverage data.'}
Testing only some methods and assuming full coverage
Ignoring coverage reports
Bonus Challenge

Now add data-driven tests for add method with 3 different input pairs

Show Hint

Practice

(1/5)
1. What does code coverage measure in JUnit testing?
easy
A. The memory used during testing
B. How much of the code is executed by tests
C. The number of test cases written
D. The speed of test execution

Solution

  1. Step 1: Understand the meaning of coverage

    Coverage shows which parts of the code are run when tests execute.
  2. Step 2: Relate coverage to test completeness

    Higher coverage means more code is tested, indicating more complete tests.
  3. Final Answer:

    How much of the code is executed by tests -> Option B
  4. Quick Check:

    Coverage = executed code portion [OK]
Hint: Coverage = code run by tests, not test count [OK]
Common Mistakes:
  • Confusing coverage with test speed
  • Thinking coverage counts test cases
  • Assuming coverage measures memory use
2. Which JUnit annotation is used to mark a method as a test to be included in coverage?
easy
A. @Test
B. @AfterEach
C. @BeforeAll
D. @Ignore

Solution

  1. Step 1: Identify JUnit test method annotation

    The @Test annotation marks methods as test cases to run.
  2. Step 2: Understand coverage relation

    Only methods run as tests contribute to coverage measurement.
  3. Final Answer:

    @Test -> Option A
  4. Quick Check:

    @Test marks test methods [OK]
Hint: Look for @Test to include method in coverage [OK]
Common Mistakes:
  • Using @BeforeAll as test method
  • Confusing @Ignore with test execution
  • Thinking @AfterEach runs tests
3. Given this JUnit test code snippet, what is the coverage result for method calculate?
public class Calculator {
  public int calculate(int x) {
    if (x > 0) return x * 2;
    else return 0;
  }
}

@Test
public void testCalculatePositive() {
  Calculator c = new Calculator();
  assertEquals(4, c.calculate(2));
}
medium
A. 50% coverage of calculate method
B. 100% coverage of calculate method
C. 0% coverage of calculate method
D. 75% coverage of calculate method

Solution

  1. Step 1: Analyze test input and branches

    The test calls calculate(2), which triggers the if branch (x > 0).
  2. Step 2: Check coverage of else branch

    The else branch (return 0) is never executed, so not covered.
  3. Final Answer:

    50% coverage of calculate method -> Option A
  4. Quick Check:

    One branch covered, one not = 50% [OK]
Hint: Test all branches for full coverage [OK]
Common Mistakes:
  • Assuming one test covers all branches
  • Ignoring else branch coverage
  • Confusing coverage with test success
4. Identify the problem in this JUnit test that causes incomplete coverage of method isValid:
public boolean isValid(int n) {
  if (n > 0) return true;
  else return false;
}

@Test
public void testIsValid() {
  assertTrue(isValid(1));
}
medium
A. Test method missing @Test annotation
B. Test uses assertTrue incorrectly
C. Method isValid has syntax error
D. Test does not check negative input branch

Solution

  1. Step 1: Review test input coverage

    The test only calls isValid(1), covering the positive branch.
  2. Step 2: Check missing branch coverage

    The negative or zero input branch (else) is not tested, causing incomplete coverage.
  3. Final Answer:

    Test does not check negative input branch -> Option D
  4. Quick Check:

    Missing else branch test = incomplete coverage [OK]
Hint: Test all input types to cover branches [OK]
Common Mistakes:
  • Assuming one positive test covers all
  • Thinking assertTrue usage affects coverage
  • Ignoring missing @Test annotation
5. You have a method with multiple conditions:
public String classify(int age) {
  if (age < 13) return "child";
  else if (age < 20) return "teen";
  else return "adult";
}
To achieve 100% coverage, which set of test inputs should you include in your JUnit tests?
hard
A. 0, 12, 20
B. 10, 18
C. 5, 15, 25
D. 15, 25

Solution

  1. Step 1: Identify all branches in classify method

    There are three branches: age < 13, 13 ≤ age < 20, and age ≥ 20.
  2. Step 2: Select test inputs covering all branches

    Inputs 5 (child), 15 (teen), and 25 (adult) cover all branches fully.
  3. Final Answer:

    5, 15, 25 -> Option C
  4. Quick Check:

    One input per branch = full coverage [OK]
Hint: Test one value per branch for full coverage [OK]
Common Mistakes:
  • Missing one branch input
  • Using boundary values without covering all branches
  • Assuming fewer tests cover all cases
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard