代码之家  ›  专栏  ›  技术社区  ›  koen

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

  •  8
  • koen  · 技术社区  · 15 年前

    伪代码中的示例类:

    class SumCalculator
      method calculate(int1, int2) returns int
    

    什么是测试这个的好方法?换句话说,我应该如何描述我需要的行为?

    test1: canDetermineSumOfTwoIntegers
    

    test2: returnsSumOfTwoIntegers
    

    test3: knowsFivePlusThreeIsEight
    

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

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

    5 回复  |  直到 15 年前
        1
  •  10
  •   Bruno Rijsman    15 年前

    我将测试边界条件(max int,min int,zero,positive,negative)和一些典型情况:

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

    等.

        2
  •  5
  •   Mark Seemann    15 年前

    有几种哲学。Roy Osherove,作者 The Art of Unit Testing 似乎 prefer using explicit values ,并选择每个 Equivalence Class .

    这一原则并不能很好地应用到您的示例中,但在许多其他场景中都非常有效。

    例如,如果一个类需要一个正整数的输入,您可以选择 因为它是所有正整数的最简单表示。

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

    我在用 AutoFixture 为此(但您也可以使用其他方法),因此在本例中,我将测试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);
    

    原则上,这个测试提供了 规范 对于计算方法。我们永远不知道 int1 int2 是的,这在很多情况下都是非常合适的,实际上这并不重要。

        3
  •  3
  •   uray    15 年前

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

        4
  •  1
  •   philant    15 年前

    另一种选择是使用 Parameterized Test Case 移除 复制 在测试中。基本上,一个表以元组形式([term1,term2,sum])包含测试的所有数据,然后一个testcase在调用参数化的testcase以测试表中的一行时在表上迭代:

    我还将在这里添加负(溢出)测试:什么是 calculate(MAXINT, 1) 应该回来吗?

        5
  •  1
  •   Carl Manaster    15 年前

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