Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我是否应该为A类编写测试,如果它';这是B类保险_Java_Unit Testing - Fatal编程技术网

Java 我是否应该为A类编写测试,如果它';这是B类保险

Java 我是否应该为A类编写测试,如果它';这是B类保险,java,unit-testing,Java,Unit Testing,我想了解一些关于测试方法的意见 假设我们有A类和B类。B类使用A类的功能。B类经过全面测试,因此一些测试覆盖率也间接应用于A类 我应该直接为A类编写完整的测试吗?或者我应该只测试而不测试类功能 我这样问是因为将来可能会删除或修改B类,因为它可能不会使用来自某个类的相同功能,因此可能会留下一些未经测试的方法。你会怎么做?是的,你应该全面测试A B可能会在将来的某个时候发生变化,所以现在使用A并不意味着它总是会发生变化 B可能不会使用A的所有功能,这意味着您没有测试所有代码 B应仅通过接口IA使用A

我想了解一些关于测试方法的意见

假设我们有A类和B类。B类使用A类的功能。B类经过全面测试,因此一些测试覆盖率也间接应用于A类

我应该直接为A类编写完整的测试吗?或者我应该只测试而不测试类功能


我这样问是因为将来可能会删除或修改B类,因为它可能不会使用来自某个类的相同功能,因此可能会留下一些未经测试的方法。你会怎么做?

是的,你应该全面测试
A

  • B
    可能会在将来的某个时候发生变化,所以现在使用
    A
    并不意味着它总是会发生变化

  • B
    可能不会使用
    A
    的所有功能,这意味着您没有测试所有代码


  • B应仅通过接口IA使用A

    通过它的公共接口测试B,通过它的公共接口测试A


    两者都应该测试。

    一定要为A类写完整的测试。你在这里回答了自己的问题:


    (…)将来可能会删除或修改B类,因为它可能不会使用某个类中的相同功能,因此可能会留下一些未经测试的方法。

    单元测试背后的一般思想是,每个单元都由一个工作单元组成。这可以小到一个方法,也可以大到几个方法一起工作


    您已经介绍了B依赖于A的场景,但从您的故事中,我们可以假设A也将单独使用。因此,A也应该被测试,因为它是一个独立的工作单元。

    我认为你的答案是正确的:
    将来有可能删除或修改B类


    我认为对于a的测试套件来说,这是一个很好的例子。

    你应该先测试a,然后测试B。如果你在B上测试失败,你将没有足够的诊断来知道它是源于B的代码还是源于a的代码

    单元测试不仅仅是关于“通过/失败”,它们在很大程度上是关于诊断问题。

    CLASSES!=单位 如果你练习一个好的TDD,你会很容易理解背后的原因。
    在我看来,你应该测试
    B
    的行为,而不是基于
    A
    已经被测试的事实

    事实上,有三种情况:

    属于同一层的
    A
    B

    • 如果
      A
      是通过
      B
      的重构周期(提取类)创建的(在练习好的TDD时经常发生),那么
      A
      应该完全没有经过测试!根本不需要测试它
      事实上,代码的结构(在这种情况下,类的分离/SRP)应该独立于单元概念
      B
      A
      在这种情况下属于同一单元

    • 如果
      A
      B
      之前就存在
      B
      不应该基于这一事实,应该测试
      B
      的整个行为

    A
    B
    不属于同一层(例如不同):

    • 如果
      B
      是一个GUI类,
      a
      是一个业务类,那么在测试
      B
      a
      应该加倍/模拟,并且
      a
      应该有一个专门针对它的完整测试。
      事实上,领域架构不应该与
      行为/特性
      概念混为一谈
    要了解原因,请阅读Bob叔叔最近关于这个概念的文章:

    摘录:

    一个常见的误解是,测试的设计必须反映 生产代码的设计。正如作者所说,TDD不需要 建议“系统中的每个单元都与 设计良好的[…]单元测试。”事实上,这就是 我们中的许多人已经不再称之为“单元”测试

    注意:TDD不关心“未来”,相反,它帮助您编写所需的代码,而不是更多。因此,您不必担心:

    在未来,B班有可能被取消 删除或修改


    如果您编写了良好的测试(我更喜欢“specs”一词),那么这种删除将立即被检测到

    “Unit”一词并不像它期望的那样是Unit:你能澄清一下你指的是什么吗?正如我在本主题中的回答所解释的那样,
    A
    很可能只是重构(extract类)的结果,在这种情况下,从逻辑上讲,它的所有行为都已经被调用方在测试其行为时隐式地测试过了。如果是这种情况,那么我根本不会测试
    A
    ,因为代码结构(重构)与行为无关。“如果A在B之前存在……B的整个行为都应该测试。”你是说A的整个行为?@tobi不,我的句子是正确的。我的意思是:如果A在B之前存在,这不是对B进行部分测试的理由,假设A的测试中已经测试了一些共同点。在这两种情况下,无论是“之前”还是“之后”,B业务规则都是完全测试的。@Mik378我意识到这是一个古老的答案,但是在您描述的第二个案例中,一个bug可能会导致多个测试失败,我认为这与单元测试“最佳实践”相违背。如何避免这种情况?听起来您好像在争论units==类。有了这种理念,你最终会有很多重复的报道,导致本文中描述的问题。@JeremyRoss-我当然不会把类等同于单位。我只是指出,依赖类之间的相互依赖性来实现测试覆盖率将导致将来的问题。最好有那些