What if your tests miss a hidden path that breaks your app in real life?
Why Branch coverage in PyTest? - Purpose & Use Cases
Start learning this pattern below
Jump into concepts and practice - no test required
Imagine testing a simple app feature where decisions happen, like a traffic light controller. You try clicking buttons and watching results manually to check every possible path.
Manually checking each decision path is slow and easy to miss. You might test the green light but forget the red or yellow paths. This leads to bugs slipping through and unhappy users.
Branch coverage automatically tracks which decision paths your tests run. It shows exactly which branches are tested and which are missed, helping you write tests that cover all possibilities.
def test_traffic_light(): assert controller.light == 'green' # only tests one path
def test_traffic_light(): assert controller.light == 'green' assert controller.light == 'red' assert controller.light == 'yellow' # covers all branches
Branch coverage makes sure every decision in your code is tested, so you catch hidden bugs before users do.
In a banking app, branch coverage ensures all loan approval paths are tested, preventing wrong approvals or denials.
Manual testing misses many decision paths.
Branch coverage shows which branches your tests hit.
This leads to stronger, more reliable software.
Practice
What does branch coverage measure in pytest testing?
Solution
Step 1: Understand branch coverage concept
Branch coverage ensures every possible path in decision points (like if-else) is tested.Step 2: Compare with other coverage types
Line coverage counts executed lines, but branch coverage focuses on decision paths.Final Answer:
It checks if all decision paths in the code are tested. -> Option AQuick Check:
Branch coverage = all decision paths tested [OK]
- Confusing branch coverage with line coverage
- Thinking it counts test cases
- Assuming it checks syntax errors
Which pytest command option enables branch coverage measurement?
Solution
Step 1: Recall pytest coverage options
The option--covenables coverage measurement, and--cov-branchadds branch coverage.Step 2: Identify correct combined command
Both options must be used together aspytest --cov --cov-branchto measure branch coverage.Final Answer:
pytest --cov --cov-branch -> Option AQuick Check:
Use --cov with --cov-branch for branch coverage [OK]
- Using only --cov-branch without --cov
- Typing incorrect option names
- Assuming branch coverage is default
Given this code snippet tested with pytest and branch coverage enabled, what is the branch coverage result?
def check_num(x):
if x > 0:
return "Positive"
else:
return "Non-positive"
# Test cases:
assert check_num(5) == "Positive"
Solution
Step 1: Identify branches in the code
The function has two branches: one for x > 0 and one for else (x ≤ 0).Step 2: Check which branches are tested
The test calls check_num(5), which covers only the x > 0 branch, missing the else branch.Final Answer:
50% branch coverage -> Option DQuick Check:
One branch tested out of two = 50% [OK]
- Assuming one test covers all branches
- Confusing line coverage with branch coverage
- Ignoring else branch testing
Identify the error in this pytest test that aims for full branch coverage:
def classify(n):
if n > 10:
return "High"
elif n > 5:
return "Medium"
else:
return "Low"
def test_classify():
assert classify(12) == "High"
assert classify(7) == "Medium"
Solution
Step 1: Analyze branches in classify()
There are three branches: n > 10, n > 5, and else (n ≤ 5).Step 2: Check test coverage of branches
Tests cover n=12 (High) and n=7 (Medium), but no test covers n ≤ 5 (Low) branch.Final Answer:
Missing test for the else branch (n ≤ 5). -> Option CQuick Check:
All branches need tests for full coverage [OK]
- Assuming two tests cover all branches
- Looking for syntax errors where none exist
- Ignoring else branch testing
You have this function. Which set of test inputs achieves 100% branch coverage?
def analyze_score(score):
if score >= 90:
return "A"
elif score >= 75:
return "B"
else:
return "C"
Solution
Step 1: Identify all branches
Branches: score ≥ 90 ("A"), score ≥ 75 ("B"), else "C".Step 2: Check which inputs cover all branches
Input 95 covers "A" branch; 80 covers score ≥ 75 ("B"); 70 covers else "C" branch. This covers all branches.Final Answer:
[95, 80, 70] -> Option BQuick Check:
Test inputs cover all if-elif-else paths [OK]
- Missing coverage for one of the branches
- Choosing inputs that skip else branch
- Assuming close values cover all branches
