Unit testing 如何测试或描述无限的可能性?

Unit testing 如何测试或描述无限的可能性?,unit-testing,testing,tdd,bdd,Unit Testing,Testing,Tdd,Bdd,伪代码中的示例类: class SumCalculator method calculate(int1, int2) returns int 测试这个的好方法是什么?换句话说,我应该如何描述我需要的行为 test1: canDetermineSumOfTwoIntegers 或 或 Test1和Test2看起来很模糊,它需要测试一个特定的计算,所以它并没有真正描述测试的内容。然而test3非常有限 测试此类类的好方法是什么?我将测试边界条件(最大int、最小int、零、正、负)和一些典型

伪代码中的示例类:

class SumCalculator
  method calculate(int1, int2) returns int
测试这个的好方法是什么?换句话说,我应该如何描述我需要的行为

test1: canDetermineSumOfTwoIntegers

Test1和Test2看起来很模糊,它需要测试一个特定的计算,所以它并没有真正描述测试的内容。然而test3非常有限


测试此类类的好方法是什么?

我将测试边界条件(最大int、最小int、零、正、负)和一些典型情况:

test1: sumOfPosAndPos
test2: sumOfPosAndNeg
test3: sumOfPosAndZero
test4: sumOfNegAndZero
test5: sumOfMaxIntAndMinInt

等等。

有几种哲学。Roy Osherove,这本书的作者,似乎是,并选择了每一本书的最低(或最简单)代表

这一原则本身并不适用于您的示例,但在许多其他场景中效果非常好

例如,如果一个类需要输入一个正整数,则选择数字1,因为它是所有正整数的最简单表示形式

就我个人而言,我更喜欢我所称的原则。这里的要点是,我们让某种工厂为我们提供给定类型的匿名变量,因为它迫使我们直接在测试中建立关系

我正在使用它(但您也可以使用其他工具),因此在本例中,我将测试SumCalculator,如下所示:

var fixture = new Fixture();
var int1 = fixture.CreateAnonymous<int>();
var int2 = fixture.CreateAnonymous<int>();
var expectedResult = int1 + int2;
var sut = fixture.CreateAnonymous<SumCalculator>();

var result = sut.Calculate(int1, int2);

Assert.AreEqual(expectedResult, result);
var fixture=newfixture();
var int1=fixture.CreateAnonymous();
var int2=fixture.CreateAnonymous();
var expectedResult=int1+int2;
var sut=fixture.CreateAnonymous();
var结果=sut.Calculate(int1,int2);
Assert.AreEqual(预期结果、结果);

原则上,此单一测试为计算方法提供了规范。我们永远不知道
int1
int2
的值是什么,这在很多情况下都是非常合适的,因为它们实际上并不重要。

如果你在测试数学函数,我建议你应该测试它的反函数,例如:对于x=a+b的函数,您应该测试它是否a-x=-b和x-b=a,这只是为了说明,当然它不会在所有情况下都起作用。

这里的另一个替代方法是使用a来删除测试中的重复。基本上,一个表以元组形式([term1,term2,sum])包含测试的所有数据,然后一个测试用例在调用参数化测试用例时在表上迭代,以测试表中的一行:


我还要添加负(此处溢出)测试:
calculate(MAXINT,1)
应该返回什么

参见David Saff的理论测试工作;这就是一个例子。这基本上是一种断言(比如函数是其函数的逆函数)对于某个集合中的所有值(包括所有可能值的集合)都是真的,并将该断言表示为测试的方法。您可以使用随机选择的值运行测试(如果集合太大,无法完全运行),并自动将失败记录为特定的具体回归测试,从而完成一些有趣的事情。

可能会添加SumofMaxInt和MaxInt,并检查报告失败的函数。这是我能想到的最多的边界情况。sumOfMaxIntAndOne也应该引起一个异常,不是吗?这将是另一个很好的优势案例。否则我同意。只要想一想两个稍微不同的可能性就可以了。不要忘记否定测试用例test6:sumofstring和positive(应该会引发异常或返回错误)
sumOfPosAndPos
sumOfPosAndNeg
都是等价分区的测试,但是边界条件。但这个建议仍然很好。
test1: sumOfPosAndPos
test2: sumOfPosAndNeg
test3: sumOfPosAndZero
test4: sumOfNegAndZero
test5: sumOfMaxIntAndMinInt
var fixture = new Fixture();
var int1 = fixture.CreateAnonymous<int>();
var int2 = fixture.CreateAnonymous<int>();
var expectedResult = int1 + int2;
var sut = fixture.CreateAnonymous<SumCalculator>();

var result = sut.Calculate(int1, int2);

Assert.AreEqual(expectedResult, result);