Bird
Raised Fist0
PyTesttesting~8 mins

Grouping related tests in PyTest - Framework Patterns

Choose your learning style10 modes available
Framework Mode - Grouping related tests
Folder Structure
tests/
├── unit/
│   ├── test_math_operations.py
│   └── test_string_utils.py
├── integration/
│   ├── test_api_endpoints.py
│   └── test_database.py
├── functional/
│   ├── test_user_login.py
│   └── test_shopping_cart.py
├── conftest.py
└── pytest.ini
Test Framework Layers
  • Tests: Organized by type (unit, integration, functional) inside tests/ folder.
  • Fixtures: Defined in conftest.py for shared setup and teardown.
  • Configuration: pytest.ini for test markers and options.
  • Utilities: Helper functions or modules imported by tests if needed.
Configuration Patterns
  • pytest.ini: Define markers to group tests, e.g., [pytest] with markers = unit: Unit tests, integration: Integration tests, functional: Functional tests.
  • conftest.py: Place fixtures here to share setup across grouped tests.
  • Command line: Run grouped tests by marker, e.g., pytest -m unit to run all unit tests.
  • Environment variables: Use if needed to switch configurations for different test groups.
Test Reporting and CI/CD Integration
  • Use pytest built-in reports with clear grouping by markers.
  • Generate JUnit XML reports for CI tools to parse and display grouped test results.
  • Integrate with CI/CD pipelines (GitHub Actions, Jenkins) to run specific groups on different triggers.
  • Use plugins like pytest-html for readable HTML reports showing grouped test outcomes.
Best Practices for Grouping Related Tests
  1. Use markers: Mark tests clearly with @pytest.mark.unit, @pytest.mark.integration, etc., for easy selection.
  2. Organize folders: Group tests by type or feature in separate folders for clarity.
  3. Shared fixtures: Use conftest.py to avoid duplication and share setup among grouped tests.
  4. Keep tests independent: Ensure grouped tests do not depend on each other to avoid flaky results.
  5. Run groups selectively: Use command line options to run only needed groups during development or CI.
Self Check

Where in this framework structure would you add a new test file for API integration tests?

Key Result
Organize tests by folders and markers, use shared fixtures, and run groups selectively with pytest.

Practice

(1/5)
1. What is the main benefit of grouping related tests in pytest?
easy
A. It keeps the test suite organized and easier to manage
B. It makes tests run faster automatically
C. It removes the need for assertions in tests
D. It prevents tests from running in parallel

Solution

  1. Step 1: Understand test grouping purpose

    Grouping tests helps organize them logically by feature or behavior.
  2. Step 2: Identify the main benefit

    This organization makes the test suite easier to maintain and understand.
  3. Final Answer:

    It keeps the test suite organized and easier to manage -> Option A
  4. Quick Check:

    Grouping = Organized tests [OK]
Hint: Grouping means organizing tests for easier management [OK]
Common Mistakes:
  • Thinking grouping speeds up tests automatically
  • Believing grouping removes need for assertions
  • Assuming grouping disables parallel runs
2. Which of the following is the correct way to mark a test function with a group name in pytest?
easy
A. @pytest.group('fast')\ndef test_example(): pass
B. @pytest.group_mark('fast')\ndef test_example(): pass
C. @pytest.mark.fast\ndef test_example(): pass
D. @pytest.tag('fast')\ndef test_example(): pass

Solution

  1. Step 1: Recall pytest syntax for marking tests

    pytest uses @pytest.mark.<groupname> to mark tests for grouping.
  2. Step 2: Match correct syntax

    @pytest.mark.fast is the correct decorator to mark a test as 'fast'.
  3. Final Answer:

    @pytest.mark.fast\ndef test_example(): pass -> Option C
  4. Quick Check:

    Use @pytest.mark.groupname for grouping [OK]
Hint: Use @pytest.mark.groupname to mark tests [OK]
Common Mistakes:
  • Using @pytest.group instead of @pytest.mark
  • Using @pytest.tag which does not exist
  • Incorrect decorator names like @pytest.group_mark
3. Given the following pytest code, what tests will run when executing pytest -m "slow"?
import pytest

@pytest.mark.slow
def test_a():
    assert True

@pytest.mark.fast
def test_b():
    assert True

class TestGroup:
    @pytest.mark.slow
    def test_c(self):
        assert True

    def test_d(self):
        assert True
medium
A. test_a and test_c only
B. test_b and test_d only
C. All tests test_a, test_b, test_c, test_d
D. Only test_c

Solution

  1. Step 1: Understand pytest -m option

    The -m option runs tests marked with the given marker, here 'slow'.
  2. Step 2: Identify tests marked 'slow'

    test_a and test_c have @pytest.mark.slow, so they run. test_b and test_d do not.
  3. Final Answer:

    test_a and test_c only -> Option A
  4. Quick Check:

    -m "slow" runs tests marked slow [OK]
Hint: -m runs only tests with the matching mark [OK]
Common Mistakes:
  • Running all tests ignoring marks
  • Including unmarked tests in filtered run
  • Confusing class-level marks with method marks
4. What is wrong with this pytest code if the goal is to group tests inside a class named TestMath?
class TestMath:
    def test_add():
        assert 1 + 1 == 2

    def test_subtract(self):
        assert 2 - 1 == 1
medium
A. test_subtract should not have self parameter
B. Class name should not start with Test
C. Tests inside classes cannot have assertions
D. test_add is missing the self parameter

Solution

  1. Step 1: Check method definitions inside test classes

    Instance methods inside test classes must have self as first parameter.
  2. Step 2: Identify the error

    test_add is missing self, so pytest will error or skip it.
  3. Final Answer:

    test_add is missing the self parameter -> Option D
  4. Quick Check:

    Test methods in classes need self [OK]
Hint: Test methods in classes must include self parameter [OK]
Common Mistakes:
  • Omitting self in test methods
  • Thinking class names cannot start with Test
  • Removing assertions from test methods
5. You want to run only tests related to the login feature in your pytest suite. You have marked tests with @pytest.mark.login and grouped some inside a class TestLogin. Which command will correctly run all login tests, including those inside the class?
hard
A. pytest -k login
B. pytest -m login
C. pytest --group=login
D. pytest --run-login

Solution

  1. Step 1: Understand pytest options for running grouped tests

    pytest uses -m to run tests marked with a specific marker like 'login'.
  2. Step 2: Identify correct command

    pytest -m login runs all tests marked with @pytest.mark.login, including those inside classes.
  3. Final Answer:

    pytest -m login -> Option B
  4. Quick Check:

    -m runs marked tests, -k filters by test name [OK]
Hint: Use -m with marker name to run grouped tests [OK]
Common Mistakes:
  • Using -k which filters by test name, not marker
  • Using nonexistent options like --group or --run-login
  • Assuming class name filters tests automatically
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