java的行为驱动开发 - 使用什么框架?

Oli*_*POP 29 testing bdd automated-tests jbehave spock

对于正在进行的项目和改进我们的开发过程,我们考虑采用TDD作为开发理念.在研究最佳实践以及如何向同事/开发人员"推销"新方法的过程中,我遇到了BDD,并发现它更适合我们需要的东西,并且不知何故是TDD的下一次迭代.问题是到目前为止我只尝试过Dan North,JBehave开发的工具,我不能说我很惊讶.

设置在我看来很麻烦,我找不到非常合适的文档.在另一方面我试着也斯波克的常规工具,到现在我挺喜欢.

问:有没有适合BDD的工具?
问:你会使用spock来处理引入另一种语言的开销吗?

sod*_*ody 40

行为驱动开发只是一种无需任何工具即可使用的技术.您可以用BDD样式编写测试 - 例如should,使用此方法启动测试方法并引入一些单独的功能.Whenthen部分可以只用注释替换,例如

@Test
public void should_do_something() {
    // given
    Something something = getSomething();

    // when
    something.doSomething();
    // then 
    assertSomething();

    // when
    something.doSomethingElse();
    // then 
    assertSomethingElse();
}
Run Code Online (Sandbox Code Playgroud)

我对上述框架的看法:

  • JBehave的问题在于测试看起来像一个复杂的宇宙飞船.另一方面,它有适合您的规格的输出.

  • spock真的很酷.紧凑的语法,漂亮的输出,许多功能,使用强大的groovy语言编写,这意味着可以与geb一起使用.它很时髦,对某些人来说非常重要.

  • scalatest(用scala编写)和easyb(用groovy编写)都有与spock相同的缺点."......应该......"和"给定...然后"符号.规范在.story文件中,步骤实现在Java类中.这种方法作为定义规范的协作和通信工具非常有效,但对于低级编码通常会花费太多开销.

我还认为最成功的Java BDD框架是那些不是用Java编写的,因为Java语言没有Groovy或Scala创建的DSL(域特定语言)创建的灵活性.

  • 一个人的意见.我对spock有很棒的体验.测试Java代码没有问题,并且groovy对于Java程序员来说非常容易.您可以开始编写常规Java并继续工作,然后在需要时学习Groovy时逐渐采用更简洁的样式.我对Groovy持怀疑态度,但spock使用起来非常高兴,这不仅仅是为了回报学习一点Groovy的最小努力. (10认同)

Jan*_*fer 15

作为JGiven的作者,我不得不反对Java没有足够的灵活性来创建DSL.在JGiven中,BDD测试看起来如下:

@Test
public void users_can_login {
    given()
       .a_registered_user()
       .and().the_login_page_is_shown();

    when()
       .the_user_enters_correct_credentials()
       .and().the_login_button_is_pressed();

    then()
       .the_welcome_page_is_shown();
}
Run Code Online (Sandbox Code Playgroud)

JGiven与JUnit或TestNg一起使用,您可以用普通Java编写测试.

  • 我不同意你我的朋友.你所呈现的与DSL无关.它是Java的一种流畅的API(基于静态方法),但恕我直言不太可读也不可用. (2认同)
  • 也许我写了太多的Java,甚至不再看到括号:-).但是,由于JGiven是一个Java框架,因此它也可以在Groovy和Scala中使用.在Groovy中你至少可以删除分号,在Scala中你也可以省略括号. (2认同)

dkl*_*dkl 13

除非您的产品所有者/ qa /客户需要能够阅读测试,否则请使用Spock.它是一个非常简单的工具,但提高了测试的可读性.由于它强大的功能,你不需要Mockito,Hamcrest和AssertJ.它具有极好的参数化测试.事实上,它"只是"一个更好的JUnit - 一个自动执行简单任务的通用工具,无论是单元测试,集成测试还是验收测试.

害怕Groovy?为什么?它与java非常相似.学到的越多,代码就越有表现力,也越短.您的测试将更短,更易读.Groovy是JVM更好的一面的门户药物.

不喜欢动态语言?好吧,它是测试,每次提交后测试都由CI服务器运行,对吧?如果您的代码中断,您将在几分钟后知道它.没有CI服务器或没有定期运行测试?然后不要费心选择测试框架并修复您的过程.破损的测试是没用的,如果你不经常进行测试,它们很快就会破裂.

如果需要,可以使用JBehave/Cucumber; 否则,请使用Spock.