【发布时间】:2012-05-25 22:20:05
【问题描述】:
在编写单元测试时,我有时会剪切和粘贴测试并且不记得更改方法名称。这会导致覆盖之前的测试,有效地隐藏它并阻止它运行。例如;
class WidgetTestCase(unittest.TestCase):
def test_foo_should_do_some_behavior(self):
self.assertEquals(42, self.widget.foo())
def test_foo_should_do_some_behavior(self):
self.widget.bar()
self.assertEquals(314, self.widget.foo())
在这种情况下,只有后一个测试会被调用。有没有办法以编程方式捕获这种错误,而不是直接解析原始源代码?
【问题讨论】:
-
复制和粘贴通常是不良编码习惯的标志 - 大多数情况下,这意味着您应该将功能提取到另一个函数中。如果您以后想更改它,它将为您节省时间和精力,以及诸如此类的问题。
-
Lattyware:总的来说我同意。然而,这是单元测试代码,它是最佳实践,并期望您有一堆简短的方法,除了不同的设置条件和断言之外,大多数看起来非常相似。所以我想说剪切和粘贴是课程的标准,并不代表不好的做法。
-
@ScottyAllen 为什么测试与您的其他代码有任何不同?如果它们共享很多功能,则提取出通用代码。如果没有,请不要复制和粘贴其他函数来制作它们。
-
Lattyware:您将如何重构上述示例以避免剪切和粘贴?根据我的经验,它代表了我在实践中编写和遇到的单元测试代码。
-
@Scotty:我怀疑 Darthfett 关于 pylint(和类似工具)的回答是最实用的回答。但是在stackoverflow.com/questions/10762088/…(此处链接)上,我发布了一个(巨大的)答案,其中包括如果您使用的是 Python3,您如何检测此错误;它在那儿而不是在这里,因为您可能没有使用 Python3,而且它与为什么
__setattr__在这里没有帮助更相关。
标签: python