【问题标题】:How to change tests execution order in JUnit5?如何更改 JUnit5 中的测试执行顺序?
【发布时间】:2017-04-01 14:30:09
【问题描述】:

JUnit4 有@FixMethodOrder 注释,允许使用测试方法执行的字母顺序。有类似的JUnit5机制吗?

【问题讨论】:

标签: junit5


【解决方案1】:

编辑:JUnit 5.4 现已正式发布,因此不再需要使用快照。

现在 JUnit 5.4 可以做到这一点。

https://junit.org/junit5/docs/current/user-guide/#writing-tests-test-execution-order

要控制测试方法的执行顺序,请注释您的 使用@TestMethodOrder 测试类或测试接口并指定 所需的 MethodOrderer 实现。您可以实现自己的 自定义 MethodOrderer 或使用以下内置之一 MethodOrderer 实现。

字母数字:根据名称按字母数字对测试方法进行排序 和形式参数列表。

OrderAnnotation:根据值对测试方法进行数字排序 通过@Order 注解指定。

【讨论】:

  • 它适用于我,但只添加 dependencies { testImplementation "org.junit.jupiter:junit-jupiter-api:5.4.0-SNAPSHOT" testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.4.0-SNAPSHOT" } 就足够了
  • 我使用 maven pom.xml。此时我可以看到 5.4.0-M1 版本。据我所知,里程碑依赖对发展不利。不一样的版本怎么弄的? :O
  • 我如何订购测试课程?
  • @dmatej 目前你不能。但如果您需要,也可以添加评论:github.com/junit-team/junit5/issues/1948
【解决方案2】:

不,还没有。对于单元测试,执行顺序应该是无关紧要的。对于更复杂的测试,JUnit 的目标是provide explicit support - 测试排序将是其中的一部分。

【讨论】:

  • 从技术角度来看,执行顺序确实应该无关紧要,但从人的角度来看,随机顺序让我绊倒的次数太多了。我希望它们从测试运行到测试运行以相同的顺序执行。
  • 我认为,如果非确定性的顺序让您失望,那么您正在测试的代码具有隐含的时间依赖性,这使得它很难使用。我会优先解决这个问题,这对稳定测试套件有额外的好处。
  • 不同意,从 UI 的角度来看。人脑。例如。我正在运行一个包含 10 个测试的课程,其中 2 个测试失败,所以我的即时培训告诉我,当我跑步时,按从上到下的顺序查看失败的两个测试,例如第 2 个向下测试和第 4 个向下测试再说一遍。但是当它们没有以相同的顺序返回时,我必须(a)意识到没有一些奇怪的非确定性错误导致随机测试失败,它们只是顺序不同,并且(b)记住失败的通常愚蠢的测试名称并再次运行它以确保它们实际上始终失败。
  • 所以从技术上讲,我完全同意你的看法 - 以随机顺序运行很好 - 但为了理智起见,我想要 IDE 单元测试对话框上的一个小按钮,它允许我对测试运行 - 最好按代码中出现的顺序。
  • 是的,我现在使用 Intellij,我喜欢重新运行失败的测试功能 - 但“按代码顺序运行”是我的理想选择,我最终将测试方法命名为他们的代码顺序也是按字母顺序排列的。
【解决方案3】:

5.8.0 以上版本,也可以订购测试类。

src/test/resources/junit-platform.properties

# ClassOrderer$OrderAnnotation sorts classes based on their @Order annotation
junit.jupiter.testclass.order.default=org.junit.jupiter.api.ClassOrderer$OrderAnnotation

其他 Junit 内置类排序器实现:

org.junit.jupiter.api.ClassOrderer$ClassName
org.junit.jupiter.api.ClassOrderer$DisplayName
org.junit.jupiter.api.ClassOrderer$Random

其他方式(除了junit-platform.properties文件)设置配置参数参考here

您也可以提供自己的订购者。它必须实现ClassOrderer接口:

package foo;
public class MyOrderer implements ClassOrderer {
    @Override
    public void orderClasses(ClassOrdererContext context) {
        Collections.shuffle(context.getClassDescriptors());
    }
}
junit.jupiter.testclass.order.default=foo.MyOrderer

请注意,@Nested 测试类不能由 ClassOrderer 排序。

请参阅 JUnit 5 documentationsClassOrderer api docs 了解有关排序测试类的更多信息。

【讨论】:

    猜你喜欢
    • 2019-09-02
    • 1970-01-01
    • 2021-06-22
    • 2014-09-23
    • 1970-01-01
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多