从 运行 将单元测试用例捕获到 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)
本次执行的返回值是一个TestProgram
class对象。您可以在交互式解释器中 运行 以下内容。
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__'
,并捕获 运行 持续时间。
我有几个 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)
本次执行的返回值是一个TestProgram
class对象。您可以在交互式解释器中 运行 以下内容。
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__'
,并捕获 运行 持续时间。