【问题标题】:Why is run() method called twice for running the test case?为什么 run() 方法被调用两次来运行测试用例?
【发布时间】:2013-03-24 15:34:28
【问题描述】:

考虑一下 Kent Beck 的书 Test Driven Development第 18 章中的以下 Python 代码,他正在其中构建单元测试框架。

class TestCaseTest(TestCase):
    def testRunning(self):
       test= WasRun("testMethod")
       assert(not test.wasRun)
       test.run() // Here run() is called once
       assert(test.wasRun)
  TestCaseTest("testRunning").run()//Here run() is called again

基类TestCase的实现如下所示:

TestCase
 def __init__(self, name):
    self.name= name
def  run(self):
    method = getattr(self, self.name)
    method()
  1. 为什么上面代码sn-p中run()方法被调用了两次?
  2. 谁在调用testRunning() 方法,何时调用?这里只是定义方法,但似乎没有人调用此方法。

P.S:我来自 Java 背景,对 Python 语法本身不太熟悉。

【问题讨论】:

    标签: python unit-testing tdd


    【解决方案1】:

    我无法访问您正在谈论的书,因此我将关闭您发布的代码 sn-p。

    看起来正在调用两个不同对象上的 run() 方法——一个是 TestCaseTest 类,一个是 WasRun 类(或任何名为 WasRun 的函数返回)。

    至于谁在调用 testRunning(),.run() 是在 TestCaseTest 对象上调用的,这可能是来自超类 TestCase 的方法。在 TestCase 中查找 run(),看看那里是否调用了 self.testRunning()。

    【讨论】:

    • 我已经添加了基类的代码供您阅读。好像我现在明白了。 run 方法的最后一行是关键。
    • 好的,所以有一个方法被检索并基于属性self.name运行。运行哪个方法取决于 TestCase 是如何初始化的,如果 self.name 是“hello”,那么调用的方法是 self.hello()。很高兴听到它在上下文中对您有意义。
    • 顺便说一句,这种机制在 Python 中被称为 pluggable selector 吗?
    • 这似乎是模式的名称,但我不确定我是否会说它被称为“在 Python 中”。这似乎是来自 JUnit 的一种技术,后来也用于 Python 版本的 JUnit。这在惯用的 Python 代码中并不常见。
    猜你喜欢
    • 2016-10-03
    • 1970-01-01
    • 2011-12-31
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多