Unit testing TestNG vs Spock用于自动化

Unit testing TestNG vs Spock用于自动化,unit-testing,automation,testng,spock,test-framework,Unit Testing,Automation,Testng,Spock,Test Framework,我们正在考虑实现一个测试框架,并对使用哪个框架感到好奇。我们在TestNG和Spock之间进行选择。这将是一个UI自动化框架,因此它应该尽可能少地处理模拟数据。我们的代码库将由Geb(Groovy)组成 也就是说,与TestNG相比,Spock有3个优势: 详细信息 斯波克的运行时收集了大量信息,并在需要时提供给您。 不满足的条件: max(a, b) == c | | | | | 3 1 3 | 2 false 优美的语言 用一种优美且极具表现力的规范

我们正在考虑实现一个测试框架,并对使用哪个框架感到好奇。我们在TestNG和Spock之间进行选择。这将是一个UI自动化框架,因此它应该尽可能少地处理模拟数据。我们的代码库将由Geb(Groovy)组成

也就是说,与TestNG相比,Spock有3个优势:

详细信息 斯波克的运行时收集了大量信息,并在需要时提供给您。 不满足的条件:

max(a, b) == c
|   |  |  |  |
3   1  3  |  2
          false
优美的语言 用一种优美且极具表现力的规范语言表达您的想法

def "subscribers receive published events at least once"() {
    when: publisher.send(event)
    then: (1.._) * subscriber.receive(event)
    where: event << ["started", "paused", "stopped"]
}
def“订阅者至少接收一次发布的事件”(){
时间:publisher.send(事件)
然后:(1..*subscriber.receive(事件)

其中:event对于UI自动化,在尝试构建新框架之前,先看看Geb。

Geb将与spock和TestNG一起工作

总的来说,我对spock有很好的经验,但不能和TestNG说话


我真希望spock有Cucumber之类的BDD风格的报告,ScalaCheck之类的属性风格测试,但就直接的TDD风格测试而言,spock表现力强、易于使用、功能丰富,而且设计得非常好。与JUnit之类的东西相比,spock是一种乐趣——几乎不需要什么仪式。

我使用TestNG已经有几年了,有几年的时间了我很满意这个项目。 回答你问题中的具体问题

优美的语言 测试方法名称必须是有效的Java方法名称。这意味着没有空格。 我用should开始我的方法,所以我会将你的方法命名为should subscrbersreceiveevents,订阅方至少接收一次发布的事件,我认为这个较短的名称描述意图已经足够好了。驼峰式的名称不如适当的句子可读,但我看不到其他选择

给出了当时的章节 TestNG没有支持该功能的内置功能。我正在使用注释手动执行此操作。对以下功能没有框架支持:

  • 参数从
    中提交,其中:
    部分。您可以使用
    @DataProviders
    进行此操作
  • then:
    部分中语句的断言。您必须自己编写断言(
    assertThat
我的样本测试:

 public void shouldUnmarshalDataHeader() throws IOException {
        //given DataHeader unmarshalled from InputStream
        DataHeader actual = sut.parseDataHeader(stringToInputStream(BINARY_DATA_HEADER));

        //when we create DataHeader using java API
        DataHeader expected = DataHeaderBuilder
            .sampleInstance(sut.dateTimeProvider.getLocalDateTime());

        //then those two objects are equal
        Assertions.assertThat(actual).isEqualTo(expected);
    }
详细资料 此功能属于断言库,而不是测试库。TestNG有内置的断言库,但您可以使用任何其他库。对我来说效果最好。 断言消息比来自普通testNG或JUnit的消息要好。 AssertJ提供了流畅的API,学习曲线很少

当您有
导入静态org.assertj.core.api.Assertions.*;
时,只需键入
assertThat(某物)。
IDE中完整的代码将指导您。您使用的断言越好,测试的可读性就越高,错误消息也就越好

可扩展 Spring内置了对TestNG的支持。您的测试必须扩展
AbstractTestNGSpringContextTests
AbstractTransactionalTestNGSpringContextTests
。 然后,您可以将任何Spring上下文@Autowire Spring bean加载到您的测试中,并使用事务

有关更多详细信息,请参阅

总结 对我来说,TestNG工作得很好。您可以使用Spock测试所有可以测试的内容。因为TestNG是纯Java,所以编写测试的DSL不会像Spock中的Groovy那样功能丰富。但是我相信TestNG+AssertJ比Spock(对于Java开发人员)有更平滑的学习曲线。如果有人对学习Groovy感兴趣(也许你也想在生产代码中使用Groovy?)

为了学习TestNG,我强烈推荐“使用TestNG和Mockito进行实用单元测试”(Practical Unit Testing with TestNG and Mockito)和“下一代Java测试:TestNG和高级概念”(Next Generation Java Testing:TestNG and Advanced Concepts)

2018年10月更新 上面的帖子是在2016年写的。目前我们有Junit5。Junit5弥补了junit4和TestNG之间的差距。在一些地方,Junit5比TestNG功能更丰富(例如:更好地支持参数化测试方法)

我在一些商业项目中使用过jUnit5,我对它很满意


Junit5仍然是纯java的,因此没有像spock中那样对when-then节或断言提供语言级别的支持。我仍然使用AssertJ和其他一些配套工具(例如:用于测试异步操作)

BDD样式的报告出现在1.0中;基于属性的测试有望在以后的版本中出现。