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

and*_*ari 1 python django code-reuse unit-testing django-nose

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

我们举个例子:

def test_some_1():
    ...some code

def test_some_2():
    ...code repeated from test_some_1
Run Code Online (Sandbox Code Playgroud)

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

我和一些程序员争论过这个并且他们不同意,他们说测试应该是愚蠢的,代码重用性在这里并不好.这样做的原因是因为在django控制台中断言实际上失败了并不是很清楚,因为断言是在函数中,虽然我不同意,因为使用它与鼻子会给你测试的名称和追溯,虽然这些家伙再次不同意,说明可以在没有鼻子的情况下单独调用测试(因此你无法看到所有这些细节).

你们有什么感想?

  • 在单元测试中使用代码重用性是否合适?
  • 如果可以/必须使用可重用性,那么如何克服关于引脚断言的其他问题?

otu*_*tus 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
Run Code Online (Sandbox Code Playgroud)

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

def test_vector1(self):
    self._test_vector(a=42, b=5, c="blah)
Run Code Online (Sandbox Code Playgroud)

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

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