【问题标题】:Filter tests after discover发现后过滤测试
【发布时间】:2016-07-04 11:31:03
【问题描述】:

我目前正在像这样运行我的测试:

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

现在我想运行一个特定的测试,知道他的名字(如test_valid_user)但不知道他的班级。如果有不止一个具有这样名称的测试,那么我想运行所有这样的测试。 discover之后有什么办法过滤测试吗?

或者这个问题可能有其他解决方案(请注意,不应该从命令行完成)?

【问题讨论】:

    标签: python python-unittest


    【解决方案1】:

    您可以使用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()
    

    备注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
    

    【讨论】:

      【解决方案2】:

      另一种更简单的方法是将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)
      

      【讨论】:

        【解决方案3】:

        运行单个测试方法有两种方式:

        命令行:

        $ 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 次测试

        好的

        【讨论】:

          猜你喜欢
          • 2016-09-19
          • 1970-01-01
          • 2017-07-04
          • 2020-01-05
          • 2018-01-27
          • 1970-01-01
          • 2017-03-30
          • 2021-08-28
          • 2011-04-13
          相关资源
          最近更新 更多