我们正在考虑实现一个测试框架,并对使用哪个框架感到好奇。我们正在测试和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"]
}
每个人都可以扩展@交易?@springbean?@DeployApp?使用Spock的基于拦截的扩展机制,您可以轻松创建自己的扩展。
有人对为什么一个人可能比另一个更好?
有任何意见吗?是否有倒下?
有没有一种方法可以在Testng的报告中创建"美丽的语言"?从本质上讲,我可以创建自己的标签并拥有为它们解析的程序吗?还是已经有第三方库添加?
对于UI自动化,请在尝试构建新框架之前先查看GEB。http://www.gebish.org
GEB将与Spock和testng一起使用。
总的来说,我在Spock方面确实有很好的经验,但不能与Testng说话。
我确实希望Spock拥有BDD样式报告,例如Cucumber和Scalacheck等物业样式测试,但是就TDD风格的直接测试而言,Spock具有表现力,易于使用,易于使用,功能丰富且设计良好。与Junit这样的事情相比,Spock是一个欢乐 - 几乎不需要仪式。
我正在使用TestNG几年,几个项目,我对此感到非常满意。回答您的问题
美丽的语言
测试方法名称必须是有效的Java方法名称。这意味着没有空间。我用应该开始我的方法,因此我将您的方法subscribers receive published events at least once
命名为shouldSubscrbersReceiveEvents
。我相信这个较短的名字描述了意图足够好。骆驼案的名称不像适当的句子那样可读,但我没有其他选择。
何时到达部分
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/效果最好。断言消息比普通测试或Junit的声明更好。Assertj提供流利的API。学习曲线很少。
当您拥有import static org.assertj.core.api.Assertions.*;
时,只需键入assertThat(something).
,而IDE的代码将指导您。您使用的断言更好,测试的可读性越多,您将收到的错误消息更好。
扩展
Spring对Testng有建立支持。您的测试必须扩展AbstractTestNGSpringContextTests
或AbstractTransactionalTestNGSpringContextTests
。然后,您可以将任何春季上下文,@Autowire春季bean加载到测试中,使用交易。
请参阅http://docs.spring.io/spring/docs/current/spring-framework-reference/html/integration-testing.html#testcontcontcontext-support-colport-clesses-classes-classes-classes-testng
摘要
对我来说,测试效果很好。您可以使用SPOCK测试您能够测试的所有内容。由于Testng是纯Java,因此编写测试的DSL不会像Spock中的Groovy那样丰富。但是我相信,testng assertj的学习曲线比SPOCK(对于Java开发人员)更顺畅。如果某人对学习兴趣感兴趣(也许您也想将Groovy用于生产代码?),那么Spock是很好的选择,值得一开始就进行学习。
对于学习测试,我强烈建议您使用Testng和Mockito'(http://practicalunittesting.com/)和'下一代Java测试:测试和高级概念'(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/awaitility进行测试异步操作)