Как я могу запустить одни и те же тесты для нескольких структур данных с pytest? - PullRequest
0 голосов
/ 25 марта 2020

У меня есть модуль с различными реализациями одного и того же абстрактного базового класса. В качестве примера, скажем, я хотел бы протестировать классы с базовым классом 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

Поскольку я единственный разработчик и поскольку я не добавляя тесты для этого часто, это не имеет большого значения. Я все еще хотел бы знать, как избежать этого дублирования кода.

1 Ответ

2 голосов
/ 25 марта 2020

Просто используйте pytest.mark.parametrize со своими классами:

import pytest

collection_classes = (
    class1,
    class2
)

@pytest.mark.parametrize('cls', collection_classes)
def test_contains(cls):
    collection = cls()
    words = ["foo", "bar", "baz"]
    for word in words:
        collection.append(word)
    for word in words:
        assert word in collection        
...