Separate test code from test cases in pytest.
BSD-3-CLAUSE License
Bot releases are hidden (Show)
Published by smarie about 4 years ago
Fixed issue with @parametrize_with_cases
when two cases with the same id and both requiring a fixture were to be created. Fixed #117.
Fixture closure engine refactoring:
When no fixture unions are present, the fixture closure is now identical to the default one in pytest
, to avoid issues originating from other plugins fiddling with the closure. Fixes #116
New SuperClosure
class representing the "list" facade on top of the fixture tree (instead of FixtureClosureNode
). In addition, this list facade now better handles editing the order of fixtures when possible. Fixes #111.
Session and Module-scoped fixtures that are not used in all union alternatives are not any more torn town/setup across union alternatives. Fixes #120
See documentation page for details.
Published by smarie over 4 years ago
TypeError
with iterable argvalue in standard parametrize. Fixed #115.See documentation page for details.
Published by smarie over 4 years ago
Fixed wrong module string decomposition when passed to cases
argument in @parametrize_with_cases
. Fixes #113
Autouse fixtures are now correctly used. Fixed #114
See documentation page for details.
Published by smarie over 4 years ago
Lazy values (so, test cases) now have a much nicer string representation ; in particular in pytest-harvest
results tables. Fixes #112
See documentation page for details.
Published by smarie over 4 years ago
New documentation page concerning theory of fixture unions. Fixes #109
Using a fixture_ref
in a new-style @parametrize
(with **args
or idgen
) now outputs a correct id. Fixes #110
See documentation page for details.
Published by smarie over 4 years ago
I am very pleased to announce this new version of pytest-cases
, providing a lot of major improvements. Creating powerful and complex test suites have never been so easy and intuitive !
Below is a complete list of changes, but the user guide has also been updated accordingly so feel free to have a look to get a complete example-based walkthrough.
A/ More powerful and flexible cases collection
New @parametrize_with_cases
decorator to replace @cases_data
(deprecated).
Aligned with pytest
:
now argnames
can contain several names, and the case functions are automatically unpacked into it. You don't need to perform a case.get()
in the test anymore !
@parametrize_with_cases("a,b")
def test_foo(a, b):
# use a and b directly !
...
cases are unpacked at test setup time, so the clock does not run while the case is created - in case you use pytest-harvest
to collect the timings.
@parametrize_with_cases
can be used on test functions as well as fixture functions (it was already the case in v1)
Easier to configure:
the decorator now has a single cases
argument to indicate the cases, wherever they come from (no module
argument anymore)
default (cases=AUTO
) automatically looks for cases in the associated case module named test_xxx_cases.py
. Users can easily switch to alternate pattern cases_xxx.py
with cases=AUTO2
. Fixes #91.
cases can sit inside a class, like what you're used to do with pytest
. This additional style makes it much more convenient to organize cases and associated them with tests, when cases sit in the same file than the tests. Fixes #93.
an explicit sequence can be provided, it can mix all kind of sources: functions, classes, modules, and module names as strings (even relative ones!).
@parametrize_with_cases("a", cases=(CasesClass, '.my_extra_cases'))
def test_foo(a):
...
More powerful API for filtering:
a new prefix
argument (default case_
) can be used to define case functions for various type of parameters: welcome user_<id>
, data_<id>
, algo_<id>
, model_<id>
! Fixes #108
a new glob
argument receiving a glob-like string can be used to further filter cases based on their names. For example you can distinguish *_success
from *_failure
case ids, so as to dispatch them to the appropriate positive or negative test. Fixes #108
finally you can still use has_tag
and/or provide a filter
callable, but now the callable will receive the case function, and this case function has a f._pytestcase
attribute containing the id, tags and marks - it is therefore much easier to implement custom filtering.
B/ Easier-to-define case functions
Case functions can start with different prefixes to denote different kind of data: e.g. data_<id>
, user_<id>
, model_<id>
, etc.
Case functions can now be parametrized with @parametrize
or @pytest.mark.parametrize
, just as in pytest ! This includes the ability to put pytest
marks on the whole case, or on some specific parameter values using pytest.param
. @cases_generator
is therefore now deprecated but its alternate style for ids and arguments definition was preserved in @parametrize
, see below.
Now case functions can require fixtures ! In that case they will be transformed into fixtures and injected as fixture_ref
in the parametrization. Fixes #56.
New single optional @case(id=None, tags=(), marks=())
decorator to replace @case_name
and @case_tags
(deprecated): a single simple way to customize all aspects of a case function. Also, @test_target
completely disappears from the picture as it was just a tag like others - this could be misleading.
C/ Misc / pytest goodies
New aliases for readability: @fixture
for @fixture_plus
, and@parametrize
for @parametrize_plus
(both aliases will coexist with the old names). Fixes #107.
@parametrize
was improved in order to support the alternate parametrization mode that was previously offered by @cases_generator
, see api reference. That way, users will be able to choose the style of their choice. Fixes #57 and #106.
@parametrize
now raises an explicit error message when the user makes a mistake with the argnames. Fixes #105.
More readable error messages in @parametrize
when lazy_value
does not return the same number of argvalues than expected from the argnames.
Any error message associated to a lazy_value
function call is not caught and hidden anymore but is emitted to the user, for easier debugging.
Fixed issue with lazy_value
when a single mark is passed in the constructor.
lazy_value
used as a tuple for several arguments now have a correct id generated even in old pytest version 2.
New pytest goodie assert_exception
that can be used as a context manager. Fixes #104.
See documentation page for details.
Published by smarie over 4 years ago
lazy_value
are now resolved at pytest setup
stage, not pytest call
stage. This is important for execution time recorded in the reports (see also pytest-harvest
plugin). Fixes #102
A function used as a lazy_value
can now be marked with pytest marks. Fixes #99
A lazy_value
now has a nicer id when it is a partial. Fixes #97
Removed annoying PytestUnknownMarkWarning
warning message when a mark was used on a case. Fixes #100
See documentation page for details.
Published by smarie over 4 years ago
lazy_value
for parametrize_plus
. Fixes #92
See documentation page for details.
Published by smarie over 4 years ago
Better support for pytest.param
in parametrize_plus
and also in fixture_union
and fixture_param[s]
. Improved corresponding ids. Fixed #79 and #86
New @ignore_unused
decorator to protect a fixture function from the "NOT_USED" case happening when the fixture is used in a fixture union.
Removed six
, wrapt
and enum34
dependencies
(Internal) submodules reorganization for readability
(Internal) suppressed a lot of code quality warnings
See documentation page for details.
Published by smarie over 4 years ago
Fixed ids
precedence order when using pytest.mark.parametrize
in a fixture_plus
. Fixed #87
Fixed issue with fixture_union
when using the same fixture twice in it. Fixes #85
Added the possibility to pass a hook
function in all API where fixtures are created behind the scenes, so as to ease debugging and/or save fixtures (with stored_fixture
from pytest harvest). Fixes #83
Fixture closures now support reordering when no unions are present. This suppressed the annoying warning "WARNING the new order is not taken into account !!" when it was not relevant. Fixes #81
See documentation page for details.
Published by smarie over 4 years ago
setup.py
. In particular removed dependency to six
for setup and added py.typed
file. Fixes #78
See documentation page for details.
Published by smarie over 4 years ago
@cases_generator
now has a default value for the names
template, based on the parameters. Fixes #77.
See documentation page for details.
Published by smarie over 4 years ago
Fixed ValueError
when a product of unions was used on a test node, for example when two parametrize_plus
using fixture_ref
s were used on the same fixture or test function. Fixed #76
See documentation page for details.
Published by smarie over 4 years ago
Improved error message when something that is not a fixture is used in unpack_fixture
or fixture_union
. Fixed #75
See documentation page for details.
Published by smarie over 4 years ago
Fixed deprecation warning #74
See documentation page for details.
Published by smarie over 4 years ago
Now using module name and not file path to detect symbols in cases files that are imported from elsewhere and not created locally. Indeed that was causing problems on some ^platforms where a .pyc
cache file is created. Fixes #72
Fixed PluginValidationError
when pytest_fixture_plus
or pytest_parametrize_plus
were used in a conftest.py
file. Fixes #71. According to discussion in pytest#6475, pytest_fixture_plus
and pytest_parametrize_plus
are now renamed to fixture_plus
and parametrize_plus
in order for pytest (pluggy) not to think they are hooks. Old aliases will stay around for a few versions, with a deprecation warning.
See documentation page for details.
Published by smarie almost 5 years ago
Improved test ids for the cases where fixture_ref
is used in the parameters list in @pytest_parametrize_plus
. Fixed #69. Thanks last-partizan
for the suggestion !
Fixed TypeError: got an unexpected keyword argument 'indirect'
with pytest
5+. Fixed #70.
See documentation page for details.
Published by smarie almost 5 years ago
FixtureClosureNode
is now able to properly handle ignore_args
, and now supports that plugins append fixtures to the closure, such as pytest-asyncio. Added corresponding tests. Fixes #68
See documentation page for details.
Published by smarie almost 5 years ago
Fixed KeyError
issue happening when a fixture is not found. Now users will see the "normal" error message from pytest ("fixture <name> not found"
). Fixed #67.
See documentation page for details.
Published by smarie almost 5 years ago
Fixed ValueError
issue happening with indirectly parametrized fixtures. Fixed #64.
See documentation page for details.