Подтвердить что ты не робот

Используйте 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().

4b9b3361

Ответ 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. введите описание изображения здесь