У меня есть маршрут приложения django, который будет запускать команду pytest.main(), если выполняются некоторые условия:
def run_single_test(request, single_test_name):
# get dict of test names, test paths
test_dict = get_single_test_names()
# check to see if test is in the dict
if single_test_name in test_dict:
for test_name,test_path in test_dict.items():
# if testname is valid run associated test
if test_name == single_test_name:
os.chdir('/lib/tests/')
run_test = pytest.main(['-v', '--json-report', test_path])
else:
return 'The requested test could not be found.'
Я хотел бы включить unit тест, который проверяет выполнение run_test
.
Каков наилучший подход к этому? Мок и unittest новы для меня.
Я попытался возиться с stdout:
def test_run_single_test_flow_control(self):
mock_get = patch('test_automation_app.views.get_single_test_names')
mock_get = mock_get.start()
mock_get.return_value = {'test_search': 'folder/test_file.py::TestClass::test'}
results = run_single_test('this-request', 'test_search')
output = sys.stdout
self.assertEqual(output, '-v --json-report folder/test_file.py::TestClass::test')
но это возвращает:
<_pytest.capture.EncodedFile object at XXXXXXXXXXXXXX>
Вот два примера тестов, которые проверяют, что pytest.main
вызывается, когда действительное имя теста передается и не вызывается иначе. Я также добавил в качестве примера несколько разных вызовов mock_pytest_main.assert_called
; все они делают почти то же самое, с дополнительной проверкой на аргументы, переданные по вызову функции. Надеюсь, это поможет вам написать более сложные тесты!
from unittest.mock import patch
from test_automation_app.views import run_single_test
def test_pytest_invoked_when_test_name_valid():
with patch('pytest.main') as mock_pytest_main, patch('test_automation_app.views.get_single_test_names') as mock_get:
mock_get.return_value = {'test_search': 'folder/test_file.py::TestClass::test'}
results = run_single_test('this-request', 'test_search')
mock_pytest_main.assert_called()
mock_pytest_main.assert_called_with(['-v', '--json-report', 'folder/test_file.py::TestClass::test'])
mock_pytest_main.assert_called_once()
mock_pytest_main.assert_called_once_with(['-v', '--json-report', 'folder/test_file.py::TestClass::test'])
def test_pytest_not_invoked_when_test_name_invalid():
with patch('pytest.main') as mock_pytest_main, patch('test_automation_app.views.get_single_test_names') as mock_get:
mock_get.return_value = {'test_search': 'folder/test_file.py::TestClass::test'}
results = run_single_test('this-request', 'test_non_existent')
mock_pytest_main.assert_not_called()
pytest.main
и убедиться, что он был вызван с помощьюMock.assert_called
впоследствии.