鼻子测试中分测验的正确方法

2024-03-28 10:54:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我用迭代的方式建立了一个对象。我想测试每一步。这里有一个坏的测试函数:

def test_object:
    o = object.Object()
    o.step1()  # in place method
    assert(o.step1property)
    o.step2()  # in place method
    assert(o.step2property)
    o.step3()  # in place method
    # ...

所以,在每一步之后,我都会检查对象是否有一些所需的属性。我可以使用yield关键字将其拆分为子测试,例如:

^{pr2}$

此时,您可能会问:为什么不将这些调用放在单独的测试中?如果他们需要前一个结果的正确输出,那么把它放在一个.pickle文件中,并使其独立于。我基本同意。但是,我有一个这样的用例:假设step1()初始化类,step2()是一个JSON导出。然后,我需要确保JSON导出始终有效,即使在step1()中更改了内容。依赖.pickle文件是危险的,因为它们可能已经过时了,而且JSON导出可能会在我的最新对象失败时通过。我可以在两个单独的测试中分离断言并运行step1()两次(一次在它自己的测试中,一次在测试2的设置方法中),但是step1()非常耗时。在

这样做的首选方式是什么?有没有一种方法叫“子测试”而不是收益率,我能得到这些子测试的返回值吗?在我的例子中,我希望使用JSON字符串,因为我将所有测试结果保存到一个输出目录中,并且我希望将该字符串传递给write_to_output_dir函数(如果这是一个糟糕的设计,请告诉我!)。在


Tags: 文件对象方法字符串injsonobject方式
1条回答
网友
1楼 · 发布于 2024-03-28 10:54:51

如果类很难像这样测试,那么很有可能在面向对象的设计中做了一些不太理想的事情。如果你有空的话,看看this tech talk on unit testing。它还处理好的(如可测试的)OO设计。在

从本质上讲,让单元测试尽可能地原子化是一个好的实践。此外,您可以模拟不相关的功能,这些功能没有在特定的单元测试中进行测试。在

要专注于您的示例:您需要独立地检查初始化。我想这是一个工厂吧。然后就有了一个导出到JSON的方法。这可能就是您想要模拟初始化的对象并在此模拟上测试JSON导出的地方。也就是说,JSON导出器可能也应该是一个单独的类,以避免将初始化与操作逻辑混为一谈。一旦重构了代码,您可能会发现测试它更容易。在

相关问题 更多 >