使用参数化测试或单独的测试来测试工作流程

时间:2019-07-16 04:39:27

标签: python unit-testing testing integration-testing

如何测试工作流程-使用单独的测试还是参数化测试?

我有这样的工作流程

A-> B-> c-> D-> E-> Z

用户可以跳过A和Z之间的任何步骤,但不能跳过A和Z。

如果我必须编写测试用例,我们可以编写单独的测试用例或参数化测试

如果我编写单独的测试,我必须编写四个测试,但要用参数化的代码少一遍。

我尝试了参数化测试,因为if语句中的if语句变得可读性降低。

A = WorkflowStep('A')
B = WorkflowStep('B')
C = WorkflowStep('C')
D = WorkflowStep('D')
E = WorkflowStep('E')
Z = WorkflowStep('Z')


@pytest.mark.parametrize('skipStep', [([B]), ([C]), ([D]), ([E])])
test_skip_step(skipStep):
    workflow = Workflow.create().skip(skipStep);
    summary = workflow.goTo(Z)

    if skipStep != B:
       summary.hasB()
    if skipStep != C:
       summary.hasC()
    if skipStep != D:
       summary.hasD()
    if skipStep != E:
       summary.hasE()

我应该采取什么方法?  -编写单独的测试以测试跳过每个步骤?  -编写参数化测试?

3 个答案:

答案 0 :(得分:1)

考虑到您提供的要求,如果我要编写一个测试用例,则应编写以下内容:

  • 一个测试用例场景,用于检查用户是否可以跳过步骤(两个测试用例);
  • 用于检查用户的测试用例场景可以跳过步骤(四个测试用例?);
  • 一个测试用例场景,以确保工作流如您所述(n个测试用例)流动;

但是,要回答您的问题,取决于贵公司将批准的测试策略。必须考虑诸如要测试的单元的关键性之类的因素。最后,我会采用一种参数化方法,但是没有一种将案例进行硬编码的方法。

如果您可以真正设置每个步骤的参数,则应该在函数内部看不到任何开关情况。如果不能,则请选择单独的功能,因为合理地期望对每个功能的维护将需要不同的操作。

底线:选择易于维护的东西,并且如果有时间,编写比要执行的测试用例更多的测试用例。 最后请记住,您是在为人类编写代码,因此可读性是一个不错的功能。

答案 1 :(得分:0)

如果您确实需要执行所有这些测试,则可以使用参数化方法来避免因大量类似实施的测试用例而导致的维护问题。我建议将摘要界面从hasBhasC,...更改为:hasStep(step)。然后,您可以更好地推广测试。

skippableSteps = [B, C, D, E]

@pytest.mark.parametrize('skipStep', [([B]), ([C]), ([D]), ([E])])
def test_skip_forOneStepOfBCDE_leavesOtherStepsIn(skipstep)
    workflow = Workflow.create()
    workflow.skip(skipStep).goTo(Z)
    expectedSteps = skippableSteps[:].remove(skipstep)
    for step in expectedSteps:
        assert summary.hasStep(step)

答案 2 :(得分:0)

我的看法是,在测试用例中不应有if-else语句要断言。它要求对可维护性和可读性进行单独测试。

可能是相反的事情可以帮助您使用需要显示的步骤来构建工作流,然后测试它们是否在那里。另外,请按时声明,以免不必要的步骤渗入其中。

A = WorkflowStep('A')
B = WorkflowStep('B')
C = WorkflowStep('C')
D = WorkflowStep('D')
E = WorkflowStep('E')
Z = WorkflowStep('Z')


@pytest.mark.parametrize('includedSteps', [(['A','C','D','E','Z']), (['A','B','D','E','Z']), (['A','B','C','E','Z']), (['A','B', 'C','D','Z'])])
test_skip_step(includedSteps):
    workflow = Workflow.build(includedSteps);
    summary = workflow.goTo(Z)

   // To ensure encluded steps
    step in includedSteps:
        assert summary.hasStep(step)

    // To avoid unwanted steps
    assert summary.stepsCnt == len(includedSteps)