【问题标题】:Python unittest call function when assertion passes断言通过时的Python unittest调用函数
【发布时间】:2013-05-21 17:57:05
【问题描述】:

当测试中的断言通过时,我找不到 do_something() 方法。例如:

    def test_one(self):
        self.assertEqual(1,1, "Did not match")

如果断言失败,该测试将打印“不匹配”,但在这种情况下不会,所以我试图在 self.assertEqual() 成功时调用一个函数或打印一些东西,请任何想法?

谢谢

【问题讨论】:

    标签: python unit-testing assertions python-unittest


    【解决方案1】:

    如果您想在某事通过时打印,有几个选项。但是,请不要使用Noeld's answer。并不是说它是错误的,只是当unittest 提供了更好的方法时,您不想用一堆print 消息使您的测试变得混乱。

    冗长

    如果要打印每个 test_ 函数的结果,请设置测试运行器的详细程度。您可以通过以下几种方式做到这一点:

    1. 在命令行中,使用verbose 选项:

      python -m unittest discover -v

    2. 以编程方式调用 unittest.main 并将其传递给 verbosity argument

      if __name__ == "__main__":
          unittest.main(verbosity=2)
      

    “手动”运行测试

    1. 以编程方式构建您的 TestSuite 并调用 带有详细参数的 TestRunner。

      suite = unittest.TestLoader().loadTestsFromModule(TestModuleName)
      results = unittest.TextTestRunner(verbosity=2).run(suite)
      
    2. 创建TestResult object 的子类,其中包含addSuccess 方法,只要测试通过,就会调用该方法。

      然后您可以将此 TestResult 对象传递给Test Suite's run method

          suite = unittest.TestLoader().loadTestsFromModule(TestModuleName)
          suite.run(myTestResult)
      

    第三方跑步者

    看看Twisted's Trial。 它包含许多不同的Test Runners,它们可能很有用。默认情况下,它运行TreeReporter,如下所示:

    【讨论】:

      【解决方案2】:

      这行得通:

      import unittest
      
      
      class TestupSomeStuff(unittest.TestCase):
          def setUp(self):
              pass
      
          def test_fail(self):
              x = 2 * 4
              self.assertEqual(x,9,"DID NOT MATCH")
              print "Passed"
      
          def test_pass(self):
              x = 2 * 4
              self.assertEqual(x,8,"DID NOT MATCH")
              print "Passed"
      
      
      
      
      
      if __name__ == "__main__":
          unittest.main()
      

      这是因为如果您的断言失败,则测试失败,您将进入下一个测试,但是当测试成功时,它会继续并返回 None!

      例如:

      import unittest
      
      
      class TestupSomeStuff(unittest.TestCase):
          def setUp(self):
              pass
      
          def test_fail(self):
              return None
              # This is skipped, so test is win
              x = 2 * 4
              self.assertEqual(x,9,"DID NOT MATCH")
              print "FAIL"
      
          def test_pass(self):
              x = 2 * 4
              self.assertEqual(x,8,"DID NOT MATCH")
              # Passed gets printed after the dot for passing the previous test.
              print "Passed"
      

      打印:

      .Passed
      .
      ----------------------------------------------------------------------
      Ran 2 tests in 0.000s
      

      希望这会有所帮助。

      【讨论】:

      • 虽然这有助于实现 OP 想要的东西,但使用内置工具有许多不同的方法可以完成同样的事情。
      • 公平点只是想演示一种打印消息的简单方法,而无需子类化方法来获取不同的消息。很好的答案。
      • 在使用 Unittest 时使用 print 是一个坏主意,它有破坏标准输出的习惯,并且通常会导致不清楚何时实际触发了 print 语句。更好的方法是不依赖标准输出,而是使用 pythons 日志子系统。
      猜你喜欢
      • 1970-01-01
      • 2022-11-17
      • 1970-01-01
      • 2015-02-02
      • 2013-09-16
      • 2013-01-07
      • 1970-01-01
      • 1970-01-01
      • 2014-01-21
      相关资源
      最近更新 更多