[openlp-dev] Parametrize Your Tests
Raoul Snyman
raoul at snyman.info
Wed Jun 15 13:56:03 EDT 2022
Hey everyone,
Ever found yourself writing a for-loop in a test, and wondering if
there's a better way to do it? Kinda like this?
def test_media_length(media_env):
"""
Check the duration of a few different files via MediaInfo
"""
for test_data in TEST_MEDIA:
# GIVEN: a media file
full_path = str(TEST_PATH / test_data[0])
# WHEN the media data is retrieved
results = media_env.media_controller.media_length(full_path)
# THEN you can determine the run time
assert results == test_data[1], 'The correct duration is
returned for ' + test_data[0]
Yes, there is a better way! It's called "parametrization". Here's how
you fix the test above:
@pytest.mark.parametrize('file_name,media_length', TEST_MEDIA)
def test_media_length(file_name, media_length, media_env):
"""
Check the duration of a few different files via MediaInfo
"""
# GIVEN: a media file
full_path = TEST_PATH / file_name
# WHEN the media data is retrieved
results = media_env.media_controller.media_length(full_path)
# THEN you can determine the run time
assert results == media_length, f'The correct duration for
{file_name} should be {media_length}, was {results}'
Now pytest will take care of running the test multiple times using the
parameters you supplied.
--
Raoul Snyman
More information about the openlp-dev
mailing list