Raphael Pierzina wrote a cool article about how to run use a hook function to only run tests that use a particular fixture. However, I wanted to make it more generic so I could pass in the fixture via command line option. Minor tweak to add options.
I’ve made a few changes to the pytest-expect fixture plugin.
- I’ve put the plugin code on github, https://github.com/okken/pytest-expect.
- It is re-arranged to be a plugin installable with pip. Although I don’t have it in pypi yet.
- I’ve modified the code to use pytest 2.7.0 @pytest.mark.hookwrapper.
- I incorporated Bruno’s feedback from the last post to allow both assert failures and expect failures to be reported in the same test.
- There’s a tests directory to test the plugin.
There’s still lots to do. But this is a decent start.
Instead of listing any code here, go check out the pytest-expect repository on github
Also, I’ve set up a pytest-expect page. Not much there yet, but I plan on hosting the documentation for this thing there.
Previous posts in this series:
This is the first iteration that implements ‘expect’ as a fixture.
This is really the third attempt at an ‘expect()’ implementation that allows multiple failures per test.
- First attempt was a general solution that works with any test framework, but with a slightly clunky API. The main problem with it was that it required the test to call a final ‘assert_expectations()’ from the test code. If you forgot to call that function, the failures weren’t reported.
- Second attempt was a pytest plugin implementation that eliminated the need for the ‘assert_expectations()’ call in the test because it was called automatically. I wasn’t thrilled with this solution. But it works.
- In the solution I’m presenting in this post, I’m moving all of the code into one file and implementing ‘expect’ as a pytest fixture.
In Delayed assert / multiple failures per test, I presented a first attempt at writing an ‘expect()’ function that will allow
a test function to collect multiple failures and not stop execution until the end of the test.
There’s one big thing about that method that I don’t like.
I don’t like having to call ‘assert_expectations()’ within the test.
It would be cool to push that part into a plugin.
So, even though this isn’t the prettiest code, here’s a first attempt at making this a plugin.
- Test code that uses expect()
- Local conftest.py plugin for delayed assert
- Changes to delayed_assert.py
- Seeing it in action
- Possible issues and things I don’t like
- Alternative solutions
- Next Steps