Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 使用';仅为每个特征方法设置/清理一次;其中:';块_Unit Testing_Spock - Fatal编程技术网

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
      作为示例。