【问题标题】:Maintaining order of execution of tests in Junit在 Junit 中维护测试的执行顺序
【发布时间】:2019-12-08 21:16:47
【问题描述】:

目前,我正在测试一个具有 CRUD 操作的类(例如 Message)。按照后面使用的方法,我想以精确的创建、读取、更新和删除顺序测试所有操作。

由于 JUnit 中测试用例的执行顺序依赖于 JVM,我需要一些适当的方法来确保单元测试用例按照给定的顺序执行。

到目前为止,我想出了以下策略:

  1. 在 JUnit 4 中使用 @FixMethodOrder(MethodSorters.NAME_ASCENDING) 按名称升序执行方法。但是,这需要重命名测试用例,对我来说似乎不是最好的方法,因为将来需要添加更多测试用例,现有的测试用例可能需要重构。

  2. 对每个测试用例使用不同的 Message 对象。但是,我需要在每个测试用例之前创建/初始化它并删除它。这对我来说似乎违背了单元测试的概念,因为要测试update,我将不得不调用创建和删除,这不再使它成为一个单元测试用例。如果create 失败,这将导致readupdatedelete 测试也失败,即使它们没有任何问题。

  3. 使用单个测试调用其他测试方法。这对我来说似乎比其他两个更合适的解决方案。如果create 失败,它应该停止其他三个测试的运行等等。

那么有没有更好的方法来实现这个或任何替代方法来测试这样的模型?

目前正在使用 JUnit4,如果没有满足我的情况的解决方案,则考虑迁移到 JUnit5。

【问题讨论】:

标签: java unit-testing junit


【解决方案1】:

您所描述的不是单元测试。

单元测试不应该:

  • 触摸数据库
  • 触摸文件系统
  • 触摸网络
  • 依赖另一个测试

您应该做的是模拟对此类外部资源的访问,以便您的测试是隔离和独​​立的。

【讨论】:

  • 你的观点是有效的,我同意,但是它不能回答我的问题。我的用例也需要我测试数据库查询。本质上,我需要测试查询 db 以执行 crud 操作的方法的代码。这些查询依赖于数据库中的一些现有数据,这些数据在生产中是不可预测的并且难以模拟。你会建议我如何测试它们?我现在也在研究 Mockito。
  • 这主要取决于你的类的设计。但主要思想是测试业务逻辑并模拟所有依赖项。这样,您最终会将这种外部依赖项“逼到角落”,您无法再合理地模拟它。这些查询仍然需要测试,但由于单元测试涵盖了业务逻辑,因此它们的表面积应该大大减少,因此您可以通过一些集成测试对其进行测试,以验证与数据库的通信是否正常。
  • 至于订单。只是不要这样做。有在测试运行之前准备必要数据并在之后清理它的之前/之后方法。测试订单迟早会来咬你。
【解决方案2】:

您的选项 2 是最合适的,即使这让您感到惊讶:您应该尝试使您的测试彼此独立,这样执行顺序就不会成为问题。

而且,对于某些方法a的测试,您需要在测试设置、验证或拆卸过程中调用其他方法bc、...,这是正常情况。你是对的,如果这些其他方法失败,那么对方法 a 的测试也可能会失败 - 或者在它们应该失败的地方成功。

但是,如果您还对其他方法 bc、... 进行了测试,这不是问题。如果在b 中存在错误,那么对b 的一些测试将失败,而对a 的一些其他测试将失败。从失败和成功测试的模式中,您必须推断在哪里搜索失败测试的根本原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多