Selenium WebDriver-使用Grafana和InfluxDB的实时测试指标

大家好! 下周, Java QA工程师小组的课程将开始。 时间将与当前出版物一致。



评论:


目前,不可避免的是每天都要执行自动回归测试作为日常装配的一部分。 在发现错误后立即发现并报告错误是很好的。 同时,运行数百个自动化测试和远程并行执行是有问题的。 一旦有了一组自动回归测试,就可以将其分为几组业务模块并并行运行,作为每日自动回归测试的一部分。 这些测试套件中的大多数都在远程虚拟机上运行,​​并且测试结果仅在运行后才可用。 否则,您可以查看jenkins控制台以查看测试执行过程的日志。 有时这很烦人。 拥有一个能够提供有关在远程虚拟机上运行测试时通过测试的信息的应用程序,将是很棒的。

让我们看看如何使用InfluxDB和Grafana创建带有测试结果的简单页面和仪表板。

目的:


我们将收集所有可用的测试指标,例如:

  • 测试方法状态
  • 测试方法持续时间
  • 测试方法的课程状态
  • 单类测试运行时
  • 测试套件状态
  • 测试运行时间


我们可以实时获取一些指标,如下所示:

  • 特定日期按状态分组的测试方法的数量(例如:通过:30,失败:2,跳过:2)。
  • 一组测试持续一周,一个月,一年等的趋势。


InfluxDB:


InfluxDB是一个时间序列数据库,用于收集所有测试指标。 InfluxDB具有用于写入数据和发送请求的REST API。 您可以在此处了解更多信息 。 在下面,我使用docker命令启动InfluxDB的实例。

sudo docker run -p 8086:8086 -v $PWD:/var/lib/influxdb influxdb 


创建数据库:


我们已经筹集并启动了InfluxDB数据库。 让我们创建一个单独的数据库架构来收集Selenium测试结果。 下面,我在终端中运行命令以在数据库中创建一个名为“ selenium”的架构。 (检查URL,如果不在当前计算机上运行,​​则将localhost替换为主机名/ ipaddress)。

 curl -i -XPOST http://localhost:8086/query --data-urlencode "q=CREATE DATABASE selenium" 


TestNG:


让我们创建一个简单的testNG测试:

 public class SampleTest { @Test(description = "login") public void login(){ } @Test(description = "search for flights", dependsOnMethods = "login") public void search(){ } @Test(description = "select flight", dependsOnMethods = "search") public void select(){ } @Test(description = "book flight", dependsOnMethods = "select") public void book(){ } @Test(description = "logout", dependsOnMethods = "book") public void logout(){ } } 


我们的目标是在运行时在InfluxDB中收集测试结果。 因此,我们需要Java中的InfluxDB驱动程序/库。

Maven依赖项:


添加如下所示的Maven依赖项:

 <dependency> <groupId>org.influxdb</groupId> <artifactId>influxdb-java</artifactId> <version>2.12</version> </dependency> 


学生:


TestNG侦听器非常适合侦听事件,并且可以根据发生的事件做出响应。 首先,让我们创建一个简单的类,负责将结果发送到InfluxDB。

 import org.influxdb.InfluxDB; import org.influxdb.InfluxDBFactory; import org.influxdb.dto.Point; public class ResultSender { private static final InfluxDB INFLXUDB = InfluxDBFactory.connect("http://localhost:8086", "root", "root"); private static final String DATABASE = "selenium"; static{ INFLXUDB.setDatabase(DATABASE); } public static void send(final Point point){ INFLXUDB.write(point); } } 


现在创建另一个实现ITestListener接口的类。

 import org.influxdb.dto.Point; import org.testng.ITestContext; import org.testng.ITestListener; import org.testng.ITestResult; import java.util.concurrent.TimeUnit; public class ExecutionListener implements ITestListener { public void onTestStart(ITestResult iTestResult) { } public void onTestSuccess(ITestResult iTestResult) { this.sendTestMethodStatus(iTestResult, "PASS"); } public void onTestFailure(ITestResult iTestResult) { this.sendTestMethodStatus(iTestResult, "FAIL"); } public void onTestSkipped(ITestResult iTestResult) { this.sendTestMethodStatus(iTestResult, "SKIPPED"); } public void onTestFailedButWithinSuccessPercentage(ITestResult iTestResult) { } public void onStart(ITestContext iTestContext) { } public void onFinish(ITestContext iTestContext) { this.sendTestClassStatus(iTestContext); } private void sendTestMethodStatus(ITestResult iTestResult, String status) { Point point = Point.measurement("testmethod") .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) .tag("testclass", iTestResult.getTestClass().getName()) .tag("name", iTestResult.getName()) .tag("description", iTestResult.getMethod().getDescription()) .tag("result", status) .addField("duration", (iTestResult.getEndMillis() - iTestResult.getStartMillis())) .build(); ResultSender.send(point); } private void sendTestClassStatus(ITestContext iTestContext) { Point point = Point.measurement("testclass") .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) .tag("name", iTestContext.getAllTestMethods()[0].getTestClass().getName()) .addField("duration", (iTestContext.getEndDate().getTime() - iTestContext.getStartDate().getTime())) .build(); ResultSender.send(point); } } 


注意:在上面的示例中,使用符合您目标的可选标签对结果进行分类。 例如标记(“方案”,“登录流程”)。

上面示例中的侦听器将监视测试的执行,并且一旦测试的特定方法/类完成,它将发送名称,持续时间和一些其他详细信息。 我的目的只是给您一个想法。 根据需要更改代码。

现在,将侦听器添加到XML包或TestNG基类中。

 <suite name="My suite"> <listeners> <listener class-name="com.tag.realtime.ExecutionListener" /> </listeners> <test name="Test1"> <classes> <class name="com.tag.realtime.SampleTest"/> </classes> </test> <test name="Test2"> <classes> <class name="com.tag.realtime.Sample2Test"/> </classes> </test> </suite> 


否则:

 @Listeners(ExecutionListener.class) public class SampleTest { @Test public void test(){ } } 


格拉法纳(Grafana):


我们设法将结果发送到InfluxDB。 但是,如何请求结果并可视化接收到的数据呢? 为此,我们将使用另一个名为“ Grafana”的免费工具。
Grafana是用于时间序列数据的出色可视化工具;它与InfluxDB完美地交互。 以下是用于创建Grafana实例的docker命令。 [pietchart插件在团队中是可选的,如果不需要,可以将其删除]

 docker run -d -p 3000:3000 --name=grafana \ -e "GF_INSTALL_PLUGINS=grafana-piechart-panel" \ -v $PWD:/var/lib/grafana \ grafana/grafana 


Grafana的数据源:


转到设置->数据源->添加新数据源 ,如屏幕截图所示。 单击“保存并测试”按钮,以确保Grafana可以与InfluxDB通信。
注意:如果将Grafana与Docker一起使用,并尝试以“服务器默认”身份访问,请不要在InfluxDB连接字符串中使用localhost。 那是因为这里localhost是Grafana容器,而不是物理机器。 因此,Grafana容器将无法找到InfluxDB。




创建仪表板:


我希望您观看此视频,因为要解释本文中的所有细微差别并不容易。 因此,我录制了酒店视频。



演示2:


总结一下:


我希望使用InfluxDB和Grafana获得实时结果是有趣且有用的。 因为我们使用TestNG侦听器,所以它对现有结构的更改要求最小。 如果不需要,则从set /基类文件中删除侦听器足以禁用此功能。 如果团队的成员仅通过远程计算机上的控制台I / O来监视测试结果,则这种方法将有助于避免团队感到沮丧。 本文仅列出了主要思想。 您可以通过添加更多信息来改进此方法,例如,测试环境,添加其他过滤器以更新特定环境/测试的图表中的数据等。

这是一个简短但非常有用的材料。 传统上,我们一直在等待您的评论,并回顾今天将是开放日 ,任何人都可以注册。

Source: https://habr.com/ru/post/zh-CN452908/


All Articles