Reputation: 161
I have some tests organized in several classes. I already have a test fixture with scope=class so that it would run before suite(class) of tests. However, I need to execute a function after some specific tests. Lets say I have 100 tests in a class, I already have a fixture that will execute a function before these tests, but I also want to run a function after 2-3 of these tests.
What is the best approach to achieve that? Can it be done with fixtures or anything else ?
Upvotes: 7
Views: 6445
Reputation: 66531
First, write a fixture that will execute after a test finishes:
@pytest.fixture
def foo():
yield
print("do stuff after test")
Docs: Fixture finalization / executing teardown code
Now mark each test that should invoke this fixture with usefixtures("foo")
:
@pytest.mark.usefixtures("foo")
def test_spam():
...
Docs: Use fixtures in classes and modules with usefixtures
Upvotes: 15
Reputation: 58
If you know the specific tests you want to run after you could set up the tests in a .csv with different values for each test for Example (index) (column) (column) Tests Test# Complete? test 1 1 T test 2 2 F
import pandas as pd
#makes panda read your file and sets the variable as the data in the file
data = pd.read_csv("filename.csv")
#Gets the value from the column 'test#' and 'complete' and sets as a variable
Var1 = DataFrame.get_value("the number test you want to take", 'Complete?')
If Var1 = T
#Run the rest of your program here
#Then you can just repeat this for the other tests you want to check for
This isn't the prettiest solution but it works
Upvotes: 0
Reputation: 184
If you are using the python's built-in unittest module you can override the tearDown
method to run something after each test in a class.
If you are using pytest's framework and using pytests fixtures, you can use the yield
keyword in your fixtures.
It's documented in https://doc.pytest.org/en/latest/fixture.html#teardown-cleanup-aka-fixture-finalization.
Upvotes: 0