У меня есть модуль с различными реализациями одного и того же абстрактного базового класса. В качестве примера, скажем, я хотел бы протестировать классы с базовым классом collections.abc.Collection
, которые имеют append(element)
и __contains__
. Я хочу что-то вроде этого:
import collections
collection_classes = [list, collections.deque]
@pytest.parameter_values(collection_classes) # what I'm looking for
def test_contains(CollectionClass):
collection = CollectionClass()
words = ["foo", "bar", "baz"]
for word in words:
collection.append(word)
for word in words:
assert word in collection
Тогда я бы хотел, чтобы pytest выполнил тест со всеми заданными значениями и , чтобы показать понятное сообщение об ошибке, если один (или более) из параметров терпит неудачу , По сути, как если бы у меня был собственный тест для параметра, просто без дублирования тестового кода.
Что я делаю сейчас
У меня есть 3 класса, которые реализуют один и тот же интерфейс. В качестве обходного пути я скопировал тестовый код в 3 разных файла, которые выглядят почти одинаково, за исключением импорта в самом верху:
# speicific_collection is different for the 3 classes
from foo.module import specific_collection as CollectionClass
Поскольку я единственный разработчик и поскольку я не добавляя тесты для этого часто, это не имеет большого значения. Я все еще хотел бы знать, как избежать этого дублирования кода.