Unit testing 使用BDD样式命名测试类;什么时候;及其维护后果
根据我的理解,真正的BDD更多的是满足业务规范,但我认为从类级别的行为开始可能是值得的,因为我正在努力采用TDD,BDD命名使之更容易 让我们关注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
@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{}
它解决了什么问题
我第二次尝试使用内部类解决问题。 它解决了什么问题
无论如何,如果您不同意所有这些,并且仍然希望找到给定类的测试,您可以使用IDE并在测试文件夹中找到类的用法,并且您有一个测试列表,该列表以毫秒为单位练习该类并带有可导航的链接。感谢您指出groovy/spock,我将检查它们。我很乐意与您联系您提到的完整BDD的状态,但我的第一步是从类级别开始。我发现类级别测试的行为在文档编制和查找bug的根本原因和影响方面非常有意义和有用。