Как создать несколько тестовых примеров и запустить их программно? Я пытаюсь проверить несколько реализаций коллекции на общей тестовой базе.Python параметризованный unittest путем подкласса TestCase
Я бы предпочел придерживаться простого unittest и избегать зависимостей.
Вот некоторые ресурсы, которые я смотрел на это не совсем отвечает, что я хотел:
Writing a re-usable parametrized unittest.TestCase method - Принятый ответ предлагает четыре различных внешних библиотек.
http://eli.thegreenplace.net/2011/08/02/python-unit-testing-parametrized-test-cases - Этот подход использует статический метод
paramerize
. Я не понимаю, почему вы не можете передать параметр непосредственно вTestSubClass.__init__
.How to generate dynamic (parametrized) unit tests in python? - Чуть слишком черная магия.
Вот минимальный (не) рабочий пример.
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
Ницца, идея mixin о совершенстве. Это немного повторяющийся, но очень ясный. – Joe
В тестовом наборе CPython используется метод mixin для тестирования, например реализации C и Python, или, например, тесты, общие для более чем одного класса, такие как юникод и байты или кортежи и списки (и даже диапазон) или множества и фризовые , –
@JoeS, Спасибо за редактирование. :) – falsetru