Unit testing 使用';仅为每个特征方法设置/清理一次;其中:';块
斯波克在等级库级别上有Unit testing 使用';仅为每个特征方法设置/清理一次;其中:';块,unit-testing,spock,Unit Testing,Spock,斯波克在等级库级别上有setupSpec。对于单个测试用例级别,我希望有类似的东西 这在斯波克可能不可用,是否有人对此有解决方法 void“测试某物”(){ 设置: User=createUser() 什么时候: user.setAddress(新地址(zipCode:inputZipCode,city:inputCity)) 然后: user.address.city==输入城市 user.address.zipCode==inputZipCode 清理: 删除用户(用户) 哪里: input
setupSpec
。对于单个测试用例级别,我希望有类似的东西
这在斯波克可能不可用,是否有人对此有解决方法
void“测试某物”(){
设置:
User=createUser()
什么时候:
user.setAddress(新地址(zipCode:inputZipCode,city:inputCity))
然后:
user.address.city==输入城市
user.address.zipCode==inputZipCode
清理:
删除用户(用户)
哪里:
inputCity | inputZipCode
“a”|“1”
“b”|“2”
}
在每次迭代之后都不必要地创建和删除用户
- 是否可以为单个测试而不是类级别设置la-
setupSpec
- 可以操纵测试用例来使用setupSpec/CleanupSpec类,甚至可以创建一个新的测试(使用@Stepwise)来实现这一点,但我正在寻找一些好的解决方案,而不是黑客
- 我认为这很难看,因为它涉及到手工记账。我不建议你这样做,但无论如何:
package de.scrum\u master.stackoverflow.q57721328
导入spock.lang.See
导入spock.lang.Shared
导入spock.lang.Specification
导入spock.lang.Unroll
类OneTimeSetupCleanupParametriedTest扩展了规范{
@共享用户
@共享整数迭代
用户createUser(){
//仅当迭代==0时设置测试夹具(或者,如果夹具未初始化,则可选)
用户?:新用户()
}
void deleteUser(用户userInstance){
//仅当迭代==总迭代次数时,才清理计数器(和测试夹具,如果有)
if(++iteration==specificationContext.currentIteration.EstimatedNumierations){
userInstance.delete()
用户=null
迭代=0
}
}
//@展开
无效“测试某物”(){
设置:
//为每个迭代调用initialiser helper,这取决于它只会
//如果还不存在文本装置,请创建文本装置
user=createUser()
什么时候:
user.setAddress(新地址(zipCode:inputZipCode,city:inputCity))
然后:
user.address.city==输入城市
user.address.zipCode==inputZipCode
清理:
//为每个迭代调用clean-up-helper,这取决于它只会
//在最后一次迭代中清理夹具
删除用户(用户)
哪里:
inputCity | inputZipCode
“a”|“1”
“b”|“2”
}
静态类用户{
地址
用户(){
println“创建用户”
}
无效设置地址(地址){
this.address=地址
}
作废删除(){
println“删除用户”
地址=空
}
}
静态类地址{
字符串zipCode,城市
}
}
控制台日志:
创建用户
删除用户
更新:斯波克手册上说: 迭代之间的对象共享 为了在迭代之间共享对象,必须将其保存在@Shared或static字段中 注意:只有
@Shared
和static
变量可以从块中访问,其中:
块
请注意,此类对象也将与其他方法共享。目前还没有一种好方法可以在同一方法的迭代之间共享一个对象。如果您认为这是一个问题,请考虑将每个方法放入单独的规范中,所有这些方法都可以保存在同一个文件中。这以一些样板代码为代价实现了更好的隔离
对我来说,完全不清楚你想要实现什么。如果希望对整个规范(测试类)执行一次操作,请使用
setupSpec()
。如果要为每个功能方法执行此操作,请使用setup()
。如果只需要一种方法,请使用设置:
。所有可能的情况都包括在内。你还需要什么?您真的不想在数据集的下一次迭代中泄漏上下文,其中:
数据集。您创建的用户在迭代过程中被操纵。在迭代之间设置和清理测试夹具是有意义的,以便使测试彼此独立。这只是一个示例,假设我想测试一些完全不同的东西,在用户对象中没有修改。如果这是一个集成测试用例,创建和删除用户需要花费太多时间,我不想对everywhere块重复这一点(如果有太多数据驱动规范)。我理解测试应该尽可能的独立,但我只是想知道是否已经有一种方法可以做到这一点。我能看到的唯一解决方案是使用AST转换为单个测试提供setupSpec
和cleanupSpec
,这些测试不会在任何地方重复。正确的方法是编写自定义扩展。如果你注册了合适的拦截器,你就可以实现你想要的。请参见内置RetryExtension
和mode=FEATURE
作为示例。