我目前正在运行我的测试:
tests = unittest.TestLoader().discover('tests')
unittest.TextTestRunner().run(tests)
现在我想知道他的名字(如test_valid_user
)但不知道他的班级的特定考试。如果有一个以上的测试名称比我想要运行所有这些测试。有没有办法在discover
后过滤测试?
或许这个问题还有其他解决办法(请注意,不应该从命令行完成)?
答案 0 :(得分:2)
您可以使用unittest.loader.TestLoader.testMethodPrefix
实例变量根据与“test”不同的前缀更改测试方法过滤器。
假设你有一个tests
目录,这个单元测试之王:
import unittest
class MyTest(unittest.TestCase):
def test_suite_1(self):
self.assertFalse("test_suite_1")
def test_suite_2(self):
self.assertFalse("test_suite_2")
def test_other(self):
self.assertFalse("test_other")
您可以编写自己的discover
函数来仅发现以“test_suite_”开头的测试函数,例如:
import unittest
def run_suite():
loader = unittest.TestLoader()
loader.testMethodPrefix = "test_suite_"
suite = loader.discover("tests")
result = unittest.TestResult()
suite.run(result)
for test, info in result.failures:
print(info)
if __name__ == '__main__':
run_suite()
remark :discover
方法中的参数“tests”是一个目录路径,因此您可能需要编写一个完整路径。
结果,你会得到:
Traceback (most recent call last):
File "/path/to/tests/test_my_module.py", line 8, in test_suite_1
self.assertFalse("test_suite_1")
AssertionError: 'test_suite_1' is not false
Traceback (most recent call last):
File "/path/to/tests/test_my_module.py", line 11, in test_suite_2
self.assertFalse("test_suite_2")
AssertionError: 'test_suite_2' is not false
答案 1 :(得分:1)
另一种更简单的方法是使用py.test和-k
选项进行测试名称关键字扫描。它将运行名称与关键字表达式匹配的任何测试。
虽然这是使用您不想要的命令行,但请注意,您可以使用subprocess.call
从代码中调用命令行来动态传递您想要的任何参数。
例如:假设您有以下测试:
def test_user_gets_saved(self): pass
def test_user_gets_deleted(self): pass
def test_user_can_cancel(self): pass
您可以从cli致电py.test
:
$ py.test -k "test_user"
或者来自代码:
return_code = subprocess.call('py.test -k "test_user"', shell=True)
答案 2 :(得分:0)
运行单一测试方法有两种方法:
命令行:
$ python -m unittest test_module.TestClass.test_method
使用Python脚本:
import unittest
class TestMyCode(unittest.TestCase):
def setUp(self):
pass
def test_1(self):
self.assertTrue(True)
def test_2(self):
self.assertTrue(True)
if __name__ == '__main__':
testSuite = unittest.TestSuite()
testSuite.addTest(TestMyCode('test_1'))
runner=unittest.TextTestRunner()
runner.run(testSuite)
输出:
----------------------------------------------- -------------
在0.000秒内进行1次测试
行