Session Management Hooks in Pytest

Pytest’s session management hooks let you run custom steps before test collection.

The two powerful session management hooks in Pytest are pytest_sessionstart and pytest_sessionfinish.

These hooks help you manage resources effectively, building a robust, scalable, and maintainable test suite that efficiently handles complex test environments.

pytest_sessionstart(session):
The pytest_sessionstart hook is called after the Session object is created and before test collection and execution begins. This is the perfect moment to perform checks like database connectivity and API availability to ensure everything is in place for your tests to run smoothly.

pytest_sessionfinish(session, exitstatus):
The pytest_sessionfinish hook is called after the test session has completed, right before Pytest returns the exit status. This allows you to clean up resources and handle any final tasks necessary after all tests have been executed, perhaps generate reports or send Slack notifications.

Add Pytest Sessionstart

To get started, we need to create a conftest.py file to implement the pytest_sessionstart hook.

As we’ve learned, Pytest triggers the pytest_sessionstart hook after the session is created but before test collection and execution begins.

Add Pytest Sessionfinish

Just like pytest_sessionstart, we’ll use the @pytest.hookimpl() decorator to mark our pytest_sessionfinish hook.

The pytest_sessionfinish hook executes a code block after the test session is complete. In our case, we’ll simply write a message indicating that the tests have finished successfully.

Passing CLI Arguments to Pytest Sessionstart

A complex codebase can operate in multiple modes or require specific input fields. We manage this by providing users with options known as CLI arguments or flags.

Best Practices for Session Management in Pytest

  • Use Session-Scoped Fixtures Wisely:

    • Ideal for resources like database connections, external services, and web servers that are costly to set up and tear down.
    • Ensure these fixtures are only for resources that need to be shared across the entire test session and maintain test isolation and randomness.
  • Use Pytest Sessionstart and Configure Wisely:

    • pytest_sessionstart: For session-level setups like initializing databases or starting services, especially for complex setups or conditional checks based on the test environment.
    • pytest_configure: For setting up or modifying global settings, initializing plugins, and customizing hooks and commands.
  • Optimize Resource Cleanup:

    • Avoid resource leaks by cleaning up properly after tests.
    • Use the yield statement in fixtures to clearly separate setup and teardown.