断言pytest命令已运行

时间:2018-08-16 14:08:10

标签: python pytest

我有一个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.'

我想包含一个验证run_test已执行的单元测试。

执行此操作的最佳方法是什么?模拟和单元测试对我来说是新的。

我尝试弄乱标准输出:

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>

1 个答案:

答案 0 :(得分:1)

这里有两个示例测试,它们验证通过有效测试名称时是否调用pytest.main,否则不进行调用。我还添加了一些不同的mock_pytest_main.assert_called调用作为示例。它们的功能几乎相同,但需要额外检查在函数调用时传递的args。希望这可以帮助您编写更复杂的测试!

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()