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

Python 鼻测试中分测验的正确方法,python,nosetests,Python,Nosetests,我有一个以迭代方式构建的对象。我想测试每一步。这是一个糟糕的测试函数: 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 # ... 因此,在每一步

我有一个以迭代方式构建的对象。我想测试每一步。这是一个糟糕的测试函数:

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关键字将其划分为子测试,如:

def test_object:
    o = object.Object()
    yield o.step1
    assert(o.step1property)
    yield o.step2
    # ...
此时,您可能会问:为什么不将这些调用放在单独的测试中?如果他们需要上一个结果的正确输出,请将该结果放入.pickle文件中并使其独立。我大体上同意。但是,我有一个用例,它并没有太大帮助:假设step1()初始化类,step2()是JSON导出。然后,我需要确保JSON导出始终有效,即使我在步骤1()中更改了内容。依赖.pickle文件将是危险的,因为它们可能已经过时,而且JSON导出可能会在我的最新对象失败时通过。我可以在两个单独的测试中分离断言,并运行两次
step1()
(一次在它自己的测试中,一次在测试2的设置方法中),但是
step1()
非常耗时


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

如果一个类很难进行这样的测试,在面向对象的设计中,您很有可能做了一些不太理想的事情。看看你是否能抽出时间。它还涉及良好的(如可测试的)OO设计

tl;从本质上讲,使单元测试尽可能原子化是一种好的做法。此外,您可以模拟在特定单元测试中未测试的无关功能


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

我同意我的测试应该是原子测试。也就是说,即使前面的函数发生了变化,JSON导出也需要工作。我有一个函数,可以针对工厂文件测试JSON导出,但我还想针对对象的当前版本测试JSON导出,而不必一直更新工厂文件(这是非常常见的!)。关于单独的类:为了更好的可读性,我将上面的代码保持简单。我的代码中真正的问题是如何将测试划分为子测试,因此只有对子测试的调用(在我的示例中使用yield)对我来说才显得重要。(继续前面的评论:)从你的回答中,我了解到人们通常不做子测试。我会看看你链接的技术讲座,希望它能帮助我更好地理解测试。谢谢你的帮助!