import pytest
class Calculator:
def add(self, a, b):
# Bug: returns wrong sum intentionally
return a + b + 1
def subtract(self, a, b):
return a - b
def multiply(self, a, b):
return a * b
def divide(self, a, b):
if b == 0:
raise ValueError("Cannot divide by zero")
return a / b
# Unit tests
@pytest.mark.unit
def test_add_bug():
calc = Calculator()
result = calc.add(2, 3)
assert result == 5, f"Expected 5 but got {result}"
@pytest.mark.unit
def test_subtract():
calc = Calculator()
assert calc.subtract(5, 3) == 2
# Integration test
@pytest.mark.integration
def test_multiply_divide_bug():
calc = Calculator()
mul = calc.multiply(4, 5) # 20
# Bug: divide returns wrong result if multiply used before
# Simulate bug by altering divide to return wrong value if mul was called
# For demo, we simulate bug by forcing wrong divide result
divide_result = mul / 0 # This will raise ZeroDivisionError to simulate bug
assert divide_result == 4, f"Expected 4 but got {divide_result}"
# System test
@pytest.mark.system
def test_ui_display_bug():
# Simulate UI display bug by checking displayed result string
displayed_result = "Result is 9" # Bug: should be 8
expected_display = "Result is 8"
assert displayed_result == expected_display, f"UI display bug: expected '{expected_display}' but got '{displayed_result}'"This test script uses pytest to automate testing at different levels.
The Calculator class has a bug in the add method (returns sum + 1).
Unit tests check individual functions like add and subtract. The test_add_bug test will fail because of the bug.
Integration test test_multiply_divide_bug simulates a bug when combining multiply and divide. It intentionally causes a division by zero error to represent a bug caught at integration level.
System test test_ui_display_bug simulates a UI display bug by comparing expected and actual displayed strings.
Using @pytest.mark decorators helps separate tests by level for clarity and selective running.