2014-01-24 32 views
2

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

话虽这么说,有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的报告中创建“美丽的语言”?基本上我可以创建自己的标签,并有一个解析它们的程序?还是已经有第三方库添加?

感谢您的帮助。

回答

2

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

Geb将与spock和TestNG一起工作。

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

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

+1

BDD风格的报告进入1.0;希望在以后的版本中进行基于性质的测试。 –

+0

谢谢彼得! Spock真的很好 –

0

我正在使用TestNG几年,几个项目,我很满意它。 从你的问题回答具体点

美丽的语言

测试方法的名称必须是有效的Java方法名。这意味着没有空间。 我开始使用should的方法,所以我会将您的方法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/效果最好。 断言消息比简单的testNG或JUnit的更好。 AssertJ提供流畅的API。学习曲线很少。

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

可扩展

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)。