TestNG vs Spock for Automation

问题描述 投票:4回答:2

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

话虽如此,Spock拥有3个优于TestNG的优势:

详细信息Spock的运行时收集大量信息,并在需要时将其呈现给您。条件不满意:

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"]
}

每个人都可以扩展@Transaction? @SpringBean? @DeployApp?使用Spock基于拦截的扩展机制,您可以轻松创建自己的扩展。

有没有人对为什么一个人比另一个人好?

是否有垮台?

有没有办法在TestNG的报告中创建“美丽的语言”?基本上我可以创建自己的标签,并有一个解析它们的程序?或者是否已经添加了第三方库?

unit-testing automation testng spock test-framework
2个回答
4
投票

对于UI自动化,在尝试构建新框架之前先看看Geb。 http://www.gebish.org

Geb将与spock和TestNG一起使用。

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

我希望spock有像Cucumber这样的BDD样式报告,以及像ScalaCheck这样的属性样式测试,但就简单的TDD样式测试而言,spock具有表现力,易于使用,功能丰富,设计精良。与JUnit之类的东西相比,spock是一种快乐 - 需要很少的仪式。


2
投票

我使用TestNG几年,一些项目,我很高兴。从您的问题中回答具体问题

Beautiful language

测试方法名称必须是有效的Java方法名称。这意味着没有空间。我用should开始我的方法,所以我将你的方法subscribers receive published events at least once命名为shouldSubscrbersReceiveEvents。我相信这个较短的名字描述的意图足够好。 Camel案例名称不如正确的句子可读,但我认为没有其他选择。

Given-when-then sections

TestNG没有内置功能来支持它。我正在使用注释手动执行此操作。对于以下功能没有框架支持:

  • 来自where:部分的参数。你可以使用@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);
    }

Detailed information

此功能属于断言库,而不是测试库。 TestNG具有内置断言库,但您可以使用任何其他库。对我来说https://joel-costigliola.github.io/assertj/效果最好。断言消息优于普通testNG或JUnit。 AssertJ提供流畅的API。学习曲线很少。

如果你有import static org.assertj.core.api.Assertions.*;,只需输入assertThat(something).并从IDE完成代码将指导你。您使用的断言越好,您的测试可读性就越高,您将获得更好的错误消息。

Extensible

Spring内置了对TestNG的支持。你的测试必须扩展AbstractTestNGSpringContextTestsAbstractTransactionalTestNGSpringContextTests。然后,您可以将任何Spring Context,@ Autowire spring bean加载到测试中,使用事务。

有关详细信息,请参阅http://docs.spring.io/spring/docs/current/spring-framework-reference/html/integration-testing.html#testcontext-support-classes-testng

Summary

对我来说,TestNG运作良好。您可以使用Spock测试您能够测试的所有内容。因为TestNG是纯Java,所以用于编写测试的DSL不会像Spock中的Groovy那样功能丰富。但我相信TestNG + AssertJ的学习曲线比Spock(Java开发人员)更平滑。如果有人有兴趣学习Groovy(也许你想将Groovy用于生产代码?)那么Spock是不错的选择,值得初期投资。

为了学习TestNG,我强烈推荐“使用TestNG和Mockito进行实际单元测试”(http://practicalunittesting.com/)和“下一代Java测试:TestNG和高级概念”(http://testng.org/doc/book.html)。

Update Oct 2018

以上帖子写于2016年。目前我们有Junit5。 Junit5缩小了junit4和TestNG之间的差距。有几个地方Junit5比testNG功能更丰富(例如:更好地支持参数化测试方法)。

我在很少的商业项目中使用过jUnit 5,我很满意。

Junit5仍然是纯java,因此对于给定的when-when-then-sections或断言没有语言级支持。我仍然使用AssertJ和其他一些配套工具(例如:https://github.com/awaitility/awaitility用于测试异步操作)

© www.soinside.com 2019 - 2024. All rights reserved.