作为QA专业人员,为产品测试创建新用户似乎是一项简单的任务 – 只需填写注册表即可开始。但是,如果您需要测试具有长达一年的消息历史记录的用户,或者评估视频服务功能如何适用于特定 A/B 测试组,该怎么办?手动创建用户时,这些情况会很快变得乏味且耗时。
在本文中,我们将分享我们开发完全自动化该过程的工具的旅程。让我们开始吧!
介绍我们的用户管理工具
在 Social Discovery Group,我们提供连接世界各地人们的在线服务。我们的产品使用户能够通过聊天和视频进行交流,并共享媒体内容。随着我们产品的发展,我们开始遇到越来越复杂的测试场景。例如,我们需要检查订阅已过期的用户个人资料或分析包含 30 多个条目的联系人列表的功能。
要生成“历史丰富”的用户,我们必须执行多个 API 查询、向 RabbitMQ 发送消息并运行 SQL 脚本。由于这些步骤已经纳入我们的自动化测试中,手动 QA 团队经常要求我们执行自动化测试以创建所需的用户。随着时间的推移,创建单个用户开始花费比测试本身更长的时间。因此,我们决定找到一种方法,让任何员工都能独立处理用户创建过程。
我们的测试自动化是用 C# 编写的。我们在自动化测试中积极利用对我们应用程序资源的 API 调用。例如,我们使用以下方法进行客户端注册:
var client = new Client(); RegisterClient(client, param1, param2, param3);
在分析了我们的框架之后,我们得出结论,创建必要用户进行测试的最简单解决方案是使用我们的方法开发 ASP.NET Web 窗体应用程序。我们设想了一个网站,QA 测试人员可以使用该网站轻松创建所需的用户。
这是我们所做的:
首先,我们添加了一个用于创建用户的页面。测试人员可以选择其他参数并根据他们的喜好配置用户——无论是作为新用户还是具有长期聊天记录的用户。
这个过程是这样的:
这是页面的代码,包括输出元素。
<%@ Page Language = "C#" AutoEventWireup = "true" CodeBehind = "WebForm1.aspx.cs"
Inherits = "Habrl.Pages.Registration.RegistrationForm1" %> <!DOCTYPE html> <html xmlns = "http://www.w3.org/1999/xhtml" > <head runat = "server" > <title></title> </head> <body> <form id = "registration" runat = "server" > <div> <div> <label>Client type:</label> <asp:DropDownList ID = "clientType" runat = "server" AutoPostBack = "true"
CssClass = "select" OnSelectedIndexChanged = "clientType_OnSelectedIndexChanged" > <asp:ListItem value = "regularClient" Selected = "True" >Regular client</asp:ListItem> <asp:ListItem value = "clientWithChatHistory" >Client with chat history</asp:ListItem> <asp:ListItem value = "inactiveClient" >Inactive Client</asp:ListItem> </asp:DropDownList> </div> <div id = "usersCountDiv" runat = "server" > <label>How much clients we should register:</label> <asp:TextBox ID = "clientsCount" runat = "server" CssClass = "input"
Text = "1" ></asp:TextBox> <div class = "errorMsg" > <asp:RequiredFieldValidator Display = "Dynamic" runat = "server"
ControlToValidate = "usersCount" ErrorMessage = "Define clients count!" ></asp:RequiredFieldValidator> <asp:RangeValidator Display = "Dynamic" runat = "server"
ControlToValidate = "clientsCount" Type = "Integer" MinimumValue = "1" MaximumValue = "30"
ErrorMessage = "We can create from 1 till 30 clients at once!" ></asp:RangeValidator> </div> </div> <div> <asp:Button CssClass = "MyButton separateButton" ID = "SubmitButton" runat = "server"
text = "Register" OnClick = "OnRegisterButtonClick" ></asp:Button> </div> </div> </form> <div runat = "server" id = "result" ></div> </body> </html>
这是逻辑实现:
public partial class RegistrationForm : System . Web . UI . Page
{ int _clientsCount; string _clientType; protected void Page_Load ( object sender, EventArgs e )
{ _clientsCount = int.Parse(clientsCount.Text); _clientType = clientType.SelectedValue; } protected void OnRegisterButtonClick ( object sender, EventArgs e )
{ var clients = new ConcurrentBag<Client>(); Parallel.For( 0 , _clientsCount, _ =>
{ var client = new Client(); RegisterClient(client, _clientType); clients.Add(client); }); result.InnerHtml = GenerateTableViewForClientsEnumerable(clients); } }
注册后,我们收到下表:
UMT 中使用的 RegisterClient 方法与我们的自动测试中使用的方法相同。这意味着每当我们向产品引入新功能时,我们的自动测试都会自动更新,并且这些更改也会反映在 UMT 中。 UMT 本质上是我们合约的前端实现,它提供了底层的自动测试代码。
多亏了 UMT,整个团队现在只需点击几下即可在我们众多测试环境中的任何一个中轻松创建所需的用户配置文件。手动 QA 团队甚至可以独立生成最复杂的用户配置文件,而无需自动化团队的任何参与。令我们惊讶的是,开发团队也开始利用 UMT 来达到他们的目的。
发展与改进
在我们发布 UMT 之后,我们开始收到对新功能的请求。我们添加了用于用户管理(包括在线状态模拟和消息传递)和支付管理的页面。后来,移动团队向我们提出了一个问题:在移动设备上创建 UMT 用户需要花费大量时间和精力来输入电子邮件和密码详细信息。作为回应,我们为 UMT 添加了一个小而有用的功能——为移动应用程序生成带有登录链接和深度链接的 QR 码。
随着我们继续开发 UMT,我们经历了两次重大的重新设计,并向站点添加了一个树状菜单。结果,原来的用户注册页面发生了重大变化,现在看起来完全不同了。
在 UMT 存在的五年半时间里,我们对该工具进行了扩展,远远超出了其促进产品测试的最初目的。我们添加了一些部分来自动化 DevOps 活动,例如重新启动服务和服务器、配置、清理和链接测试环境,以及提供统计信息和知识库等。在下一节中,我将仔细研究其中的一些功能。
授权
一段时间后,我们决定限制某些员工(例如,试用期员工)访问 UMT。为此,我们添加了一个数据库和一个包含角色和用户的表,实施域身份验证并分配权限。有了这个系统,我们就可以识别用户会话,并根据用户的权限授予用户对特定功能的访问权限。考虑到我们公司使用谷歌服务,我们也给 UMT 添加了谷歌授权。
服务和测试环境
随着 UMT 成为团队中流行的工具,我们的 QA 团队希望通过 UMT 来管理服务和测试床,而不是依赖 Ansible 等各种脚本和工具。我们添加了重新启动 Docker 和 Windows 服务、IIS 和 Web 节点以及编辑这些服务的配置的功能。我们还包括一项功能,用于配置这些服务并在测试台之间进行比较。
TestRail 和詹金斯
测试自动化是我们工作的重要组成部分,我们经常在任何给定时间进行十多个测试运行。但是,在 Jenkins 的许多其他运行中定位特定运行或检查其在队列中的位置可能具有挑战性。为了解决这个问题,我们在 UMT 中开发了一个页面,显示所有当前运行和队列中的数据。此页面轮询我们所有的 Jenkins 实例以收集有关正在运行的作业的信息,然后将这些信息显示在表格中以便于参考。
此外,UMT 提供了一个单独的页面,用于创建在 TestRail 中启用 TestRuns 的 TestPlans。只需点击几下,用户就可以从几个带有测试场景的基本测试计划中进行选择。
UMT 还被证明可用于解析失败的自动测试或调查异常用户行为。以前,这些任务需要手动打开 Fiddler 进行 API 查询或连接到数据库以执行 SQL 查询。然而,对于 UMT,专用页面提供了有关在测试平台中创建的用户的全面技术信息,从而使问题解决更快、更高效。
今天,UMT 是一个成熟的项目,随着测试自动化部门收到添加功能或修复错误的新任务,它会继续发展。冲刺中包含优先任务。 UMT 仍然是我们员工必不可少的工具,通过在一个地方收集许多日常活动来节省他们的时间和精力。不再需要做笔记,将 API 查询保存到 Fiddler 或 Postman,或打开 SQL Studio 来执行数据库例程。因此,如果您的公司面临类似的挑战,您现在知道该怎么做了。
由 Social Discovery Group 的 QA 自动化团队负责人 Pavel Yasonau 撰写