Хотя ответы и дают представление о том, как тестировать список логических значений, содержащих только значения True
, все они упускают важные вещи:
По сути, вы выполняете три теста в одном.У этого подхода много недостатков - что если ValidateHotelStars.validate
вызывает необработанное исключение в середине списка звезд?Тест не пройден, а оставшиеся звезды не будут проверены.Предполагая, что assert not any(...)
терпит неудачу - вы можете сказать, какой из звездных аргументов был причиной неудачи?Все, что вы получаете - это AssertionError: False is not true
, без какого-либо понимания точного источника ошибки.
Поскольку вы уже используете pytest
, почему бы не использовать одну из его сильных функций?Параметризация теста:
import pytest
@pytest.mark.parametrize('invalid_star', [-5, 4, "Five"])
def test_invalid_star_is_not_validated(invalid_star):
assert not ValidateHotelStars.validate(invalid_star)
Выполнение теста даст:
$ pytest -v
================================== test session starts ===================================
platform darwin -- Python 3.6.6, pytest-3.9.1, py-1.5.4, pluggy-0.7.1
cachedir: .pytest_cache
rootdir: /Users/hoefling/projects/private/stackoverflow, inifile:
collected 3 items
test_spam.py::test_invalid_star_is_not_validated[-5] PASSED [ 33%]
test_spam.py::test_invalid_star_is_not_validated[4] FAILED [ 66%]
test_spam.py::test_invalid_star_is_not_validated[Five] PASSED [100%]
======================================== FAILURES ========================================
_________________________ test_invalid_star_is_not_validated[4] __________________________
invalid_star = 4
@pytest.mark.parametrize('invalid_star', [-5, 4, "Five"])
def test_invalid_star_is_not_validated(invalid_star):
> assert not ValidateHotelStars.validate(invalid_star)
E assert not True
E + where True = <function ValidateHotelStars.validate at 0x1057936a8>(4)
E + where <function ValidateHotelStars.validate at 0x1057936a8> = ValidateHotelStars.validate
test_spam.py:19: AssertionError
=========================== 1 failed, 2 passed in 0.12 seconds ===========================
Мне пришлось написать только один тест, но из-за параметризации pytest
запустит его три раза,каждый раз с другим аргументом invalid_star
.Теперь, даже если 4
не прошел тест, он все равно продолжит выполнение с "Five"
.После завершения теста вы сразу увидите, какие именно аргументы не пройдены, какие тесты.Вы не сможете достичь такого уровня детализации, зациклив список аргументов в одном тесте.