发现后过滤测试

时间:2016-07-04 11:31:03

标签: python python-unittest

我目前正在运行我的测试:

tests = unittest.TestLoader().discover('tests')
unittest.TextTestRunner().run(tests)

现在我想知道他的名字(如test_valid_user)但不知道他的班级的特定考试。如果有一个以上的测试名称比我想要运行所有这些测试。有没有办法在discover后过滤测试?

或许这个问题还有其他解决办法(请注意,不应该从命令行完成)?

3 个答案:

答案 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次测试