我正在研究一个基于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__)))
答案 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并读取第一行,它提供测试/测试完成的信息并保存此信息。