Package: pytest-parametrize-suite
Pytest (Parametrize) SuiteA tiny plugin for writing clean, easy-to-read, parametrized tests in pytest.Why?Pytest'sparametrizeis a powerful way to write input-output testing to rapidly
expand your test coverage while minimizing the number of test assertions you must
write. Unfortunately, as the complexity of your test suite grows, it can become
difficult to keep track of individual test cases.One way to get cleaner test output is by assigning descriptiveidsandargnamesto
each parametrized case. However, the current methodologies available result in either
very verbose setup, or difficult-to-track ids and names.Enterpytest-parametrize-suite. With this marker, you define your test ids and
names in-line with the values you intend to pass into your test, keeping your
identifiers tightly coupled to your test cases and encouraging a delightful testing
experience as a result.QuickstartInstall With PIPpipinstall-Upytest-parametrize-suiteInstall With Poetrypoetryadd--group=testpytest-parametrize-suiteUsing the pluginThe plugin provides a single entrypoint in a pytest marker calledsuite.Thesuitemarker takes any number of keyword arguments. Each entry in should be a Mapping ofargname->argvalueand all entries should be the same exact shape.This gives developers the ability toExampleGiven the following module:# iso8601.pyfrom__future__importannotationsimportdatetimedefiso8601(date_obj:datetime.date|datetime.datetime|datetime.time|datetime.timedelta)->str:"""Format a Python date/time object into an ISO8601 string."""ifisinstance(date_obj,(datetime.date,datetime.time)):returndate_obj.isoformat()ifisinstance(date_obj,datetime.timedelta):returntimedelta_isoformat(date_obj)raiseValueError(f"Unrecognized value of type:{date_obj.__class__.__name__}:{date_obj}")deftimedelta_isoformat(delta:datetime.timedelta)->str:"""Why isn't this part of the stdlib?"""usecs=abs((delta.days*24*60*60+delta.seconds)*1000000+delta.microseconds)seconds,usecs=divmod(usecs,1000000)minutes,seconds=divmod(seconds,60)hours,minutes=divmod(minutes,60)days,hours=divmod(hours,24)fmt=f"P{days}DT{hours}H{minutes}M{seconds}.{usecs:06}S"returnfmtWriting With pytest-parametrize-suite:# test_iso8601.pyfrom__future__importannotationsimportdatetimeimportpytestfromexample.iso8601importiso8601@pytest.mark.suite(datetime=dict(given_date_obj=datetime.datetime(1970,1,1),expected_date_str="1970-01-01T00:00:00",),date=dict(given_date_obj=datetime.date(1970,1,1),expected_date_str="1970-01-01",),time=dict(given_date_obj=datetime.time(),expected_date_str="00:00:00",),timedelta=dict(given_date_obj=datetime.timedelta(1,1,1),expected_date_str="P1DT1.000001S",))deftest_iso8601(given_date_obj,expected_date_str):# Whendate_str=iso8601(given_date_obj)# Thenassertdate_str==expected_date_strWriting Without pytest-parametrize-suite:# test_iso8601.pyfrom__future__importannotationsimportdatetimeimportpytestfromexample.iso8601importiso8601@pytest.mark.parametrize(argnames=("given_date_obj","expected_date_str"),argvalues=[(datetime.datetime(1970,1,1),"1970-01-01T00:00:00"),(datetime.date(1970,1,1),"1970-01-01"),(datetime.time(),"00:00:00"),(datetime.timedelta(1,1,1),"P1DT1.000001S")],ids=["datetime","date","time","timedelta"])deftest_iso8601(given_date_obj,expected_date_str):# Whendate_str=iso8601(given_date_obj)# Thenassertdate_str==expected_date_strRunning the test defined in the example outputs the following:❯pytesttest_iso8601.py-v===============================testsessionstarts===============================platformdarwin--Python3.11.0,pytest-7.2.1,pluggy-1.0.0--/Users/god/Library/Caches/pypoetry/virtualenvs/pytest-parametrize-suite-TGMGi3Zp-py3.11/bin/python
cachedir:.pytest_cache
rootdir:/Users/god/PycharmProjects/pytest-parametrize-suite
plugins:parametrize-suite-23.1.0,cov-4.0.0
collected4itemssrc/pytest_parametrize_suite/example.py::test_iso8601[datetime]PASSED[25%]src/pytest_parametrize_suite/example.py::test_iso8601[date]PASSED[50%]src/pytest_parametrize_suite/example.py::test_iso8601[time]PASSED[75%]src/pytest_parametrize_suite/example.py::test_iso8601[timedelta]PASSED[100%]================================4passedin0.02s================================As you can see, we get a developer-friendly output for our parametrized tests while
minimizing the amount of cognitive overhead it takes to understand and develop our test
cases.Happy testing! :white_check_mark: