如何对使用其他经过单元测试的功能的功能进行单元测试?

时间:2017-01-16 13:36:57

标签: unit-testing

如何使用已经测试的其他功能测试您编写的功能?假设函数 f 已经有单元测试,这样我们就可以确信它的行为和我们期望的一样。下面是用 f




  def g( A,b):
 return f(1 / b,a)
  




g 所做的唯一工作是对它的一些操纵参数并以正确的方式将它们传递给 f (在一个更复杂的例子中,我们可能会对参数进行更精细的操作)。由于 f 已经过测试,我唯一需要用 g 测试的是我正确操作了参数,并且在将它们传递给˚F。我看到两种方法:




    

  1. 经典方式:手动查找(arguments,expected_results)对并编写 g(1)之类的测试,2)== 3 。使用这种方法,我会隐式地重新测试 f ,因为我必须手动找到 f(1 / b,a)的结果。此外,对于任何微不足道的b来说,计算f(1 / b,a)很难手工完成(比如 f 用更简单的值进行测试)。
  2. 

  3. 在测试中重复使用 f :编写类似的测试断言g(1,2)== f(1 / 2,1)。但这看起来很像重写函数 g 的主体,其中参数被实际值替换。因此,我可能会在函数体和测试中两次产生相同的错误。
  4. 





什么是最好的方法测试 g ?还有另外一种方法吗?




2 个答案:

答案 0 :(得分:2)

  

如何使用已经测试的其他功能测试您编写的功能?

与任何其他功能一样。

如果f已经过测试,那么您不应该担心它会导致问题。如果它确实导致问题,那么您没有正确测试f

  

我看到两种方法

采用第一种方法。

你说" 我们可能会对参数进行更精细的操作",所以第二种方法是不可能的。

更不用说,如果你不小心弄乱了表达式的rhs会怎么样?

assert g(1, 2) == f(1 / 1, 2)
  

通过这种方法,我会暗中重新测试f

您没有重新测试f,您在实施中使用了经过测试的功能。

如果f出错,那只会是一个问题。您不会介意在测试中使用标准库中的行为,那么如果您说f已经过测试,那么g会有什么不同?

  

我需要使用f进行测试的唯一方法是我正确地操纵了参数我将它们传递给{{1时没有混淆}}

第二个陈述有点过分。混合参数通常会显示黑盒测试:如果g没有以正确的顺序将参数传递给f,那么结果应该不符合预期/你应该期待无效的结果。

如果你的结果是正确的,但是参数混淆了,那么你的断言不是很精细,你应该让它们更加详细。以下是不良测试的示例。虽然这些断言是正确的,但从黑盒子的意义上看,两者看起来是一样的(他们显然不是这样):

def mod(a,b):
    return a%b

assert mod(10, 4) == 2
assert mod(10, 9) == 1

def divide(a,b):
    return a/b

assert divide(10, 4) == 2
assert divide(10, 9) == 1

混淆参数可能会有问题,但如果您的测试不详细,它只能投入生产。如果您遇到g问题,可能需要分解突变行为:

def g(a,b):
    return f(mutateB(b), mutateA(a))

然后独立测试mutate函数,确保它们正常工作。

答案 1 :(得分:1)

另一种方法是存根f函数,i.d。提供在测试中使用的f的替代实现,其职责是为提供的输入返回定义的值。这样可以在日照中测试g