In the previous chapter, we learned how to use marks and parametrization effectively to skip tests, mark them as expected to fail, and parameterize them, to avoid repetition.
Tests in the real world often need to create resources or data to work on: a temporary directory to output some files to, a database connection to test the I/O layer of an application, a web server for integration testing. Those are all examples of resources that are required in more complex testing scenarios. More complex resources often need to be cleaned up at the end of the test session: removing a temporary directory, cleaning up and disconnecting from a database, shutting down a web server. Also, these resources should be easily shared across tests, because during testing we often need to reuse a resource for different test scenarios. Some resources are costly to create, but because they are...