将运行UnitTestCase的运行时捕获到Python变量中

将运行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文件,每个文件都包含一个Python函数和一个测试用例,类似于下面的一个。我想要一个单独的python脚本,它将执行每个文件并捕获输出。碰巧,所有测试都将通过,输出类似于下面的“x秒内运行x个测试”,但此输出是stderr,而不是stdout

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

从bash shell中,我可以简单地使用:

$ 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)