Bird
Raised Fist0
PyTesttesting~15 mins

Approximate comparisons (pytest.approx) - Build an Automation Script

Choose your learning style10 modes available
Verify approximate equality of floating point calculations using pytest.approx
Preconditions (2)
Step 1: Call the function or perform the calculation that returns a floating point result
Step 2: Use pytest.approx to compare the result with the expected value allowing a small tolerance
Step 3: Assert that the actual result is approximately equal to the expected value using pytest.approx
✅ Expected Result: The test passes if the actual floating point result is within the allowed tolerance of the expected value
Automation Requirements - pytest
Assertions Needed:
Assert that actual floating point value is approximately equal to expected value using pytest.approx
Best Practices:
Use pytest.approx for floating point comparisons instead of exact equality
Avoid hardcoding very tight tolerances unless necessary
Write clear assertion messages if needed
Automated Solution
PyTest
import pytest

def calculate_area(radius: float) -> float:
    # Simple area calculation for a circle
    return 3.141592653589793 * radius * radius

def test_calculate_area_approx():
    radius = 2.0
    expected_area = 12.566370614359172  # pi * 2^2
    actual_area = calculate_area(radius)
    assert actual_area == pytest.approx(expected_area, rel=1e-9), f"Expected area approx {expected_area}, got {actual_area}"

This test defines a simple function calculate_area that returns a floating point number.

The test test_calculate_area_approx calls this function with a radius of 2.0 and stores the result.

It then asserts that the actual area is approximately equal to the expected area using pytest.approx with a relative tolerance of 1e-9.

This approach handles small floating point differences gracefully, avoiding false failures due to tiny rounding errors.

Common Mistakes - 3 Pitfalls
Using exact equality (==) to compare floating point numbers
Setting the tolerance in pytest.approx too tight or too loose without reason
Not importing pytest or pytest.approx before using it
Bonus Challenge

Now add data-driven testing with 3 different radius inputs and verify approximate area calculations for each.

Show Hint

Practice

(1/5)
1. What is the main purpose of using pytest.approx in tests?
easy
A. To compare floating-point numbers allowing small differences
B. To check if two strings are exactly the same
C. To test if a function raises an exception
D. To verify if a list contains a specific element

Solution

  1. Step 1: Understand floating-point comparison issues

    Floating-point numbers can have tiny differences due to rounding, so exact equality often fails.
  2. Step 2: Role of pytest.approx

    pytest.approx allows tests to pass if numbers are close within a tolerance, avoiding false failures.
  3. Final Answer:

    To compare floating-point numbers allowing small differences -> Option A
  4. Quick Check:

    Approximate comparison = floating-point tolerance [OK]
Hint: Use approx for floats, not exact matches [OK]
Common Mistakes:
  • Using == for floats causing flaky tests
  • Confusing approx with exception testing
  • Using approx for string comparisons
2. Which of the following is the correct syntax to assert that result is approximately equal to 3.14 using pytest.approx?
easy
A. assert result == pytest.approx[3.14]
B. assert result == approx(3.14)
C. assert result = pytest.approx(3.14)
D. assert result == pytest.approx(3.14)

Solution

  1. Step 1: Identify correct usage of pytest.approx

    The correct syntax uses the function call form: pytest.approx(value).
  2. Step 2: Check assertion syntax

    Assertions use '==' to compare, '=' is assignment and brackets [] are invalid here.
  3. Final Answer:

    assert result == pytest.approx(3.14) -> Option D
  4. Quick Check:

    Use '==' and parentheses with pytest.approx [OK]
Hint: Use '==' and parentheses with pytest.approx [OK]
Common Mistakes:
  • Using '=' instead of '==' in assert
  • Calling approx without pytest prefix if not imported
  • Using square brackets instead of parentheses
3. What will be the result of this test code?
def test_value():
    value = 0.1 + 0.2
    assert value == pytest.approx(0.3)
medium
A. Test passes because 0.1 + 0.2 is exactly 0.3
B. Test fails due to floating-point precision error
C. Test passes because pytest.approx allows small differences
D. SyntaxError because pytest.approx is used incorrectly

Solution

  1. Step 1: Understand floating-point addition

    0.1 + 0.2 is not exactly 0.3 due to floating-point precision limits.
  2. Step 2: Effect of pytest.approx in assertion

    pytest.approx allows a small tolerance, so the assertion passes despite tiny difference.
  3. Final Answer:

    Test passes because pytest.approx allows small differences -> Option C
  4. Quick Check:

    Floating-point sum ≈ 0.3 passes with approx [OK]
Hint: Use approx to handle float rounding errors [OK]
Common Mistakes:
  • Assuming 0.1 + 0.2 equals exactly 0.3
  • Expecting test to fail without approx
  • Thinking pytest.approx causes syntax errors
4. Identify the error in this test code snippet:
def test_approx():
    result = 1.0001
    assert result == pytest.approx(1.0, rel=0.00001)
medium
A. The relative tolerance is too small, causing test to fail
B. pytest.approx does not accept rel parameter
C. The assertion syntax is incorrect
D. The variable result should be an integer

Solution

  1. Step 1: Check relative tolerance meaning

    rel=0.00001 means allowed difference is 0.00001 * 1.0 = 0.00001.
  2. Step 2: Compare actual difference with tolerance

    Difference is 0.0001, which is greater than 0.00001, so assertion fails.
  3. Final Answer:

    The relative tolerance is too small, causing test to fail -> Option A
  4. Quick Check:

    Difference > rel tolerance causes failure [OK]
Hint: Check if difference fits within rel tolerance [OK]
Common Mistakes:
  • Assuming rel parameter is invalid
  • Ignoring difference size vs tolerance
  • Confusing syntax error with logic error
5. You want to test that a function returns a value close to 100, but it may vary by up to 0.5 units. Which is the best way to write this assertion using pytest.approx?
hard
A. assert result == pytest.approx(100, rel=0.5)
B. assert result == pytest.approx(100, abs=0.5)
C. assert result == pytest.approx(100, abs=0.05)
D. assert result == pytest.approx(100, rel=0.005)

Solution

  1. Step 1: Understand absolute vs relative tolerance

    Absolute tolerance (abs) allows fixed difference; relative (rel) allows percentage difference.
  2. Step 2: Match tolerance to requirement

    Variation up to 0.5 units means absolute tolerance of 0.5 is correct.
  3. Final Answer:

    assert result == pytest.approx(100, abs=0.5) -> Option B
  4. Quick Check:

    Use abs=0.5 for fixed unit tolerance [OK]
Hint: Use abs for fixed tolerance, rel for percentage [OK]
Common Mistakes:
  • Using rel when fixed tolerance needed
  • Setting abs too small to cover variation
  • Confusing abs and rel parameters
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