从 运行 将单元测试用例捕获到 Python 变量中的 运行 时间

Capture the run time from running a unittest TestCase into a Python variable

我有几个 Python 文件,每个文件都包含一个 Python 函数和一个 TestCase,类似于下面的文件。我想要一个单独的 python 脚本来执行每个文件并捕获输出。碰巧的是,所有测试都将通过,输出将类似于下面的内容 "Ran x tests in x seconds" 但此输出是标准错误,而不是标准输出。

我希望能够将每个输出附加到列表中。

来自 bash shell 我可以简单地使用:

$ python combine.py &> result.txt

这会将输出保存到一个文件中(不理想,但至少我可以检索一些东西),所以我尝试使用:

os.system('python combine.py &> result.txt')

..不过只是将其打印到终端。

可能有更简单的方法,比如直接调用TestCase方法而不是执行整个文件,这实际上可能是更好的解决方案,但我也没有想出办法。

最终目标是在几个文件中的每一个中执行单元测试,并return它们的列表。例如 ['Ran 3 tests in 0.3 seconds'、'Ran 2 tests in 0.6 seconds' 等..]

# combine.py

def combine(*args): 
    result = []
    args = list(args)
    while len(args):
        for arg in args:
            try:
                result.append(arg.pop(0))
            except IndexError:
                a = args.index(arg)
                args.pop(a)
    return result



from unittest import TestCase, main

class CombineTests(TestCase):


    def runTest(self):
        result = ['a', 1, 'one', 'b', 2, 'two', 'c', 3, 4]
        self.assertEquals(combine(['a','b','c'], [1,2,3,4],['one','two']), result)

if __name__ == '__main__': main()

输出(标准错误):

Ran 5 tests in 0.002s

OK

unittest 模块的 main 方法有两个选项,我认为您会发现有帮助:

main(module='test_module', exit=False)

本次执行的返回值是一个TestProgramclass对象。您可以在交互式解释器中 运行 以下内容。

import unittest
import datetime

def fnc(a, b):
    return a + b

class MyTest(unittest.TestCase):
    def test_one(self):
        self.assertEqual(fnc(1,1), 2)

start = datetime.datetime.now()
tmp = unittest.main(module = '__main__', exit = False)
end = datetime.datetime.now()
duraction = end - start
print(duration)

可能有一种方法可以将保存在此处的对象中的 运行时间提取到 tmp 中,但我不确定它会是什么。您可以循环遍历您的模块,在对 unittest.main() 的调用中将它们的值交换为 '__main__',并捕获 运行 持续时间。