繁体   English   中英

单元测试中的代码可重用性?

[英]Code reusability in unit tests?

我不断听到人们谈论测试应该如何简单,可维护,简单明了,但是单元测试中的代码可重用性会如何?

让我们举个例子:

def test_some_1():
    ...some code

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

将两个测试的重复代码封装在一个具有必要断言的函数中,这不是最好的做法吗?

我曾与一些程序员争论过,他们不同意,他们说测试应该是愚蠢的,代码可重用性在这里不好。 原因是因为在django控制台中并不确定断言实际上在哪里失败,因为断言在函数中,尽管我不同意,因为将其与鼻子一起使用会给您测试的名称和回溯,尽管伙计们再次不同意,说可以单独调用一个测试而无需鼻子(因此您看不到所有这些详细信息)。

你们有什么感想?

  • 在单元测试中使用代码可重用性很好吗?
  • 如果可以/必须使用可重用性,那么如何克服有关确定断言的另一个问题?

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

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

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可以提高清晰度,因为单个测试仅包含特定于该测试的信息。

指出断言应该总是很容易。 甚至unittest都会给您回溯,如果您的测试设置没有指向特定的断言,您将很难调试任何测试失败,因此绝对应该切换到明智的选择。

正如您的同龄人所说,您应该将测试写成哑巴。 造成这种情况的原因有很多,最重要的原因是您要避免测试中的复杂逻辑。 如果您确实将测试编写为“智能”,则它们往往包含与您要测试的代码相同或相似的逻辑。 这意味着您有可能在两个地方犯同样的错误,并且会遗漏要查找的错误。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM