Написание модульных тестов на Python: с чего начать? [закрыто]

534

Я завершил свой первый правильный проект на Python, и теперь моя задача - написать для него тесты.

Поскольку я впервые делаю проект, я впервые пишу для него тесты.

Вопрос в том, как мне начать? Я понятия не имею. Может кто-нибудь указать мне какую-нибудь документацию / учебник / ссылку / книгу, которую я могу использовать, чтобы начать писать тесты (и я предполагаю, в частности, юнит-тестирование)

Любые советы будут приветствоваться на эту тему.

user225312
источник
4
Никогда не поздно написать тесты, если вы этого хотите. Лучше иметь кого-то, чем никого для всех, кто жалуется ...
Asken
1
Вот хорошая книга для разработки, основанная на тестировании, которую можно бесплатно скачать онлайн: chimera.labs.oreilly.com/books/1234000000754/index.html
Will
4
хороший ресурс, на который я наткнулся https://www.jeffknupp.com/blog/2013/12/09/improve-your-python-understanding-unit-testing/ . Как новичок в Python, я нашел это понятным.
паром
2
В Руководстве автостопщика по Python есть краткий обзор инструментов для модульного тестирования: python-guide-pt-br.readthedocs.io/en/latest/writing/tests
Антон Тарасенко
Предыдущий комментарий должен быть оценен выше, поскольку в руководстве также есть пример репозитория кода на github.com/kennethreitz/samplemod, который также является отличным местом для начала работы.
Сетемплер

Ответы:

101

Если вы новичок в использовании юнит-тестов, простейший подход к обучению зачастую самый лучший. Исходя из этого, я рекомендую использовать py.testвместо модуля по умолчаниюunittest .

Рассмотрим эти два примера, которые делают то же самое:

Пример 1 (unittest):

import unittest

class LearningCase(unittest.TestCase):
    def test_starting_out(self):
        self.assertEqual(1, 1)

def main():
    unittest.main()

if __name__ == "__main__":
    main()

Пример 2 (pytest):

def test_starting_out():
    assert 1 == 1

Предполагая, что оба файла названы test_unittesting.py, как мы запускаем тесты?

Пример 1 (unittest):

cd /path/to/dir/
python test_unittesting.py

Пример 2 (pytest):

cd /path/to/dir/
py.test
Тим Макнамара
источник
7
Я слышал о простоте py.test в нескольких местах ( docs.python-guide.org/en/latest/writing/tests/#py-test , docs.python.org/3.5/library/unittest.html#module -unittest , jeffknupp.com/blog/2013/12/09/… ) Почему unit-testвсе еще входит в стандартную библиотеку, если py.testи noseобеспечивает ту же функциональность с гораздо более простым интерфейсом? Это просто для обеспечения обратной совместимости, или unittestимеет некоторые преимущества, которые py.testи nosetestне могут обеспечить?
alpha_989
@ alpha_989 Стандартная библиотека Python не предназначена для размещения лучших доступных инструментов. Для этого и нужен PyPI. Стандартный unittestпакет все еще достаточно хорош. Это стандарт, что означает, что он гарантированно хорошо работает. Наконец, любому, кто использует ваш код, не нужно устанавливать дополнительные пакеты.
Jeyekomon
72

В бесплатной книге по Python Dive Into Python есть глава, посвященная модульному тестированию, которая может оказаться вам полезной.

Если вы следуете современным методам, вам, вероятно, следует писать тесты, пока вы пишете свой проект, а не ждать, пока ваш проект будет почти завершен.

Немного поздно, но теперь вы знаете, в следующий раз. :)

Марк Байерс
источник
13
Я бы все же сказал, что если вы хотите реорганизовать код, который не имеет модульных тестов, вы должны сначала написать для него модульные тесты
Hubert Kario
9
Да, многие люди, которые впервые приходят на юнит-тесты, слышат что-то вроде «ну, это слишком поздно для вашего текущего проекта» из старых рук: даже если это не то, что они на самом деле хотели сказать, это то, что слышат новички , Это как китайская пословица о посадке дерева: лучшее время для начала испытаний - в начале проекта; второе лучшее время для начала испытаний сейчас!
JP
4
Ныряние в Python ссылка не работает ... :-(
Скотт Скилз
40

На мой взгляд, есть три отличных фреймворка для тестирования Python, которые стоит проверить.
UnitTest - модуль стандартно поставляется со всеми распределениями питона
носом - может работать UnitTest тестов, и имеет меньше шаблонный.
Pytest - также запускает юнит-тесты, имеет меньше шаблонов, лучше отчетности, много интересных дополнительных функций

Чтобы получить хорошее сравнение всех этих, прочитайте введение к каждому на http://pythontesting.net/start-here .
Там также есть расширенные статьи о светильниках и многое другое.

Okken
источник
35

Документы для unittest были бы хорошим местом для начала.

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

Джастин этир
источник
Это если вы хотите разработку через тестирование, что не так уж и плохо. В моем случае я смотрю на существующий код и пытаюсь понять его, написав и настроив проходящие тесты, и это заставило меня начать unittest. Как только я пойму что-то новое, я буду больше использовать его для разработки, а также для увеличения количества тестовых случаев для каждого модуля.
ледяной воды
27

unittest поставляется со стандартной библиотекой, но я бы рекомендовал вам протестировать нос .

« нос расширяет юнит-тест, чтобы облегчить тестирование ».

Я бы также рекомендовал вам пилинт

« анализирует исходный код Python на наличие ошибок и признаков низкого качества ».

ssoler
источник
8

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

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

philant
источник
2
+1 за «Эффективную работу с устаревшим кодом». Все дело в коде, у которого нет тестов.
Дэвид
3

Тесты носа - отличное решение для юнит-тестирования в python. Он поддерживает как тестовые сценарии, основанные на unittest, так и doctests, и позволяет вам начать с ним с помощью простого файла конфигурации.

Даниэль Клюев
источник
Ваша ссылка на тесты носа устарела. Кажется, что новое местоположение: nose.readthedocs.org/en/latest
odigity
1
В соответствии с документацией на github и веб-сайте проверки носа, noseи nose2находятся в режиме обслуживания. Лучше начинать с того, py.testчто у него гораздо больше поддержки
alpha_989