5

我一直听到人们说测试应该如何简单、可维护、直接,但是单元测试中的代码可重用性会发生什么?

让我们举个例子:

def test_some_1():
    ...some code

def test_some_2():
    ...code repeated from test_some_1

将来自两个测试的重复代码封装在一个包含必要断言的函数中不是最好吗?

我和一些程序员就这个问题争论过,他们不同意,他们说测试应该是愚蠢的,代码的可重用性在这里不好。这样做的原因是因为在 django 控制台中不是很清楚断言实际失败的位置,因为断言在函数中,尽管我不同意,因为与鼻子一起使用它会给你测试的名称和回溯,虽然伙计们再次不同意,指出可以在没有鼻子的情况下单独调用测试(因此你看不到所有这些细节)。

你们有什么感想?

  • 在单元测试中使用代码可重用性好不好?
  • 如果可以/必须使用可重用性,那么如何克服关于精确定位断言的其他问题?
4

2 回答 2

5

代码质量最重要的因素,如清晰度和可读性,对于测试代码也很重要。如果代码重复使阅读更容易,无论您正在编写的是否是测试代码,您都应该这样做,反之亦然。

例如,在我写的一个包中,我有一个函数:

def _test_vector(self, a, b, c):
    # test the function with parameter values a, b, c
    # several asserts here to verify output of function tested

允许编写所有测试向量,例如:

def test_vector1(self):
    self._test_vector(a=42, b=5, c="blah)

IMO 提高了清晰度,因为单个测试仅包含特定于该测试的信息。

精确定位断言应该总是很容易的。Evenunittest会给你一个回溯,如果你的测试设置没有指向一个特定的断言,你将很难调试任何测试失败,并且肯定应该切换到合理的东西。

于 2014-06-04T07:44:11.530 回答
0

正如您的同行所说,您应该愚蠢地编写测试。这有几个原因,最重要的一个是你想避免测试中的复杂逻辑。如果您确实“聪明”地编写测试,它们往往包含与您尝试测试的代码相同或相似的逻辑。这意味着您可能会在两个地方都犯同样的错误,并且会错过您想要找到的错误。

另一个原因是您希望您的测试充当您尝试测试的代码的文档。如果测试有一个复杂的执行路径,包含许多功能和逻辑,那么它就不会那么容易理解。在最好的情况下,您只需看一眼测试即可了解生产代码是如何工作的。

于 2014-06-04T07:41:07.623 回答