自动化测试应该相互依赖还是分开?

软件测试 自动化测试 敏捷测试
2022-02-07 18:13:41

目前,我负责使用 C# 和 Selenium Web 驱动程序开发一个黑盒自动化测试框架,并使用该框架来自动化我们当前的手动回归套件。被测系统是一个 ASP.NET Web 应用程序。

每个测试都可能依赖于复杂的数据集合。例如,为了测试“活动”的创建,“客户端”必须与要创建“活动”的“服务”一起出现。

应如何管理此类测试所需的数据?测试是否应该假设它存在?在这种情况下,测试将简单地创建活动。或者,测试是否应该创建必要的数据?在这种情况下,测试将创建客户端,创建服务,然后创建活动。

我们正在考虑以下潜在的解决方案,并正在讨论每个解决方案的优点:

  1. db 为空白,测试创建所需的数据,每次测试后擦除 db

    -pro:测试和数据在一起,测试不能互相影响

    -con:运行时间长,测试更复杂

  2. db 为空白,fixture 创建所有测试所需的数据,db 在每个fixture 之后被擦除

    -pro:测试和数据接近

    -con: 夹具内的测试可以相互影响

  3. db 填充了必要的数据,测试假设存在必要的数据

    -pro:更快的运行时间

    -con:测试和数据是分开的。测试更有可能相互影响

如果这些方法中的任何一种被认为是最佳实践,那么哪种方法?如果以上都不是,什么方法被认为是最佳实践?

2个回答

我曾在以下每种情况下工作过:

  1. 每次测试后清除 DB。
    • Pro:没有留下任何工件,因此测试更容易编写。
    • 缺点:如果您执行某项操作,则数据库还原可能需要最长的时间,然后反复回滚。您还需要确保回滚成功。
  2. DB 在每个测试周期后被清除。
    • Pro:没有留下任何工件,因此测试更容易编写。
    • 缺点:您还需要确保回滚成功。
  3. 测试检查数据是否存在并根据需要创建。
    • Pro:测试不依赖于 DB 状态。
    • 缺点:需要更多时间来编写测试。您还需要确保回滚成功。

我的结论:

选项 1 和 2 更容易开发,并且可能比选项 3 执行得更快。但是,为 1 和 2 创建的测试不应在生产环境中运行(例如,通过更改您的基地址)。选项 3 需要更多的前期工作,并且可能需要更长的时间来运行循环和创建数据,但这应该是一个有争议的问题。您的自动化测试需要 5 分钟还是 3 分钟是否重要?与手动执行任何操作相比,并非如此。

我不知道我的特殊情况是否正确,但总的来说,最好将测试用例分开,因为它们之间的依赖关系尽可能少。因此,例如,如果您希望或需要,更容易独立执行每个测试用例。如果您有很多依赖项,即使您只想检查一个测试用例,也总是需要运行很多东西。为了最小化依赖关系,您需要为每个测试用例定义明确的前置条件和后置条件。您还可以考虑为不同级别定义前置/后置条件 - 例如测试套件与测试用例。

除此之外,我认为关于测试用例依赖关系还有很多其他的事情需要考虑,例如测试用例的健壮性和维护、报告等等。想象一个自动报告,它为每个失败的测试用例创建一个 Jira 任务。如果您在测试用例之间有很强的依赖关系,那么这样的自动报告可能会在您的 Jira 中造成很多混乱。

PS呵呵..当我写我的答案时,你已经编辑了你的帖子。所以我想补充一下-请澄清您的第二点和第三点有什么区别?而且..相互影响的测试->不好;-)