我使用 TestNG 几年了,有几个项目,我对它很满意。从您的问题中回答具体问题
美丽的语言
测试方法名称必须是有效的 Java 方法名称。这意味着没有空格。我以 should 开始我的方法,因此我将您的方法命名subscribers receive published events at least once
为shouldSubscrbersReceiveEvents
. 我相信这个较短的名字描述的意图已经足够好了。骆驼案例名称不像正确的句子那样可读,但我没有其他选择。
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 的支持。您的测试必须扩展AbstractTestNGSpringContextTests
或AbstractTransactionalTestNGSpringContextTests
。然后您可以将任何 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用于测试异步操作)