将运行UnitTestCase的运行时捕获到Python变量中
我有几个Python文件,每个文件都包含一个Python函数和一个测试用例,类似于下面的一个。我想要一个单独的python脚本,它将执行每个文件并捕获输出。碰巧,所有测试都将通过,输出类似于下面的“x秒内运行x个测试”,但此输出是stderr,而不是stdout 我希望能够将每个输出附加到列表中 从bash shell中,我可以简单地使用:将运行UnitTestCase的运行时捕获到Python变量中,python,io-redirection,python-unittest,Python,Io Redirection,Python Unittest,我有几个Python文件,每个文件都包含一个Python函数和一个测试用例,类似于下面的一个。我想要一个单独的python脚本,它将执行每个文件并捕获输出。碰巧,所有测试都将通过,输出类似于下面的“x秒内运行x个测试”,但此输出是stderr,而不是stdout 我希望能够将每个输出附加到列表中 从bash shell中,我可以简单地使用: $ python combine.py &> result.txt 这会将输出保存到一个文件中(不理想,但至少我可以检索到),因此我尝试使用
$ python combine.py &> result.txt
这会将输出保存到一个文件中(不理想,但至少我可以检索到),因此我尝试使用:
os.system('python combine.py &> result.txt')
…那只是把它打印到终端上
可能有一种更简单的方法,比如直接调用TestCase方法,而不是执行整个文件,这实际上可能是一个更好的解决方案,但我也没有找到一种方法来做到这一点
最终目标是在几个文件中的每个文件中执行unittests,并返回它们的列表。例如[“在0.3秒内运行了3次测试”,“在0.6秒内运行了2次测试”,等等]
# 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()
输出(标准偏差):
unittest
模块的main
方法有两个选项,我想您会发现它们很有用:
main(module='test_module', exit=False)
此执行的返回值是一个TestProgram
类对象。您可以在交互式解释器中运行以下命令
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()
时,将模块的值替换为“\uuuu main\uuuu”
,并捕获运行时的持续时间。回答得好ElizabethAB!把开头和结尾放在前面和后面是相当聪明的。。我不认为实际的TestProgram对象存储了这些信息,但是有了这些信息,我相信我现在可以解决我的问题了。
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)