1

Как создать несколько тестовых примеров и запустить их программно? Я пытаюсь проверить несколько реализаций коллекции на общей тестовой базе.Python параметризованный unittest путем подкласса TestCase

Я бы предпочел придерживаться простого unittest и избегать зависимостей.

Вот некоторые ресурсы, которые я смотрел на это не совсем отвечает, что я хотел:

Вот минимальный (не) рабочий пример.

import unittest 

MyCollection = set 
AnotherCollection = set 
# ... many more collections 


def maximise(collection, array): 
    return 2 


class TestSubClass(unittest.TestCase): 

    def __init__(self, collection_class): 
     unittest.TestCase.__init__(self) 
     self.collection_class = collection_class 
     self.maximise_fn = lambda array: maximise(collection_class, array) 


    def test_single(self): 
     self.assertEqual(self.maximise_fn([1]), 1) 


    def test_overflow(self): 
     self.assertEqual(self.maximise_fn([3]), 1) 

    # ... many more tests 


def run_suite(): 
    suite = unittest.defaultTestLoader 
    for collection in [MyCollection, AnotherCollection]: 
     suite.loadTestsFromTestCase(TestSubClass(collection)) 
    unittest.TextTestRunner().run(suite) 


def main(): 
    run_suite() 


if __name__ == '__main__': 
    main() 

Приведенные выше ошибки подход с в loadTestsFromTestCase:

TypeError: issubclass() arg 1 must be a class

ответ

1

Как об использовании pytest with to parametrize fixture:

import pytest 

MyCollection = set 
AnotherCollection = set 


def maximise(collection, array): 
    return 1 

@pytest.fixture(scope='module', params=[MyCollection, AnotherCollection]) 
def maximise_fn(request): 
    return lambda array: maximise(request.param, array) 

def test_single(maximise_fn): 
    assert maximise_fn([1]) == 1 

def test_overflow(maximise_fn): 
    assert maximise_fn([3]) == 1 

Если это не вариант, вы можете сделать подмешать содержать тест функции и подклассы для обеспечения maximise_fn с:

import unittest 

MyCollection = set 
AnotherCollection = set 


def maximise(collection, array): 
    return 1 


class TestCollectionMixin: 
    def test_single(self): 
     self.assertEqual(self.maximise_fn([1]), 1) 

    def test_overflow(self): 
     self.assertEqual(self.maximise_fn([3]), 1) 


class TestMyCollection(TestCollectionMixin, unittest.TestCase): 
    maximise_fn = lambda self, array: maximise(MyCollection, array) 


class TestAnotherCollection(TestCollectionMixin, unittest.TestCase): 
    maximise_fn = lambda self, array: maximise(AnotherCollection, array) 


if __name__ == '__main__': 
    unittest.main() 
+0

Ницца, идея mixin о совершенстве. Это немного повторяющийся, но очень ясный. – Joe

+0

В тестовом наборе CPython используется метод mixin для тестирования, например реализации C и Python, или, например, тесты, общие для более чем одного класса, такие как юникод и байты или кортежи и списки (и даже диапазон) или множества и фризовые , –

+1

@JoeS, Спасибо за редактирование. :) – falsetru

Смежные вопросы