【问题标题】:How to tell Spock which class to run in specific order如何告诉 Spock 以特定顺序运行哪个类
【发布时间】:2018-02-26 10:17:21
【问题描述】:

我正在使用 Spock 进行测试,并且我有多个类要测试。我想告诉 Spock 以特定顺序测试每个类。有没有办法做到这一点?我注意到TestNG有@AfterTest注解,那么Spock有类似的吗?

【问题讨论】:

  • 你的意思是你有多个Specifications?还是Specification 中的多个测试?
  • 我有多个扩展规范的类
  • 如果您的测试套件依赖于规范的顺序,而规范依赖于特征方法 (FM) 的顺序,那么您的测试套件就会损坏。远离那个。一个规范要独立于其他规范,一个FM要独立于同一规范中的其他FM。我是一名敏捷教练,在我最近的一个项目中,有一个包含数千个测试的大型 Spock/Geb 测试套件,而在一个非常复杂的 Geb 集成测试中,我们使用了@Stepwise,因为它测试了一个长页面流,包括由合作伙伴托管的外部系统。顺便说一句,我们仍然对@Stepwise 感到难过。
  • 您有 2 个单独的问题。一个与规格顺序有关,另一个与@AfterTest 有关。规范订单已在下面回答。 “我注意到 TestNG 有 @AfterTest 注释,那么 Spock 有类似的东西吗?” - 你可能想要@AfterClass。另一种方法是在您的规范中有一个名为 cleanupSpec() 的方法。

标签: groovy spock


【解决方案1】:

您不能指定 Spock 测试类的执行顺序。但是 Spock 允许您在将 @Stepwise 注释添加到测试类时指定方法执行顺序 - 在这种情况下,Spock 将按从上到下的顺序执行所有方法,如果一个方法失败,它将忽略此测试类中的其余方法。

表示规范的特性方法应该按照声明的顺序依次运行(即使存在并行规范运行器),始终从第一个方法开始。如果一个方法失败,其余的方法将被跳过。在超规范和子规范中声明的功能方法不受影响。

@Stepwise 对于方法之间具有(逻辑)依赖关系的规范很有用。特别是,它有助于避免在方法失败后出现连续错误,从而更容易理解真正出了什么问题。

参考:http://spockframework.org/spock/javadoc/1.1/spock/lang/Stepwise.html

@Stepwise
class StepwiseExample extends Specification {

    def "first test method to run"() {
        // ....
    }
    
    def "second test method to run"() {
        // ....
    }
    
    def "if previous method failed this one will be ignored"() {
        // ....
    }
}

使用org.junit.runners.Suite

Jeff Scott Brown 对 JUnit 的@Suite.SuiteClasses 给出了很好的评价。在这种情况下,您创建一个类,您可以在其中将测试类(规范)聚合到单个测试套件中,并且这些类将按照它们在套件中定义的顺序执行。考虑以下示例:

import org.junit.runner.RunWith
import org.junit.runners.Suite

@RunWith(Suite)
@Suite.SuiteClasses([
        Test2Specification,
        Test1Specification
])
class TestSuiteSpecification { }

此套件按定义的顺序执行两个规范 Test2SpecificationTest1Specification

【讨论】:

  • 感谢@Szymon,我已经在使用 Stepwise。它按照我想要的顺序运行测试,但它没有按照我想要的顺序运行类,所以恐怕这不是我需要的。抱歉不清楚。
  • @groovierthangroovy 这是您可以使用 Spock 实现的唯一有序执行。您不能像我在第一段中提到的那样指定测试类(规范)的顺序。基本上你不应该设计你的测试以特定的顺序运行 - 每个单元测试都是独立运行的,它不应该依赖于其他测试的副作用。
  • @SzymonStepniak “这是您可以使用 Spock 实现的唯一有序执行。” - 标有@SuiteClasses 的套件不再有效吗?
  • @JeffScottBrown 感谢 Jeff 的评论。你是对的,使用 @SuiteClasses 可能适用于 OP。谢谢!
猜你喜欢
  • 2020-07-26
  • 2015-11-21
  • 1970-01-01
  • 1970-01-01
  • 2012-06-04
  • 2020-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多