我认为这里正确的方法是将测试需要做什么的规范(测试用例,还有设置和拆卸活动)与如何运行它们的规范分开(这样的规范可能被称为'测试执行策略')。
这样做的另一个原因是,通常实际上不可能将测试用例与设置操作分开。
相反,您可以执行一系列操作:一些测试应用程序,一些为此类测试做准备,还有一些两者兼而有之。
例如,Web 应用程序工作流通常看起来像
- 打开一个特定的 URL
- 以特定用户身份登录
- 通过与网站交互来执行某些活动(这可以无限重复)
- (可选)注销
所有四个步骤本身都是有效的测试用例:它们可能以暗示应用程序行为异常的方式失败。
但是,它们不能单独运行:第 1 步必须在第 2 步之前执行,第 2 步必须在第 3 步或第 4 步之前运行。这些步骤是相互依赖的。
因此尝试各种执行策略是有意义的:
- 依次运行所有这些;在失败时,将失败归咎于执行的最后一步。所以我们得到了测试序列 1、2、3、4。
- 对于每个步骤,创建一个单独的测试序列来测试该步骤:所以我们得到测试序列 1; 1、2; 1、2、3; 1、2、4。
第二种策略可以称为“自主”策略。其他策略是可能的:例如您可能希望同时运行 1、2、4 和 1、2、3、4。
测试用例的规范会列出所有的测试用例以及它们之间的依赖关系。
最好通过列出先决条件来列出依赖关系:在执行测试步骤之前必须满足的应用程序状态的特定条件。一些先决条件最初成立,有些是后置条件(它们将在成功执行特定步骤后成立)。依赖是前置条件,也是后置条件。
例如,登录状态是第 3 步和第 4 步的前提条件和第 2 步的后置条件。
因此,您最终会得到一张测试步骤和条件的图表。
实际上是一个超图,因为每个步骤都可能与多个前置条件和后置条件相关联。
此外,每一步都可能有可变的输入和可变的可观察输出。输出将用于确定当前状态。
所以结果是Mealy machine,如果每个步骤最多有一个前置条件和一个后置条件,并且有多个前置条件和后置条件,则更类似于colored Petri net 或abstract state machine。
如果应用程序设计良好,那么您需要达到的所有相关状态都是
- 可达:您可以设计并执行步骤将您带到那里
- 可观察:您可以设计和执行步骤,使其输出有效地告诉您是否已成功达到该状态
然后,测试基本上包括遍历超图并观察输出以验证所有可能的步骤是否使应用程序进入预期状态。
测试执行策略是遍历该超图的系统方法,以确保每个可能的步骤都得到测试。
目标是最终测试您需要测试的所有内容。但这并不一定意味着您需要使测试尽可能自主。如果您有信心始终可以将测试序列的失败归咎于执行的最后一步,那么第一个策略也是可行的,而且速度要快得多。
事情可能会变得更复杂:
- 图表越复杂,执行策略之间的选择也越复杂
- 有时,您要测试的不是特定步骤,而是图表中的特定路径(但这意味着您应该真正指定一个隐藏的前提条件)
- 您可能希望使用不同的输入数据执行相同的步骤,或者根据之前步骤的输出选择步骤
这就是将测试步骤规范与测试执行规范分开的更多原因。我认为以一种或另一种形式指定这些东西远比你的测试序列最终是否尽可能自主更重要。
所以我有点惊讶 Selenium 文档中没有讨论这些内容。