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

Pytest: получение адресов всех тестов

Когда я запускаю pytest --collect-only, чтобы получить список моих тестов, я получаю их в формате, таком как <Function: test_whatever>. Однако, когда я использую pytest -k ... для запуска определенного теста, мне нужно ввести "адрес" теста в формате foo::test_whatever. Можно ли получить список всех адресов всех тестов в том же формате, что и -k?

4b9b3361

Ответ 1

В conftest.py вы можете переопределить крючки коллекции, чтобы распечатать информацию о собранных тестовых "элементах".

Вы можете ввести свой собственный вариант командной строки (например, --collect-only). Если этот параметр указан, распечатайте тестовые элементы (в зависимости от того, что вам нравится) и выйдите.

Пример conftest.py ниже (тестируется локально):

import pytest

def pytest_addoption(parser):
    parser.addoption("--my_test_dump", action="store", default=None,
        help="Print test items in my custom format")

def pytest_collection_finish(session):
    if session.config.option.my_test_dump is not None:
        for item in session.items:
            print('{}::{}'.format(item.fspath, item.name))
        pytest.exit('Done!')

Подробнее о pytest hooks см. ниже:

http://doc.pytest.org/en/latest/_modules/_pytest/hookspec.html

Ответ 2

Использование не так, как вы его указали. Из документации: http://doc.pytest.org/en/latest/usage.html

pytest -k stringexpr  # only run tests with names that match the
                      # "string expression", e.g. "MyClass and not method"
                      # will select TestMyClass.test_something
                      # but not TestMyClass.test_method_simple

поэтому вам нужно перейти к '-k', это строка, содержащаяся во всех вызываемых функциях, которые вы хотите проверить (вы можете использовать логический оператор между этими строками). Для вашего примера (если все defs префиксны с помощью foo:::

pytest -k "foo::"

Ответ 3

Если вы используете переключатель -k, вам не нужно указывать полный путь, разделенный двоеточиями. Если путь уникален, вы можете использовать только часть пути. Полный путь испытаний требуется только в том случае, если вы не используете переключатель -k.

например

pytest -k "unique_part_of_path_name"

для pytest tests/a/b/c.py::test_x вы можете использовать pytest -k "a and b and c and x".

Вы можете использовать логическую логику для переключателя -k.

Кстати, pytest --collect-only дает имя файла теста в строке <Module чуть выше тестовых имен файла.