Можно ли запускать тесты с приборами pytest в интерактивном режиме?

У меня есть несколько тестов, написанных с использованием pytest и арматуры, например:

class TestThing:
    @pytest.fixture()
    def temp_dir(self, request):
        my_temp_dir = tempfile.mkdtemp()
        def fin():
            shutil.rmtree(my_temp_dir)
        request.addfinalizer(fin)
        return my_temp_dir
    def test_something(self, temp_dir)
        with open(os.path.join(temp_dir, 'test.txt'), 'w') as f:
            f.write('test')

Это отлично работает, когда тесты вызывают из оболочки, например

 $ py.test

но я не знаю, как их запускать из сеанса python/ipython; например,

tt = TestThing()
tt.test_something(tt.temp_dir())

temp_dir потому что temp_dir требует temp_dir объекта request. Итак, как вы вызываете прибор с request объектом?

Ответ 1

Да. Вам не нужно вручную собирать какие-либо испытательные приборы или что-то в этом роде. Все работает так же, как вызов pytest в каталоге проекта.

Method1:

Это лучший метод, потому что он дает вам доступ к отладчику, если ваш тест не прошел

В оболочке ipython используйте:

**ipython**> run -m pytest prj/

Это запустит все ваши тесты в prj/tests.

Это даст вам доступ к отладчику или позволит вам установить breakpoints если у вас есть import ipdb; ipdb.set_trace() import ipdb; ipdb.set_trace() в вашей программе (https://docs.pytest.org/en/latest/usage.html#setting-breakpoints).

Method2:

Используйте !pytest находясь в тестовом каталоге. Это не даст вам доступ к отладчику. Однако, если вы используете

**ipython**> !pytest --pdb

Если у вас есть сбой при тестировании, он поместит вас в отладчик (подоболочку), чтобы вы могли выполнить анализ вашей статьи -m ortem (https://docs.pytest.org/en/latest/usage.html#dropping- to-pdb-python-debugger-on-failures)


Используя эти методы, вы даже можете запускать отдельные модули /test_fuctions/TestClasses в ipython используя (https://docs.pytest.org/en/latest/usage.html#specifying-tests-selecting-tests)

**ipython**> run -m pytest prj/tests/test_module1.py::TestClass1::test_function1

Ответ 2

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

Ответ 3

Вы можете использовать две ячейки для этого:

первый:

def test_something():
    assert True

второй:

from tempfile import mktemp
test_file = mktemp('.py', 'test_')
open(test_file, 'wb').write(_i) # write last cell input

!pytest $test_file

вы также можете сделать это в одной ячейке, как эта, но у вас не будет подсветки кода:

from tempfile import mktemp

test_code = """
def test_something():
    assert True
"""

test_file = mktemp('.py', 'test_')
open(test_file, 'wb').write(test_code)

!pytest $test_file

Ответ 4

Простой ответ заключается в том, что вы не хотите запускать py.test интерактивно из python. Большинство людей установили некоторую интеграцию с их текстовым редактором или IDE для запуска py.test и анализа его вывода. Но на самом деле это инструмент командной строки, и именно так его следует использовать.

В качестве sidenode вы можете проверить встроенное устройство tmpdir: http://pytest.org/latest/tmpdir.html. Похоже, вы повторно изобретаете это.