Я выполняю модульные тесты для семейства функций, все из которых имеют ряд инвариантов. Например, вызов функции с двумя матрицами создает матрицу известной формы.
Я хотел бы написать модульные тесты для тестирования всего семейства функций для этого свойства, без необходимости писать индивидуальный тестовый пример для каждой функции (в частности, поскольку больше функций может быть добавлено позже).
Один из способов сделать это - перебрать список этих функций:
import unittest
import numpy
from somewhere import the_functions
from somewhere.else import TheClass
class Test_the_functions(unittest.TestCase):
def setUp(self):
self.matrix1 = numpy.ones((5,10))
self.matrix2 = numpy.identity(5)
def testOutputShape(unittest.TestCase):
"""Output of functions be of a certain shape"""
for function in all_functions:
output = function(self.matrix1, self.matrix2)
fail_message = "%s produces output of the wrong shape" % str(function)
self.assertEqual(self.matrix1.shape, output.shape, fail_message)
if __name__ == "__main__":
unittest.main()
У меня появилась идея от Dive Into Python. Там это не список проверяемых функций, а список известных пар "вход-выход". Проблема с этим подходом заключается в том, что если какой-либо элемент списка не прошел тест, более поздние элементы не проходят проверку.
Я посмотрел на подклассу unittest.TestCase и каким-то образом предоставил определенную функцию для проверки в качестве аргумента, но насколько я могу судить, это мешает нам использовать unittest.main(), потому что не будет способа передать аргумент тестовый файл.
Я также посмотрел на динамическое присоединение функций testSomething к тестовому регистру с помощью setattr с lamdba, но тестовая система не распознала их.
Как я могу это переписать, поэтому остается тривиально расширять список тестов, сохраняя при этом все тесты?