4

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

话虽如此,Spock 与 TestNG 相比有 3 个优势:

详细信息 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?@部署应用?借助 Spock 的基于拦截的扩展机制,您可以轻松创建自己的扩展。

有没有人对为什么一个可能比另一个更好有任何意见?

两者都有缺点吗?

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

4

2 回答 2

4

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

Geb 将与 spock 和 TestNG 一起使用。

总的来说,我对 spock 的体验非常好,但无法与 TestNG 交谈。

我确实希望 spock 有像 Cucumber 这样的 BDD 样式报告和像 ScalaCheck 这样的属性样式测试,但就直接的 TDD 样式测试而言,spock 具有表现力、易于使用、功能丰富且设计得非常好。与 JUnit 之类的东西相比,spock 是一种乐趣——只需要很少的仪式。

于 2014-01-26T22:26:15.403 回答
3

我使用 TestNG 几年了,有几个项目,我对它很满意。从您的问题中回答具体问题

美丽的语言

测试方法名称必须是有效的 Java 方法名称。这意味着没有空格。我以 should 开始我的方法,因此我将您的方法命名subscribers receive published events at least onceshouldSubscrbersReceiveEvents. 我相信这个较短的名字描述的意图已经足够好了。骆驼案例名称不像正确的句子那样可读,但我没有其他选择。

Given-when-then 部分

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);
    }

详细资料

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

当您拥有 时import static org.assertj.core.api.Assertions.*;,只需从 IDE 中键入assertThat(something).和完成代码即可指导您。您使用的断言越好,您的测试就越可读,您将获得更好的错误消息。

可扩展

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

概括

对我来说,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 ).

2018 年 10 月更新

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

我在几个商业项目中使用过 jUnit5,对此我很满意。

Junit5 仍然是纯 Java,因此没有像 spock 中那样对给定的当时间段或断言提供语言级别的支持。我仍然使用 AssertJ 和其他一些配套工具(例如:https ://github.com/awaitility/awaitility用于测试异步操作)

于 2016-10-09T13:32:22.457 回答