【问题标题】:Skipping tests using Artos if pre-requisite is not met如果不满足先决条件,则使用 Artos 跳过测试
【发布时间】:2020-01-01 04:39:33
【问题描述】:

我正在使用 Artos 跑步者。在我们的开发环境中,我们保持 <property name="stopOnFail">true</property> 这样我就可以调试我的更改,而不必处理相关的测试用例失败。在生产环境中,我们保留<property name="stopOnFail">false</property>,因此测试执行不会因失败而停止,我们可以在早上分析日志。

现在我有不同的要求, 我有一些测试是其余单元的先决条件,所以如果关键测试失败,那么我想跳过单元的其余部分,否则它会使我们的产品进入不良状态。

只有在特定测试用例或测试单元失败时,Artos 是否有办法跳过单元的其余部分? 或者我们可以执行特定步骤,以防测试无法确保我们可以安全地执行其余测试?

【问题讨论】:

    标签: unit-testing automation automated-tests artos


    【解决方案1】:

    根据需求,Artos 有多种实现方式

    • 首先,确保所有单元都有一个序列号,以便它们始终以相同的顺序执行。
    • 假设 testUnit_1() 是关键单元,它必须成功执行才能执行以下单元的其余部分。在这种情况下,设置dropRemainingUnitsUponFailure = true,如下所示。如果 testUnit_1() 失败,这将确保其余单元从执行列表中删除。
        @TestPlan(preparedBy = "user", preparationDate = "19/02/2019", bdd = "GIVEN..WHEN..AND..THEN..")
        @TestCase(sequence = 1)
        public class TestCase_1 implements TestExecutable {
    
            @Unit(sequence = 1, dropRemainingUnitsUponFailure = true)
            public void testUnit_1(TestContext context) {
                context.getLogger().info("do something");
            }
    
            @Unit(sequence = 2)
            public void testUnit_2(TestContext context) {
                context.getLogger().info("do something");
            }
    
            @Unit(sequence = 3)
            public void testUnit_3(TestContext context) {
                context.getLogger().info("do something");
            }
    
        }
    
    • 如果测试用例相互依赖,那么您可以在测试用例级别执行类似操作
    • 确保为测试用例分配序列号,以便它们遵循相同的执行顺序(类似于单元)
    • 如下图所示。如果dropRemainingTestsUponFailure = truedropRemainingUnitsUponFailure = true 那么在 testUnit_1() 失败时,不仅剩余的单元会被丢弃,而且剩余的测试用例也会从执行列表中被丢弃,这样你就可以实现干净的退出。
        @TestPlan(preparedBy = "user", preparationDate = "19/02/2019", bdd = "GIVEN..WHEN..AND..THEN..")
        @TestCase(sequence = 1, , dropRemainingTestsUponFailure = true)
        public class TestCase_1 implements TestExecutable {
    
            @Unit(sequence = 1, dropRemainingUnitsUponFailure = true)
            public void testUnit_1(TestContext context) {
                context.getLogger().info("do something");
            }
    
            @Unit(sequence = 2)
            public void testUnit_2(TestContext context) {
                context.getLogger().info("do something");
            }
    
            @Unit(sequence = 3)
            public void testUnit_3(TestContext context) {
                context.getLogger().info("do something");
            }
    
        }
    

    在日志文件中你会看到警告

    =========================================================================
    ========== DROP REMAINING UNITS UPON FAILURE IS TRIGGERED ===============
    ================== REMAINING UNITS WILL BE DROPPED ======================
    =========================================================================
    

    =========================================================================
    ========== DROP REMAINING TESTS UPON FAILURE IS TRIGGERED ===============
    ================== REMAINING TESTS WILL BE DROPPED ======================
    =========================================================================
    

    这样你就会知道发生了什么。

    回答你的第二个问题


    (问题:如果测试单元失败,如果有任何方法可以执行清理,那么在执行下一个单元测试之前,您可以从坏状态中恢复您的产品)

    如果我理解正确,那么可以使用注解@AfterFailedUnit来完成

    如果您在运行器类中创建如下所示的方法

        @AfterFailedUnit
        public void globalAfterFailedTestUnit(TestContext context) throws Exception {
            context.getLogger().info("This method executes after failed test unit");
        }
    

    那么它将在每个测试单元失败后执行,你应该在这个方法中实现清理逻辑。 希望这能回答您的问题

    【讨论】:

      猜你喜欢
      • 2017-08-29
      • 1970-01-01
      • 2016-04-13
      • 2017-02-13
      • 1970-01-01
      • 1970-01-01
      • 2014-12-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多