nose vs pytest - які (суб’єктивні) відмінності повинні змусити мене вибрати? [зачинено]


85

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

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

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

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

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


Тільки що зауважив, що більш-менш те саме питання було задано і тут - але це було п’ять років тому, тому я все ще думаю, що переосмислення питання має сенс
Якоб ван Віфлеєм,

9
pytestпідтримує багатопроцесорну підтримку через плагін pytest-xdist .
Бруно Олівейра,

2
Окрім того, менеджери контексту - це звичайні об’єкти Python, і ви можете зателефонувати як manager.__enter__()у ваш TestCase.setUp(), так і manager.__exit__()у ваш tearDown().
rescdsk

Відповіді:


80

Раніше я використовував Nose, оскільки це було за замовчуванням для Pylons. Мені це зовсім не сподобалось. У ньому були конфігураційні вусики в декількох місцях, практично все, здавалося, робилося з недокументованим плагіном, що робило все це ще більш непрямим і заплутаним, і оскільки він за замовчуванням робив тести unittest, він регулярно ламав з відстеженнями Unicode, приховуючи джерела помилок.

Я був дуже задоволений py.test останні пару років. Можливість просто написати тест assertнестандартно змушує мене ненавидіти написання тестів набагато менше, і зламати все, що мені потрібно, поверх ядра було досить просто. Замість фіксованого інтерфейсу плагіна, він просто має купу гачків, і цілком зрозумілий вихідний код, якщо вам потрібно буде копати далі. Я навіть написав адаптер для запуску тестів Testify під py.test і мав більше проблем з Testify, ніж з py.test.

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


2
Деякі проблеми з приховуванням зворотних слідів були усунені близько 0,1 0,1, багато років тому. Оскільки порт Python 3, я сподіваюся, що будь-які відстеження Unicode трапляються рідше (хоча особисто, я думаю, що я стикався з проблемою Unicode з носом лише один раз, що з'явилося при комбінуванні з деяким базовим класом тестового випадку, який зробив якийсь "трюк", який не зробив " це справді має сенс - так що це виявилось не виною носа). Я підозрюю по правді кажучи, обидва інструменти за ці роки збили грубі краї, тож, можливо, вам сподобається найкраще, що б ви не використовували останнім часом ;-)
Кроад Лангшан,

як щодо нещодавньої частини документації. Мене також бентежить, чи використовувати носові тести чи py.test. обидва здаються однаково хорошими, але, як я читав, більшість людей сьогодні використовують носові тести. Що може бути причиною того, що py.tests має кращий набір багатопроцесорних бібліотек?
proprius 02

1
@proprius це може бути просто те, що тестування носа було першим. деякі фреймворки додали підтримку, проекти, що використовують ці фреймворки, використовували його за замовчуванням, і він поширювався. також, хоча py.test може виконувати носові та unittest-тести, його звичайний стиль не влаштований навколо класів, тому перенесення на py.test може здатися страшним.
Eevee

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