Можно ли запускать тесты с приборами 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. Похоже, вы повторно изобретаете это.