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
Unit testing 使用BDD样式命名测试类;什么时候;及其维护后果_Unit Testing_Junit_Tdd_Naming Conventions_Bdd - Fatal编程技术网

Unit testing 使用BDD样式命名测试类;什么时候;及其维护后果

Unit testing 使用BDD样式命名测试类;什么时候;及其维护后果,unit-testing,junit,tdd,naming-conventions,bdd,Unit Testing,Junit,Tdd,Naming Conventions,Bdd,根据我的理解,真正的BDD更多的是满足业务规范,但我认为从类级别的行为开始可能是值得的,因为我正在努力采用TDD,BDD命名使之更容易 让我们关注BDD风格的单元测试(在类级别)。 @RunWith(Suite.class) @Suite.SuiteClasses({WhenLionIsHungy.class, WhenLionHunts.class, WhenLionIsWithCubs.class }) pu

根据我的理解,真正的BDD更多的是满足业务规范,但我认为从类级别的行为开始可能是值得的,因为我正在努力采用TDD,BDD命名使之更容易

让我们关注BDD风格的单元测试(在类级别)。

@RunWith(Suite.class)
@Suite.SuiteClasses({WhenLionIsHungy.class,
                     WhenLionHunts.class,
                     WhenLionIsWithCubs.class
})
public class LionTest{}
我开始按照建议使用“When”以反映预期行为的方式命名测试类。这真的很有效。然而,很快,我就意识到这样的测试类名可能会产生以下维护后果

要为手头的类找到测试类并不容易。

我习惯了传统的命名方式“ClassnameTest”,在这种情况下,我可以很快找到测试类


我使用Java和JUnit4,不幸的是,我没有像given这样的内置语言结构

让我们考虑下面的例子。

public class Lion{...}
测试班

public class WhenLionIsHungy{
    @Test public void should_eat_meat(){...}
    @Test public void should_not_eat_grass(){...}
    @Test ...
}

public class WhenLionHunts{...}

public class WhenLionIsWithCubs{...}
...
请原谅我的例子。假设它们都是有效的测试类。我们不必担心它,除非您确定我们不应该为一个目标类拥有多个基于行为的测试类

BDD是将测试转化为文档的优雅解决方案,上面的示例反映了这一点。测试“testMoneyTransfer()”这样的方法根本无法提供任何见解

上面是一个很好的例子,但是猜测一个名为“LibraryServiceImpl”的类的测试类将是一场噩梦

是在请求图书时,还是在关闭图书馆时,还是两者都关闭,还是其他什么时候

单元测试应作为完整或某种程度上的文档。然而,在LibraryServiceImpl案例中,文档本身并不容易发现

即使您正确地命名了一个类并使用SRP进行设计,也很难找到测试类,因为搜索引用也可能会在测试文件夹中返回100次点击


我第一次尝试使用@Suite解决问题。

@RunWith(Suite.class)
@Suite.SuiteClasses({WhenLionIsHungy.class,
                     WhenLionHunts.class,
                     WhenLionIsWithCubs.class
})
public class LionTest{}
它解决了什么问题

  • 很容易找到一个类的测试类,因为我以目标类名命名它
  • 一个类在一个地方的所有类型的高级行为。就我个人而言,我觉得这更有见地
  • 它介绍了什么

  • 空类,没有任何目的,只是将“When”类分组。我不完全确定这是否是一个更大的问题,但拥有它们确实感觉很奇怪

  • 我第二次尝试使用内部类解决问题。

    它解决了什么问题

  • 很容易找到一个类的测试类,因为我以目标类名命名它
  • 没有更多的空类
  • 有点容易理解这门课的要点。(IDE可以提供概要)
  • 它介绍了什么

  • 荒谬的冗长课程。然而,不可能在一个地方把所有的文件都放在一个紧凑的地方,并且同样可读
  • 使用静态内部测试类?听起来对吗
  • 我希望我不必完全回到以目标类命名测试类,但“为手头的类很容易找到测试类”似乎是一个不容忽视的主要问题

    请分别提供您对上述解决方案的意见

    如果你能想出其他的方法,那就太好了。

    “我使用Java和JUnit4,不幸的是我没有像given那样的内置语言结构”

    如果您使用的是JVM,那么就可以使用groovy/spock,将spock集成到java项目中非常容易,这是值得付出努力的。试试看

    我不认为为具体的生产类找到测试类是您真正需要的。BDD its的一个特点是,您可以根据正在开发的特性组织测试,实现此功能的类是一个实现细节。通常,当您在寻找一些测试时,您的应用程序实际上是在寻找,因为您希望验证/检查/修复应用程序中的某些功能

    事实上,问题是找不到LibraryServiceImpl的测试,这里的问题是有一个同名的类。“Library”这个名称中唯一的信息“ServiceImpl”是噪音。在这一点上,问题可以改为“查找库功能的测试”,稍微好一点,但是如果您在应用程序中有很多与库相关的功能,那么这个类可能可以在具有有意义的名称的类中分开,例如LibraryBooksReturnPolicy或LibraryNewBooksRegister(只有样本,可能是坏样本,但你可以得到这个想法)

    BDD/TDD它不仅是一种测试技术,也是一种驱动您的设计、为您的类找到合适名称的技术。如果在一个好的设计中最重要的事情之一,您不能花很多精力寻找语义和伟大的方法来命名您的测试代码(无论如何,这是一种很好的努力),并用“服务”、“管理者”等词来命名或者在生产代码上使用“impl!”


    无论如何,如果您不同意所有这些,并且仍然希望找到给定类的测试,您可以使用IDE并在测试文件夹中找到类的用法,并且您有一个测试列表,该列表以毫秒为单位练习该类并带有可导航的链接。

    感谢您指出groovy/spock,我将检查它们。我很乐意与您联系您提到的完整BDD的状态,但我的第一步是从类级别开始。我发现类级别测试的行为在文档编制和查找bug的根本原因和影响方面非常有意义和有用。