unittests
позволяет легко создаватьиз более сложных тестов. Если у вас есть тест, который включает в себя вызов нескольких вспомогательных функций, итераций и других анализов, doctests может чувствовать себя ограниченным.unittests
, с другой стороны, просто пишет код Python - все, что вы можете делать в Python, вы можете делать там с комфортом.Возьмем этот код (измененную версию юнит-теста, который я однажды написал):
def basic_tests(self, cacheclass, outer=10, inner=100, hit_rate=None):
c = cacheclass(lambda x: x + 1)
for n in xrange(outer):
for i in xrange(inner):
self.assertEqual(c(i), i + 1)
if hit_rate != None:
self.assertEqual(c.hit_rate(), hit_rate)
def test_single_cache(self):
self.basic_tests(SingleCache, outer=10, inner=100, hit_rate=0)
sc = SingleCache(lambda x: x + 1)
for input in [0, 1, 2, 2, 2, 2, 1, 1, 0, 0]:
self.assertEqual(sc(input), input + 1)
self.assertEqual(sc.hit_rate(), .5)
Я использую метод basic_tests, чтобы запустить некоторые тесты для класса, а затем выполнить утверждение в цикле for.Есть способы сделать это в doctests, но они требуют большого количества продуманных doctests, которые лучше всего проверяют, что конкретные отдельные вызовы функции возвращают значения, которые они должны.(Это особенно верно в Django, который имеет фантастические инструменты для модульного тестирования (см. django.test.client
).