Написання одиничних тестів на Python: Як почати? [зачинено]


533

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

Оскільки це вперше я робив проект, я вперше писав би тести на нього.

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

Будь-які поради з цієї теми будуть вітатися.


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/ . Як новачок пітона, я вважав це зрозумілим.
пором

2
Керівництво автостопом до Python містить короткий огляд інструментів для тестування одиниць: python-guide-pt-br.readthedocs.io/en/latest/writing/tests
Антон Тарасенко

Попередній коментар слід оцінити вище, оскільки у посібнику також є приклад сховища коду на github.com/kennethreitz/samplemod, який також є чудовим місцем для початку роботи.
setempler

Відповіді:


101

Якщо ви абсолютно новачок у використанні одиничних тестів, найпростіший підхід до навчання часто є найкращим. На цій основі разом я рекомендую використовувати , py.testа не за замовчуванням unittestмодуля .

Розглянемо ці два приклади, які роблять те саме:

Приклад 1 (тест на одиницю):

import unittest

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

def main():
    unittest.main()

if __name__ == "__main__":
    main()

Приклад 2 (пітест):

def test_starting_out():
    assert 1 == 1

Якщо припустити, що обидва файли названі test_unittesting.py, як ми запускаємо тести?

Приклад 1 (тест на одиницю):

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

Приклад 2 (пітест):

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
Я все одно скажу, що якщо ви хочете змінити код рефактора, який не має одиничних тестів, спершу слід написати для нього одиничні тести
Хуберт Каріо

9
Так, багато людей, які приходять на тестування вперше, чують те, що звучить як "ну, це занадто пізно для вашого поточного проекту" від старих рук: навіть якщо це не те, що вони насправді мали намір сказати, це те, що слухають новачки . Це як китайське прислів’я про посадку дерева: найкращий час для початку випробувань - це на початку проекту; другий найкращий час для початку тестів - зараз!
JP

4
Зануритися в Python посилання порушено ... :-(
Скотт Скілз

40

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

Щоб краще порівняти все це, прочитайте вступ до кожного на веб-сторінці http://pythontesting.net/start-тут .
Також є розширені статті про світильники, і багато іншого там.


35

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

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


Це якщо ви хочете тестово розвинені, що це не погано. У моєму випадку я дивлюся на існуючий код і намагаюся зрозуміти його, написавши і налаштувавши тести, щоб пройти, і це почало мене починати unittest. Як тільки я отримаю деталь, я буду використовувати її більше для розробки, а також для збільшення кількості тестових випадків для кожної одиниці.
крижана вода

27

unittest поставляється зі стандартною бібліотекою, але я б рекомендував вам ності .

" ніс простягається unittest, щоб полегшити тестування. "

Я також рекомендую вам пілінт

" аналізує вихідний код Python, шукаючи помилки та ознаки низької якості. "


8

Як вже відповіли інші, пізно писати одиничні тести вже пізно, але не пізно. Питання полягає в тому, чи може ваш код перевірити чи ні. Дійсно, перевірити існуючий код непросто, є навіть книга про це: Ефективна робота зі застарілим кодом (див. Ключові моменти або попередник PDF ).

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


2
+1 за "Ефективна робота зі застарілим кодом". Вся справа в коді, який не має тестів.
Девід

3

nostests - це геніальне рішення для одиничного тестування в пітоні. Він підтримує як тестові корпуси, так і doctests на основі одиничних тестів, і ви починаєте з нього просто простим файлом конфігурації.


Ваше посилання на носа застаріле. Здається, нове місце розташування: nose.readthedocs.org/uk/latest
odigity

1
Відповідно до документації на github та веб-сайті, що перебуває в носі, noseі nose2знаходяться в режимі обслуговування. Краще почати з того py.test, що він має набагато більшу підтримку
alpha_989
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.