Hone logo
Hone
Problems

Mastering Pytest Fixtures: A Testing Toolkit

Pytest fixtures are a powerful mechanism for managing test setup and teardown, promoting code reusability and improving test readability. This challenge will guide you through implementing and utilizing fixtures to streamline your testing process, ensuring your tests are efficient and maintainable. You'll create fixtures for various scenarios, demonstrating their versatility in managing resources and dependencies.

Problem Description

Your task is to implement several pytest fixtures to support a suite of tests for a simple data processing application. The application deals with reading data from a file, processing it, and writing the results to another file. You need to create fixtures to handle file creation, data loading, and cleanup, ensuring tests are isolated and repeatable.

Specifically, you need to implement the following fixtures:

  1. create_temp_file(filename): This fixture should create an empty file with the given filename. It should return the filename. The fixture should be parameterized to accept a filename.
  2. load_data(filename): This fixture should take a filename as input, open the file, read its contents, and return the data as a string. If the file does not exist, it should raise a FileNotFoundError.
  3. write_data(filename, data): This fixture should take a filename and data (a string) as input. It should open the file in write mode, write the data to the file, and return True.
  4. cleanup_file(filename): This fixture should take a filename as input, delete the file if it exists, and return True.

You will then write a simple test function that utilizes the load_data fixture to verify that a file contains expected data.

Examples

Example 1:

Input: create_temp_file("test_file.txt")
Output: "test_file.txt"
Explanation: A file named "test_file.txt" is created in the current directory.

Example 2:

Input: load_data("existing_file.txt") where existing_file.txt contains "Hello, world!"
Output: "Hello, world!"
Explanation: The fixture opens "existing_file.txt", reads its contents, and returns the string "Hello, world!".

Example 3:

Input: load_data("nonexistent_file.txt")
Output: Raises FileNotFoundError
Explanation: The fixture attempts to open "nonexistent_file.txt", which does not exist, and raises a FileNotFoundError.

Constraints

  • Filenames passed to fixtures should be strings.
  • Data passed to write_data should be strings.
  • The cleanup_file fixture should handle cases where the file does not exist gracefully (no error should be raised).
  • The load_data fixture must raise a FileNotFoundError if the file does not exist.
  • All fixtures should use with open(...) as f: for file handling to ensure proper resource management.

Notes

  • Consider using the @pytest.fixture decorator to define your fixtures.
  • Think about how to handle potential errors, such as file not found.
  • The yield keyword is often used in fixtures to separate setup and teardown logic. While not strictly required for this problem, it's a good practice to be aware of.
  • The test function should be simple and focused on verifying the functionality of the load_data fixture. You don't need to test the other fixtures directly in this challenge, but they should be implemented correctly.
  • You can use os.path.exists() to check if a file exists before attempting to open it in cleanup_file.
  • Remember to import the pytest library.
Loading editor...
python