【问题标题】:Testing workflow using parameterized test or separate test使用参数化测试或单独测试的测试工作流程
【发布时间】:2019-07-16 04:39:27
【问题描述】:

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

我有这样的工作流程

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

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

如果我必须写测试用例,我们应该写单独的测试用例还是参数化测试

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

我尝试过参数化测试,因为断言中的 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()

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

【问题讨论】:

  • 请考虑删除一个标签:这是单元测试或集成测试。我个人只留下测试作为标签。

标签: python unit-testing testing integration-testing


【解决方案1】:

考虑到你提供的要求,如果我要写一个测试用例,我会写如下:

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

但是,要回答您的问题,取决于您的公司将批准的测试策略。必须考虑到您正在测试的单元的关键性等因素。最后,我会采用一种参数化的方法,但不会采用硬编码案例的方法。

如果您可以真正对每个步骤进行参数化,那么您应该不会在函数内部看到任何开关盒。如果您不能,请使用单独的功能,因为可以合理地预期每个功能的维护将需要不同的操作。

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

【讨论】:

  • 同意——单元测试中不应该有条件断言
【解决方案2】:

如果您确实需要执行所有这些测试,那么参数化方法可以避免大量类似实施的测试用例的维护问题。我建议将汇总界面从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)

【讨论】:

  • 我喜欢这种方法,但如果我们重构代码,它可以变得更可测试和可读
【解决方案3】:

我对此的看法是,在测试用例中不应该有 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    • 2021-08-22
    • 1970-01-01
    • 2015-05-16
    相关资源
    最近更新 更多