如果之前的步骤在Junit中失败,如何跳过剩余的步骤

问题描述 投票:0回答:1

我有一些集成测试用例,它们作为特殊类别的Junit测试用例运行:

@Category(IntegrationTest.class)

因为它们是集成测试用例,所以每个步骤的成本都很高。通常我会重复使用之前步骤的一些结果来降低此成本。为了使其有效,我将其添加到其中:

@FixMethodOrder(MethodSorters.NAME_ASCENDING)

一些样本如下:

@Category(IntegrationTest.class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class TestAllocationPlanApi {

    @Test
    public void testStep01_verifyOrigProgram22275() {...}

    @Test
    public void testStep02_CopyProgram() {...}
}

除失败过程外,它们运行良好:

如果step01失败,我们不需要运行step02,但是Junit仍然转到step02。

这是一种浪费,使测试用例更加复杂,因为您需要仔细处理传递到step02的那些变量。

我试过了

-Dsurefire.skipAfterFailureCount=1

这在another thread中讨论过,但它不起作用,如果前面的步骤失败,测试用例仍然会进入下一步。

关于测试用例的另一个烦人的事情是Junit总是在每一步之前重置所有实例变量。这迫使我使用静态变量将前一个结果传递给下一步:

private static Integer contractAId;

我无法在多个线程中运行它们。

有没有人有好的想法来处理这些事情?

谢谢!

新年快乐!

java maven junit integration-testing
1个回答
2
投票

您已将这些编写为不同的测试,但这些测试之间存在一些依赖关系。因此,听起来您已经跨多个测试方法拆分了单个逻辑测试流程。

为了满足这些依赖关系,您采用了测试的命名约定,并指示JUnit按命名约定隐含的顺序运行这些测试。此外,您的测试用例中有一些共享状态,即从一步到另一步传递。

这种方法听起来很脆弱,可能会使以下方面变得非常困难:

  • 诊断故障,问题
  • 维持现有步骤
  • 添加新步骤

指示JUnit以某种方式 - 如果先前的测试失败并且使用静态变量将先前的结果传递到下一步中,则停止在测试用例中执行后续测试,这两者都是决定将多个@Test方法中的单个逻辑测试拆分的症状。

JUnit在测试用例中没有后续或先前测试的正式概念。这是故意的,因为预期@Test方法彼此独立。

因此,不要试图实现他的行为:如果先前的测试失败,请停止在测试用例中执行后续测试我建议重新访问测试以减少运行时间,减少昂贵的设置时间并删除拆分单个逻辑测试流程的方法跨多种测试方法。相反,每个测试应该是自包含的;其范围应包括(a)设置,(b)执行; (c)断言; (d)拆除。

我可以从你的问题中看出这是一个集成测试,所以设置,依赖管理,执行等很可能并不简单,所以这种将单个逻辑测试流分成多个测试方法的方法可能是为了分解复杂的测试流入更易消化的单位。如果是这样,那么我建议将每个“步骤”分解为私有方法,并在单个@Test方法中编排它们。例如:

@Test
public void test_verifyOrigProgram22275() {
    // you'll probably want to return some sort of context object from each step
    // i.e. something which allows you to (a) test whether a step has succeeded 
    // and abort if not and (b) pass state between steps

    step01_verifyOrigProgram22275();

    step02_verifyOrigProgram22275();

    ...
}

private void step01_verifyOrigProgram22275() {...}

private void step02_CopyProgram() {...}
© www.soinside.com 2019 - 2024. All rights reserved.