python unittest和pytest - 我可以为变量分配测试状态

时间:2017-04-10 10:34:00

标签: python pytest python-unittest

我正在研究一个基于python的测试系统,它迭代一组python测试并逐个运行它们(有单元测试和pytests)。

我的测试系统是否有办法了解每个测试的结果并将其保存到具有键[test_name]和值[test_status]的字典中。我想如果将测试结果分配给变量,例如:

test_status = "passed"

PS:所有测试都有一个main(),看起来像

# for unittests
def main():
    unittest.main()

# for pytests
def main():
    os.system("py.test -v {}".format(os.path.abspath(__file__)))

2 个答案:

答案 0 :(得分:1)

如果我理解正确,您希望实际运行 pytest或unittests作为命令行工具并检索结果。

这样做的直接方法是使用 JUnit xml输出并解析它。例如在pytest中:

pytest --junitxml=path

也许您想考虑使用像Jenkins这样的自动化服务器,它将分别运行unittests和pytest测试,然后收集结果。

答案 1 :(得分:0)

我找到了unittest框架的解决方案:

我们的想法是将测试输出数据更改为不在终端控制台上,而是更改为文件。一种方法是将以下代码添加到测试中:

if __name__ == '__main__':
    # terminal command to run a specific test and save its output to a log file
    # python [this_module_name] [log_file.log] [*tests]
    parser = argparse.ArgumentParser()
    parser.add_argument('test_log_file')
    parser.add_argument('unittest_args', nargs='*')

    args = parser.parse_args()

    log_file = sys.argv[1]
    # Now set the sys.argv to the unittest_args (leaving sys.argv[0] alone)
    sys.argv[1:] = args.unittest_args

    with open(log_file, "w") as f:
        runner = unittest.TextTestRunner(f)
        unittest.main(defaultTest=sys.argv[2:], exit=False, testRunner=runner)

并使用如下命令运行它:

python my_tests.py log_file.log class_name.test_1 class_name.test_2 ... test_n

其他方式是直接命令,如下所示:

python -m unittest [test_module_name].[test_class_name].[test_name] 2> [log_file_name]
# real command example:
python -m unittest my_tests.class_name.test_1 2> my_test_log_file.log
# real command example with multiple tests:
python -m unittest my_tests.class_name.test_1 my_tests.class_name.test_2 my_tests.class_name.test_3 2> my_test_log_file.log

最后一部分是编写一个方法,该方法读取此日志文件并获取测试结果。这些日志文件看起来像这样:

.FEs
======================================================================
ERROR: test_simulative_error (__main__.SimulativeTests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "unittest_tests.py", line 84, in test_simulative_error
    raise ValueError
ValueError

======================================================================
FAIL: test_simulative_fail (__main__.SimulativeTests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "unittest_tests.py", line 81, in test_simulative_fail
    assert False
AssertionError

----------------------------------------------------------------------
Ran 4 tests in 0.001s

FAILED (failures=1, errors=1, skipped=1)

所以最后一步是打开log_file并读取第一行,它提供测试/测试完成的信息并保存此信息。