Джанго - Унитест или Доктест? - PullRequest
4 голосов
/ 11 января 2012

Я собираюсь начать свой третий проект среднего размера и хотел бы (впервые в своей жизни, я признаю), чтобы начать использовать юнит-тесты. Я понятия не имею, какой метод использовать, объединяет или проверяет. Какой из методов наиболее эффективен или какой новичок должен выбрать для реализации? Спасибо

1 Ответ

9 голосов
/ 11 января 2012

Я предпочитаю юнит-тесты, но оба являются отличными и хорошо разработанными методами тестирования, и оба хорошо поддерживаются Django (подробности см. здесь ).Короче говоря, у каждого есть свои ключевые преимущества и недостатки:

Плюсы юнит-тестов

  • 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).

  • doctests может загромождать ваш код. Когда я 'Когда я пишу класс или метод, я помещаю столько документации в строки документации, сколько мне нужно, чтобы прояснить, что делает метод. Но если ваши строки документации имеют длину более 20 строк, вы можете получить столько документации в своем коде, сколькоу вас есть код. Это добавляет трудности к его чтению и редактированию (одна из моих любимых особенностей Python как языка программирования - его компактность).

Плюсы строк документации

  • Ваши тесты связаны с определенными классами и методами. Это означает, что если тест не пройден, вы сразу узнаете, какой класс и метод потерпели неудачу.используйте инструменты для определения степени охвата ваших тестов в ваших классах (конечно, это может быть и ограничивающим фактором, если вы хотите, чтобы тест охватывал множество различных частей вашего кода).

  • Ваши тесты находятся рядом с кодом, что означает, что их легче синхронизировать. Когда я делаю изменения в классе или методе, я часто забываювнести соответствующие изменения в тестовые наборы (хотя, конечно, мне скоро будет полезно вспомнить их при запуске).Наличие тестов doc рядом с объявлением вашего метода и кода делает это простым.

  • Тесты служат своего рода документацией. Люди, которые просматривают ваш код, могут иметьвключенные примеры того, как вызывать и использовать каждый метод.

Заключение : Я, конечно, предпочитаю юнит-тесты, но есть хороший пример для любого из них.

...