我测试一个什么都不做的课程吗?

时间:2009-07-14 19:59:41

标签: python unit-testing testing logging polymorphism

在我的应用程序中,我有两个类:一个实际记录到数据库的记录器和一个什么都不做的虚拟记录器(在禁用记录时使用)。这是整个DummyLog类:

class DummyLog(object):
    def insert_master_log(self, spec_name, file_name, data_source,
                          environment_name):
        pass
    def update_master_log(self, inserts, updates, failures, total):
        pass

一方面,我应该放手,不要测试它,因为没有任何代码可以测试。但是,我的“受测试感染”的本能告诉我,这是一个借口,而且课堂的简单性意味着我应该更多愿意测试它。我只是在考虑要测试什么。

有什么想法吗?或者我应该放手,不写任何测试?

15 个答案:

答案 0 :(得分:12)

如果你不测试,你怎么知道它什么都不做? :)

抱歉 - 无法抗拒。说真的 - 我会测试,因为有一天它会做更多吗?

答案 1 :(得分:4)

如果不能失败。没有什么可以测试的。

测试用例结果需要包含至少一个成功状态,并且至少包含一个不成功状态。如果任何输入到测试结果成功输出。然后没有一个你可以创造的测试会失败。

答案 2 :(得分:4)

当然,您可以测试一个不做任何事情的课程。事实上,你测试它确实没有做任何事情。

在实践中,这意味着:

  • 它存在且可以实例化;
  • 使用时不会抛出异常;调用每个方法并简单断言它们是成功的。这也可以用来检查类实际上是否定义了预期的每个方法。

不要在DummyLog上运行此测试;将其用作通用测试并在所有记录器上运行它。当你从现在开始向真正的Log类添加另一个方法并忘记将它添加到DummyLog时,测试会注意到。 (当然,只要您记得为该方法添加一般测试,但希望添加测试应该是习惯性的,即使您忘记了相关的类。)

答案 3 :(得分:3)

务实,这里没有什么可以测试的。

答案 4 :(得分:2)

取决于你的理论。

如果你做一个测试驱动类型的人,那么为了让代码存在,你必须为它编写测试。

如果您正在考虑它,我写了它,我如何测试它,然后我认为它保证测试,因为你依靠它什么都不做。您需要进行测试以确保有人不会落后于您并删除该代码(甚至可能是您)。

答案 5 :(得分:2)

如果有人感兴趣,这是我最后写的测试:

def test_dummy_loader():
    from loader_logs import DummyLog
    from copy import copy
    dummy = DummyLog()
    initial = copy(dummy.__dict__)
    dummy.insert_master_log('', '', '', '')
    dummy.update_master_log(0, 0, 0, 0)
    post = copy(dummy.__dict__)
    assert initial == post

本质上,它测试在调用两个伪方法时没有在对象上设置属性。当然,它仍然没有测试方法真的什么都不做,但至少它是的东西

答案 6 :(得分:2)

它显然有所作为,或者你不会写它。

我猜它的意思是镜像真实日志类的接口。因此测试它具有相同的接口,它需要相同的参数。忘记更新假人时,您可能会更改日志记录。如果这似乎是多余的,那是因为它们可能只是从相同的接口继承。

然后是的,你可以测试它没有记录任何东西。这可能看起来很愚蠢,但维护程序员会做的很棒。

答案 7 :(得分:1)

如果它没有做任何事情那么就没有什么可以测试的了。如果你真的想要你可以验证它不会修改任何状态。我对Python不熟悉,知道是否有一种简单的方法来验证你的方法不会调用任何其他方法,但如果你真的想要的话,你也可以这样做。

答案 8 :(得分:1)

我不知道Python,但我可以想到一个测试 - 检查该类实际创建没有错误。这至少会对阶级进行回归测试,并且意味着它应该适用于所有情况。

你永远不会知道有人可能在将来编辑这个类并让它抛出异常或奇怪的东西!

就个人而言,除非你的目标是测试覆盖率非常高,否则我不会打扰。

那说如果这个类确实抛出异常会是灾难性的吗?我猜这将是那些没有单元测试只能在现场捕获的错误之一。

答案 9 :(得分:1)

参数:您不会将测试基于实现的读取,而是基于预期的行为。你测试的是,在调用时,darn的东西不会崩溃。

这个案子或许有点痴迷,坦白说我也许不会打扰。但是,这些空函数只需要一小部分增量就会有值得测试的陷阱。

答案 10 :(得分:1)

DummyLogger在设计模式中称为“空对象”。 从中对您的真实Logger进行子类化,为真实记录器创建一些测试,然后使用相同的测试,但使用DummyLogger。

class TestLogger(unittest.TestCase):
   def setUp(self):
       self.logger = RealLogger()
   def test_log_debug ..
   def test_log_error ..

class TestNullLogger(TestLogger):
   def setUp(self): 
       self.logger = DummyLogger()

但是很多人建议你不需要它。当它刹车时,修理它。

答案 11 :(得分:0)

您可以测试传递给它的参数。如果这是一个虚拟对象,将使用一组特定的参数进行调用,那么修改这些参数将使其失败。像这样的测试将确保如果它被修改至少没有其他依赖于它的代码中断。

答案 12 :(得分:0)

根据“你不需要它”的规则,即使有一天它可以做某事,你也不应该在没有任何东西需要测试的情况下编写测试。

如何测试某些东西什么都没做?这是一个很好的哲学问题:)

答案 13 :(得分:0)

我认为测试此类课程的唯一有用的好处是希望能够抓住是否有人开始修改它。否则我不会打扰。

答案 14 :(得分:0)

您至少希望它在用于代替实际记录器时不会破坏任何东西。因此,重用实际的记录器测试并分解测试它实际记录的断言。