Python - doctest vs. unittest [закрито]


160

Я намагаюся почати з тестування модулів на Python, і мені було цікаво, чи хтось може пояснити переваги та недоліки doctest та unittest.

Для яких умов ви б використовували кожного?

Відповіді:


177

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

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

Насправді тестування коду , мета - ретельно перевірити кожен випадок, а не проілюструвати те, що робиться на прикладі, що є іншою метою, яку, на мою думку, краще досягають інші рамки.


29
Табличка набагато менше, і я вважаю тести набагато простішими писати (і читати). Низька вартість запуску для написання тестів (тобто просто написання функції "test_foo ()" та перехід) також допомагає боротися зі спокусою зробити цікаві біти коду перед тим, як прибити свої тести.
Брайан

6
Я думаю, що це фантастична відповідь.
Джеймс Брейді

Які ще рамки тестування ви використовуєте? Або це виключно ніс?
Джо

6
Зважаючи на вік цієї відповіді, напевно, варто згадати, що значна частина «котельних плит» старих версій одиничного тестування значною мірою відсутня. Мені все ще подобається Ніс, але це дуже сильно кидає.
Адам Паркін

1
Ніс FYI був у режимі обслуговування протягом останніх кількох років і, ймовірно, припинить усі розробки (відсутнє стороннє втручання). Її керівники рекомендують для нових проектів використовувати альтернативу.
Шість

48

Я використовую unittest майже виключно.

Раз у раз я покладу деякі речі в docstring, який можна використовувати doctest.

95% тестових випадків є одиничними тестами.

Чому? Мені подобається зберігати доктрини дещо коротше і більш чітко. Іноді тестові випадки допомагають уточнити докстринг. Більшість випадків тестові приклади програми занадто довгі для докстрингу.


Буде здорово, щоб побачити приклад того, що, на вашу думку, підходить, docstringа що ні. Мені справді подобається docstring в терміні, що він чітко показує, як використовувати інтерфейс, але використання його і для цього, і для тестування одиниць може не відповідати.
користувач1767754

33

Ще одна перевага doctesting полягає в тому, що ви переконайтеся, що ваш код виконує те, що говорить ваша документація. Через деякий час зміни програмного забезпечення можуть змусити вашу документацію та код робити різні дії. :-)


6
+1 від мене - відмінна точка
дог

28

Я працюю біоінформатором, і більша частина коду, який я пишу, - це сценарії "один раз, одне завдання", код, який буде виконуватися лише один-два рази, і який виконує одне конкретне завдання.

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

Крім того, doctests корисні, коли вам доведеться передати свій сценарій досліднику, який не є експертом у програмуванні. Деяким людям дуже важко зрозуміти, як структуровані одиничні тести; з іншого боку, doctests - прості приклади використання, тому люди можуть просто скопіювати та вставити їх, щоб побачити, як ними користуватися.

Отже, для відновлення моєї відповіді: доктести корисні, коли ви повинні писати невеликі сценарії та коли вам потрібно передавати їх або показувати дослідникам, які не є комп'ютерними науковцями.


6
"doctests корисні, коли вам потрібно писати невеликі сценарії та коли ви повинні передавати їх або показувати дослідникам, які не є комп'ютерними науковцями." Відмінний момент. Я роблю те саме, і непітонські програмісти завжди вражені тим, що документацію можна виконати.
Даніель Канас

14

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

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


4
Мене заохотили в цьому напрямку ( doctestдля початку), але врешті про це пошкодували. Для нетривіальних тестових випадків я втратив виділення синтаксису та автоматичне завершення свого редактора. Коли тести були в окремому файлі, я більше не міг запускати його прямо з редактора - мені доведеться кожен раз міняти контекст на відповідний вихідний файл.
Відмінна думка

7

Я використовую виключно unittest; Я думаю, що doctest занадто захаращує основний модуль. Це, мабуть, стосується написання ретельних тестів.


7

Використання обох - допустимий і досить простий варіант. doctestМодуль забезпечує DoctTestSuiteіDocFileSuite методи , які створюють UnitTest-сумісні Тести з модуля або файлу, відповідно.

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

Але для більш складних випадків і для більш всебічного набору тестових випадків я використовую unittest, який забезпечує більший контроль та гнучкість.


7

Я не використовую doctest як заміну для unittest. Хоча вони трохи перетинаються, два модулі не мають однакової функції:

  • Я використовую unittestяк блок тестування одиниці, тобто він допомагає мені швидко визначити вплив будь-якої модифікації на решту коду.

  • Я використовую doctestяк гарантію, що коментарі (а саме docstrings) як і раніше стосуються поточної версії коду.

Широко задокументовані переваги розвитку тестових програм я отримую unittest. doctestвирішує набагато більш тонку небезпеку застарілих коментарів, що вводять в оману підтримку коду.


4

Я майже ніколи не використовую doctests. Я хочу, щоб мій код був самодокументованим, а документи створюють документацію користувачеві. ІМО, додаючи сотні рядків тестів до модуля, робить документи набагато менш читабельними. Я також вважаю, що модульні тести легше змінювати, коли потрібно.


4

Doctestможе часом призвести до неправильного результату. Особливо, коли вихід містить послідовності втечі. Наприклад

def convert():
    """
    >>> convert()
    '\xe0\xa4\x95'
    """
    a = '\xe0\xa4\x95'
    return a
import doctest
doctest.testmod()

дає

**********************************************************************
File "hindi.py", line 3, in __main__.convert
Failed example:
    convert()
Expected:
    'क'
Got:
    '\xe0\xa4\x95'
**********************************************************************
1 items had failures:
   1 of   1 in __main__.convert
***Test Failed*** 1 failures. 

Також не перевіряє тип виводу. Він просто порівнює вихідні рядки. Наприклад, він зробив раціональний тип, який друкує так само, як ціле число, якщо це ціле число. Тоді припустимо, у вас є функція, яка повертається раціонально. Таким чином, doctest не буде відрізнятись, якщо вихід є раціональним цілим числом або цілим числом.


5
r""" ... """Для усунення першої проблеми можна використовувати необроблені docstrings ( ).
icktoofay

Чудово працює в Python 3.4. Щоб він також працював у Python 2.7, використовуйте '\\xe0\\xa4\\x95'у своїй docstring.
Cees Timmerman

Я також виявив, що літерали unicode також не працюють з doctests (навіть з правильним рядком коментарів "кодування utf-8" вгорі файлу. Як правило, doctests не так добре підтримуються як тести unittest, тому є деякі помилки. які не виправляються.
RichVel

2

Я віддаю перевагу системам на основі відкриття ("ніс" і "py.test", використовуючи колишню в даний час).

doctest приємно, коли тест також хороший як документація, інакше вони, як правило, занадто захаращують код.


ніс виглядає неймовірно корисно; Я ще не отримав шанс скористатись цим, але я
покладаю

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