【问题标题】:How do I control order of test execution within a single integration test file?如何控制单个集成测试文件中的测试执行顺序?
【发布时间】:2014-06-20 19:39:57
【问题描述】:

我正在使用 Maven 3.0.3、Failsafe 插件 v2.17 和 JUnit 4.11。目前我有一个集成测试,按以下顺序进行测试

@RunWith(SpringJUnit4ClassRunner.class)
public class MyTests {

    @Test
    public final void testAdd() {
        …
    }

    @Test
    public final void testUpdate() {
        …
    }

    @Test
    public final void testDelete() {
        …
    }

目前,当我通过 Maven 作为“mvn clean install”运行的一部分运行测试时,“testDelete”在“testAdd”或“testUpdate”之前运行。如果我将名称更改为“testZZZDelete”,那么它会在最后运行,但我不喜欢这样。

如何让测试按照我在文件中指定的顺序运行?我的故障安全配置是这样的:

<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-failsafe-plugin</artifactId>
        <version>2.17</version>
        <configuration>
                <reuseForks>true</reuseForks>
                <argLine>-Xmx4096m -XX:MaxPermSize=512M ${itCoverageAgent}</argLine>
        </configuration>
        <executions>
                <execution>
                        <goals>
                                <goal>integration-test</goal>
                                <goal>verify</goal>
                        </goals>
                </execution>
        </executions>
</plugin>

【问题讨论】:

  • 最好是使用集成测试框架而不是单元测试框架。使用testng,您可以在其中控制集成测试的依赖关系等,这意味着您可以定义测试方法的执行顺序,无论它们如何通过@test(dependsOnMethods={"m1", "m2§´"} 等注释命名。 JUnit 不适用于集成测试。无需对字母顺序等做出假设。
  • 我被带入这个项目很晚,此时,没有将数百个测试转换为 TestNG 的奢侈,尽管有空时肯定会向小组推荐它。在此期间,您有什么想法可以在给定约束的情况下解决问题?

标签: maven junit integration-testing maven-failsafe-plugin


【解决方案1】:

简短的回答:不,除了重命名测试以便它们按顺序执行之外,别无他法。您可以使用@FixMethodOrder(NAME_ASCENDING) 注释来确保测试按字母顺序执行。

长答案:我相信您知道,surefire/failsafe 为您提供了通过runOrder 配置参数订购测试 的选项。这控制了每个测试类的执行顺序。因此,您可以在 foobar.Test2 之前运行类 foobar.Test1 或反之。

对于类中方法的执行顺序,您面临的问题是 JVM 不会按照在文件中声明的顺序返回方法列表。在 Java 6 中,它们返回的顺序通常是声明的顺序,但在 java 7 中发生了变化。因此,随着 JUnit 4.11 的发布,默认顺序更改为基于方法名称的哈希值,给出确定性但不可预测的顺序。这就是为什么您要先运行 testDelete。

After a long discussion,我们在 JUnit 4.11 中添加了 FixMethodOrder 注释,以允许某人至少能够重命名他们的方法。这似乎适用于SpringJUnit4ClassRunner - 至少适用于最新版本4.1.0.RELEASE。我还没有尝试过其他版本。

因此,为了获得可预测的顺序,您可以在必要时重命名您的方法以按照您想要的顺序执行,并将 @FixMethodOrder 注释添加到类中。

@RunWith(SpringJUnit4ClassRunner.class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class MyTests {

@Test
public final void step1Add() {
    …
}

@Test
public final void step2Update() {
    …
}

@Test
public final void step3Delete() {
    …
}

更多信息请查看Has JUnit4 begun supporting ordering of test? Is it intentional?

【讨论】:

    【解决方案2】:

    首先,让测试相互依赖通常是不好的做法,但我意识到这是一个最纯粹的观点,如果到达那个状态真的很慢以至于你必须继续,那么我会说你应该看看在这个post 上提供的答案,我个人会选择第二个选项,因为注释使它变得很好和明确。

    【讨论】:

    • 无论你做什么类型的测试,依赖测试都是不好的,如果它们可以避免,它们应该是。一个正常的场景是说你有一个登录测试,它以一个断言结束,这个断言可能对登录场景很重要,但与你依赖它的所有其他测试无关。有人打破了这个测试,现在它打破了你检查的每一个测试,这使得很难确定你的检查做了什么,没有打破。此外,依赖测试开始添加附带的细节,在测试中执行操作是否会破坏它或者它是否只是因为系列等而破坏......
    • 如果他想要依赖测试的唯一原因是速度,那么我只建议在您的测试套件中添加并行化。但是,我同意您的评论并说使用 testng 并不是一个坏主意,老实说,将一组测试从 junit 更改为 testng 可能需要十分钟的时间。
    • 这似乎是一个很好的解决方案,但我已经定义了一个 @Runwith 注释(问题已被编辑)。运行带有两个 RunWith 注释的测试类有什么技巧吗?
    • 而不是 BlockJUnit4ClassRunner 使用注释扩展您当前在运行中使用的运行器。
    • 我明白你所说的扩展。但是我将如何编写一个比较器来告诉系统按照它们在文件中出现的顺序执行测试方法?我是否必须对我正在处理的每个文件的列表进行硬编码?
    【解决方案3】:

    我认为 TestNg 提供了以用户定义的顺序执行测试的选项。

    @Test(dependsOnMethods='testAdd')
    public final void testAdd() {
        …
    }
    
    @Test(dependsOnMethods='testAdd')
    public final void testUpdate() {
        …
    }
    
    @Test(dependsOnMethods='testUpdate')
    public final void testDelete() {
        …
    } 
    

    因此,如果编译器尝试执行“testUpdate”测试,则执行时会增加一个限制。 testUpdate 函数取决于“testAdd”函数。所以编译器将首先执行“testAdd”,然后继续执行“testUpdate”函数。

    希望测试应该从 JUNIT 迁移到 TestNg。

    【讨论】:

      【解决方案4】:

      这个 JUnit 补丁实现了这个功能https://github.com/adko-pl/junit/commit/4421261dbdcaed8ff0a82f4d5229ac8ad6c97543,认为作者似乎没有将 order 参数添加到 org.junit.Test 注释中,使用修补过的 JUnit 将比调整所有当前测试更容易在不同的框架恕我直言。

      How to run test methods in specific order in JUnit4?

      【讨论】:

      • 所以你的答案是添加“@FixMethodOrder(NAME_ASCENDING)”注释吗?我无法通过遵循这一系列链接来判断,但这就是我所看到的。
      • 该 JUnit 补丁使用新的 org.junit.Test 属性来指定测试顺序。有了它,您可以将@FixMethodOrder(METHOD_ORDER)@Test(order=1)@Test(order=2) 等添加到您的测试方法中。查看 src/test/java/org/junit/internal/MethodSorterTest.java 中的变化。
      猜你喜欢
      • 1970-01-01
      • 2012-08-18
      • 1970-01-01
      • 2021-06-22
      • 1970-01-01
      • 2020-03-18
      • 1970-01-01
      • 2015-11-24
      • 1970-01-01
      相关资源
      最近更新 更多