代码之家  ›  专栏  ›  技术社区  ›  WW.

在测试用例中是否使用实现中的常量?

  •  22
  • WW.  · 技术社区  · 16 年前

    假设您有这样的代码(在一个虚构的语言中,因为这与这个问题无关):

    constant float PI = 3.14;
    float getPi() 
    { 
       return PI;
    }
    

    你会这样测试它吗:

    testPiIs3point14()
    {
       // Test using literal in test case
       AssertEquals( getPi(), 3.14 );
    }
    

    testPiIs3Point14()
    {
       // Test using constant from implementation in test case
       AssertEquals( getPi(), PI );
    }
    

    换句话说,您是否在测试用例中使用被测系统中的常量?或者这是一个实现细节?

    7 回复  |  直到 16 年前
        1
  •  28
  •   Ahmed Nabil DJDaveMark    5 年前

    这两个测试验证/断言了不同的目的。

    • 第一个( 在测试用例中使用literal )
      确保 getPi() 将始终返回3.14。
      它同时包含常量和函数,如果有人发现软件中使用的PI值不够精确,就用3.14159来代替,它就会失败。
      这可能是好的,也可能是坏的,这取决于上下文 .

    • 第二个( )

      如果有人改变常数,它不会失败;
      只有在函数无效的情况下它才会失败 修改为返回另一个常量(具有不同的值)。

    • 如果常量不能更改,请使用文字。
    • 常量-不管它的值是多少。在第二种情况下,测试可能是不必要的。
        2
  •  9
  •   diegoreymendez    12 年前

    我在找关于这个话题的信息。到目前为止,我的结论是你不应该使用文字,但你也应该确保常量是你所期望的。

    如果您在10个不同的单元测试中使用了文本,并且由于任何原因更改了值,那么您必须更改所有10个文本中的值。您可能需要或需要为PI添加更高的精度。

    最好的替代方法是实现一个单元测试,检查常量的值是否符合您的期望,然后在其他测试中自由使用常量。

    执行这两个测试的过程:

    testPiIs3point14()
    {
       AssertEquals( PI, 3.14 );
    }
    
    testGetPiReturnsPi()
    {
       AssertEquals( getPi(), PI );
    }
    

        3
  •  4
  •   Grzenio    16 年前

    我认为这是关于测试和生产代码之间耦合的问题。当我第一次启动TDD时,我认为在测试中使用常量可以使测试更彻底。然而,现在我认为这只会导致测试和实现之间更紧密的耦合。如果将常量复制并粘贴到测试中,是否会更安全?不是真的。更改常量只会让人更痛苦,特别是如果它的副本粘贴到多个测试中。这些测试不会测试它是否是正确的常量,它们只是测试这个常量是否从方法返回,所以现在我肯定会选择第二个测试。

        4
  •  3
  •   Dave Cousineau    10 年前

    testPI() {
       AssertEquals(PI, 3.14);
    }
    
    test_getPi() {
       AssertEquals(getPi(), 3.14);
    }
    

    但是,如果 PI getPi 是公共的方法来检索值,那么您只需编写 test_getPi ,如上所述,以及 圆周率 应该是 private testPI 单元测试。后一种情况可能更像你应该做的。

    我想你可以做第三次这样的测试:

    test_getPi_PI_AlwaysAgree() {
       AssertEquals(getPi(), PI);
    }
    

    这意味着这两段代码的值应该总是相同的,不管这个值是什么。 如果

    注意,最后一个测试并没有这么说 有望回归 3.14 ,只有两段代码应该具有相同的值,而没有任何指示该值是什么。要断言其中一个的值应该是某个特定的值,请使用前两个测试之一。

        5
  •  2
  •   MrUpsideDown    16 年前

    1. 如果您正在测试一个对计算结果至关重要的常量,如您的示例中所示,我认为最好使用一个独立的测试,而不是重复使用您试图测试的代码中的相同常量。与直接测试常量值不同,我将测试(例如)函数CalculateAreaOfCircle(),它将验证面积公式是否正确,同时验证PI的值。

    2. 我认为重用枚举和其他常量是有意义的,这些常量不会直接影响代码关键部分的结果。

        6
  •  2
  •   Gishu    16 年前

    我使用第一种形式——尽管它复制了值(仅两次),但可读性更高。

    [Test]
    public void GetPIReturns3_14()
    {
      Assert.AreEqual(3.14, testSubject.GetPI());
    }
    

        7
  •  1
  •   Igor Zevaka    16 年前

    当然是第二种形式,常量的目的是不引入“幻数”。现在,在单元测试中,你经常使用幻数,这没关系。