Используйте docstrings для перечисления тестов в py.test
Вот простой тестовый файл:
# test_single.py
def test_addition():
"Two plus two is still four"
assert 2 + 2 == 4
def test_addition2():
"One plus one is still two"
assert 1 + 1 == 2
Выход по умолчанию в py.test похож на
$ py.test test_single.py -v
[...]
test_single.py::test_addition PASSED
test_single.py::test_addition2 PASSED
Я хотел бы иметь
Two plus two is still four PASSED
One plus one is still two PASSED
то есть. используйте docstrings в качестве описаний тестов.
Я попытался использовать настройку в файле conftest.py
:
import pytest
@pytest.mark.tryfirst
def pytest_runtest_makereport(item, call, __multicall__):
# execute all other hooks to obtain the report object
rep = __multicall__.execute()
if rep.when == "call":
extra = item._obj.__doc__.strip()
rep.nodeid = extra
return rep
который близок, но он повторяет имя файла в каждой строке:
$ py.test test_single.py
======================================================================================== test session starts =========================================================================================
platform darwin -- Python 2.7.7 -- py-1.4.26 -- pytest-2.6.4
plugins: greendots, osxnotify, pycharm
collected 2 items
test_single.py
And two plus two is still four .
test_single.py
And one plus one is still two .
====================================================================================== 2 passed in 0.11 seconds ======================================================================================
Как я могу избежать строк с test_single.py
на выходе или, возможно, распечатать его только один раз?
Поиск источника py.test и некоторых его плагинов не помог.
Я знаю плагин pytest-spec, но использует имя функции в качестве описания. Я не хочу писать def test_two_plus_two_is_four()
.
Ответы
Ответ 1
Чтобы добавить комментарий к ответу @michael-wan: получить что-то похожее на specplugin
вставить в conftest.py
:
def pytest_itemcollected(item):
par = item.parent.obj
node = item.obj
pref = par.__doc__.strip() if par.__doc__ else par.__class__.__name__
suf = node.__doc__.strip() if node.__doc__ else node.__name__
if pref or suf:
item._nodeid = ' '.join((pref, suf))
и вывод pytest
class TestSomething:
"""Something"""
def test_ok(self):
"""should be ok"""
pass
будет выглядеть как
![py.test screen grab]()
Если вы опустите docstrings, будут использоваться имена классов/func.
Ответ 2
@Matthias Berth, вы можете попробовать использовать pytest_itemcollected
def pytest_itemcollected(item):
""" we just collected a test item. """
item.setNodeid('' if item._obj.__doc__ is None else item._obj.__doc__.strip() )
и изменить pydir/Lib/site-packages/pytest-2.9.1-py2.7.egg/_pytest/unittest.py
добавьте следующую функцию в класс TestCaseFunction
def setNodeid(self, value):
self._nodeid = value
и результат будет:
platform win32 -- Python 2.7.10, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 -- D:\Python27\python.exe
cachedir: .cache
rootdir: E:\workspace\satp2\atest\testcase\Search\grp_sp, inifile:
plugins: html-1.8.0, pep8-1.0.6
collecting 0 itemsNone
collected 2 items
Two plus two is still four <- sut_amap3.py PASSED
One plus one is still two <- sut_amap3.py PASSED
кстати, когда вы используете pytest-html
вы можете использовать функцию pytest_runtest_makereport, которую вы создаете, и она будет генерировать отчет с именем, которое вы настроили.
надеюсь, что это поможет.
Ответ 3
Для плагина, который (я думаю) делает то, что вы хотите из коробки, посмотрите pytest-testdox.
Он предоставляет дружественный форматированный список каждого имени тестовой функции, при этом test_
stripped и подчеркивания заменяются пробелами, так что имена тестов читаемы. Он также разбивает разделы по тестовому файлу.
Это выглядит так:
![введите описание изображения здесь]()
Ответ 4
Мне не хватало rpsec in ruby
для python. Итак, на основе плагина pytest-testdox.
, я написал аналогичный, который принимает строки документа как сообщение отчета. Вы можете проверить это pytest-pspec. ![введите описание изображения здесь]()