构建“缓慢打破”回归测试

软件测试 自动化测试 回归测试
2022-01-08 13:16:25

我需要在工作中为我们的产品构建大量回归测试,并且我计划使用 Selenium。我担心基于我们产品开发的快节奏构建的测试会很快过时和损坏。

什么是构建/构建测试的最佳方式,以最大限度地减少在产品更改和改进时使测试保持最新所需的工作?

4个回答

您可以尝试使用页面对象模式构建您的 Selenium 测试,更多信息请参见: Selenium Wiki - PageObjects

我学到了许多关键的东西,它们是易于维护、可靠的自动化测试的关键。

在一个地方映射您的控件

您的控件应该映射到一个位置,这样如果控件发生更改,您只需在一个位置进行更改。如果开发人员重新映射控件,将它放在一个位置允许您进行一行代码更改。我还映射了控件类型,以便开发人员可以从链接更改为按钮,而我需要做的就是更改此控件文件。

尽可能抽象化测试自动化工具

我基本上有 99% 的时间执行三个操作,即InvokeSetvalueGetValueInvoke 将单击链接或按钮,选中或取消选中复选框等。 SetValue 会将值放入控件中,例如将文本放入文本框中。GetValue 从控件中获取数据,主要用于验证。

每个自动化操作,例如执行搜索,只会调用这些调用、设置和获取方法。这允许几乎完全抽象底层自动化工具,它还允许您在代码中拥有一个调用较低级别控件特定方法的位置。

使用正则表达式映射您的控件名称

我使用的以前的商业工具将控制字符串剪切为 256 个字符。许多应用程序,如 asp.net 可以根据它们在页面控制器中的位置动态创建控件名称。使用正则表达式可以让您以开发人员可以将其移动到页面上的任何位置并且您的测试仍将运行的方式定义控件。

创建测试数据对象来保存您的测试数据

我创建的测试数据对象通常与页面上的控件以非常接近 1:1 的比例映射,然后我创建一个预期的和实际的对象,然后将这些对象传递给堆栈中的各个层。在某些情况下,创建额外的测试就像使用具有不同数据的现有测试一样简单。

将测试与实现分开

关注点分离是您应该从测试中应用的关键技术设计原则。测试用例的意图应该与尽可能与页面交互的物理实现分开。例如,而不是...

[Test] 
public void SearchOnGoogle()
{
  using (var browser = new IE("http://www.google.com"))
  {
    browser.TextField(Find.ByName("q")).TypeText("Stack Exchange");
    browser.Button(Find.ByName("btnG")).Click();

    Assert.IsTrue(browser.ContainsText("Stack Exchange - Free, Community-Powered Q&A"));
  }
}

您的测试应该在最高级别具有特定于域的 API。

[Test] 
public void SearchOnGoogle()
{
    SearchEngine.WebSearch("Stack Exchange");
    SearchEngine.Verifcation.WebSearch("Stack Exchange - Free, Community-Powered Q&A");
  }
}

...

public void WebSearch(string value)
{
     ControlHandler.SetValue(Controls.txtSearchValue, value);
     ControlHandler.Invoke(Controls.btnSearch);
}

有关此主题的深入信息,请阅读 Michael Hunter的 Capture The Essence Of Your Test Case

IMO 的关键问题是承认您的页面需要调整才能进行测试。要解决 Selenium 问题,而不是使用XPath来构建选择器,将 id 添加到页面并在测试中使用它们。

我还发现Page Object模式可以提供很好的结果:

在您的 Web 应用程序的 UI 中,有一些区域与您的测试交互。页面对象只是将它们建模为测试代码中的对象。这减少了重复代码的数量,意味着如果 UI 发生变化,只需在一个地方应用修复。

我反复应用三个原则:

隐藏附带的细节。任何与测试目的不直接相关的细节都属于测试以外的地方。将其隐藏在某个地方,例如变量或方法中,并给它起一个好名字。

说出每一个重要的想法。为什么测试代码以“FDGumby”而不是其他用户身份登录?因为那是雇用您要添加到工资单中的员工的经理?然后将“FDGumby”放入一个变量中并称其为招聘经理(或其他),以表达其意图。

消除重复。每一位重复的数据都是一个等待诞生并被赋予富有表现力的名字的变量。每个重复的测试步骤序列都是一个等待诞生并被赋予富有表现力的名称的方法。

当需求或实现发生变化时,应用这些原则使得自动化回归测试更容易修复。有关更多详细信息和示例,请参阅我的文章“编写可维护的自动化验收测试”(PDF)另请参阅Bob Martin 关于这些相同想法的精彩视频