16、自动化测试工具与服务的综合指南

自动化测试工具与服务的综合指南

1. 元素定位器生成

在自动化测试中,元素定位器的生成是关键步骤。有一款插件具备创建 WebElement 定义、添加所选定位器并在类中验证它们的出色功能。它提供了一组工具提示,能告知用户定位器语法中的错误,这在创建 CSS 和 XPath 字符串时非常有用。

当 WebElement 结构构建到页面对象类中后,你可以捕获并验证定位器。若存在错误,会以红色下划线指示。将鼠标悬停在无效语法上时,会出现工具提示和灯泡图标,用户可使用“检查页面上元素是否存在”和“修复定位器弹出窗口”功能,这对于快速查找语法错误和定义定位器十分有用。

2. Selenium 插件总结

Selenium IntelliJ 插件主要处理定位器的创建以及 CSS 和 XPath 语法的差异。该工具还提供示例下拉列表,用户可从中选择如何构建查询。它是使用 Selenium 构建实际页面对象类的良好开端,并且提供了验证定位器中复杂 CSS 和 XPath 结构的工具。

3. IntelliJ 和 Jenkins 中的 TestNG 结果

3.1 IntelliJ 中的 TestNG 结果

对于运行 Selenium WebDriver 或 AppiumDriver 测试,TestNG 组件已内置在框架中,可在 IntelliJ IDE 中创建简单报告。该报告还可导出为 HTML 或 XML 格式查看。虽然报告不算详尽,但能提供测试统计信息和与控制台窗口并行的测试运行时视图。

以下是 IntelliJ TestNG 和 IDE 控制台窗口的相关信息:
- 提供测试方法名称、参数值以及打印到控制台窗口的任何标准输出。
- IDE 结果可导出为 HTML 格式在浏览器中查看。

3.2 Jenkins 中的 TestNG 结果

TestNG 也可作为 Jenkins 的插件使用,它提供类似的结果,可深入查看堆栈跟踪或控制台输出。在 Jenkins 项目页面上,会有 TestNG 摘要报告链接,指向通过、失败和跳过的测试结果,以及失败测试的链接等。此外,还有按类分离每个方法结果的类摘要报告和按方法的 TestNG 趋势分析。

Jenkins TestNG 插件位于:https://wiki.jenkins.io/display/JENKINS/testng - plugin

4. HTML 发布器插件

Jenkins 有一个名为 HTML 发布器插件的工具,它允许用户发布测试运行期间创建的任何 HTML 报告,并将其包含在 Jenkins 项目结果中。这是一个非常有用的工具,因为现在有许多第三方 API 可用于生成包含 Selenium 测试结果的 HTML 报告。

4.1 安装

该插件在测试运行后的过程中发布报告,允许 Selenium 框架报告收集所有结果数据,并在所有测试完成后创建报告。它会在项目结果页面上添加一个链接,指向工作区中物理 .html 文件的位置。

Jenkins HTML 发布器插件位于:https://wiki.jenkins.io/display/JENKINS/HTML + Publisher + Plugin

5. BrowserMob 代理插件

BrowserMob 代理是一款与 Selenium WebDriver 完全集成的有用工具,由 Neustar, Inc 开发。这个免费的开源插件允许用户捕获被测 Web 应用程序的性能数据、识别网络瓶颈、修改被测浏览器的行为,并实时更改流量模式。

5.1 开始使用

使用该工具开始测试相对简单,操作步骤如下:
1. 在 WebDriver 驱动类代码中实例化代理服务。
2. 将该代理功能传递给驱动。
3. 打开捕获模式,以在驱动浏览器时检索测试期间来回发送的 HTTP 响应和请求。

以下是与 Selenium WebDriver 集成的代码示例:

// start the proxy
BrowserMobProxy proxy = new BrowserMobProxyServer();
proxy.start(0);
// get the Selenium proxy object
Proxy seleniumProxy = ClientUtil.createSeleniumProxy(proxy);
// configure it as a desired capability
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.PROXY, seleniumProxy);
// start the browser up
WebDriver driver = new FirefoxDriver(capabilities);
// enable more detailed HAR capture
proxy.enableHarCaptureTypes(CaptureType.REQUEST_CONTENT, 
CaptureType.RESPONSE_CONTENT);
// create a new HAR with the label "yahoo.com"
proxy.newHar("yahoo.com");
// open yahoo.com
driver.get("http://yahoo.com");
// get the HAR data
Har har = proxy.getHar();

在线 Wiki 文档和源代码位于:https://github.com/lightbody/browsermob - proxy#using - with - selenium

BrowserMob 代理还能够测试 REST API 请求和响应,允许用户在不使用 WebDriver 的情况下捕获 HTTP 数据。它通过使用安全证书的中间人(MITM)代理提供完整的 SSL 支持,还具备 Node.js 绑定、日志记录、原生和自定义 DNS 解析功能。

6. ExtentReports 报告 API 类

框架的报告功能非常重要,有许多第三方开源 API 可用于构建和/或发送 Selenium 测试结果的报告。其中,ExtentReports 是一款出色的工具,由 AventStack 开发。这个 Java 和 .NET API 允许用户构建和自定义 Selenium 套件运行的所有 TestNG 结果数据的 HTML 报告。它有社区版(免费开源工具)和专业版(具有许多额外功能)。

6.1 ExtentReports 专业版功能

功能 描述
离线报告 可离线创建报告,而非在测试运行时交互式创建
配置视图可见性 用户可关闭报告中的某些面板视图,如类别视图、异常视图、作者视图和测试运行日志视图
自定义仪表板 允许用户创建包含额外测试结果数据的表格格式自定义仪表板面板
标记助手 用户可通过添加链接、卡片和模态框自定义报告
KlovReporter 可将报告存储在 MongoDB 中并在服务器上托管
ExtentEmailReporter 使用 Java Mail API 类创建电子邮件消息,在报告构建完成后自动发送
ExtentLogger 正在开发的新功能,用于增强 ExtentHTMLReporter 工具的日志记录功能

6.2 ExtentHTMLReporter

ExtentHTMLReporter API 是一个报告工具,它将 Selenium 测试运行的所有 TestNG 结果数据处理成简洁的 HTML 报告。该报告可使用前面提到的 HTML 发布器插件在 Jenkins 中发布,并且无需 Selenium WebDriver 即可使用。该 API 可处理来自 API、单元或无头浏览器测试的其他 TestNG 结果数据。

集成报告到框架的要求如下:
1. 构建 ExtentTestNGIReporterListener 类,网站上有示例类供用户参考。
2. 自定义报告,引入 TestNG 结果以及异常的截图数据。
3. 使用 JavaScript 和 CSS 属性修改报告的外观和感觉。
4. 将监听器类包含在 Selenium 套件文件中以生成报告。

使用示例代码生成报告后,用户可修改 extent - config.xml 文件中的 CSS 属性,或使用可用的报告功能,将主题从白色自定义为黑色,并使用日志记录功能记录状态、数据、截图、堆栈跟踪、日志文件条目等。

6.3 代码示例

以下是来自 ExtentReports 网站的 ExtentHTMLReporter API 示例代码:

public class ExtentTestNGReporter_sample implements IReporter {
    private static final String OUTPUT_FOLDER = "test - output/";
    private static final String FILE_NAME = "Extent.html";
    private ExtentReports extent;
    @Override
    public void generateReport(List<XmlSuite> xmlSuites,
                               List<ISuite> suites,
                               String outputDirectory) {
        init();
        for (ISuite suite : suites) {
            Map<String, ISuiteResult> result = suite.getResults();
            for (ISuiteResult r : result.values()) {
                ITestContext context = r.getTestContext();
                buildTestNodes(context.getFailedTests(), Status.FAIL);
                buildTestNodes(context.getSkippedTests(), Status.SKIP);
                buildTestNodes(context.getPassedTests(), Status.PASS);
            }
        }
        for (String s : Reporter.getOutput()) {
            extent.setTestRunnerOutput(s);
        }
        extent.flush();
    }
    private void init() {
        ExtentHtmlReporter htmlReporter =
        new ExtentHtmlReporter(OUTPUT_FOLDER + FILE_NAME);
        htmlReporter.config()
        .setDocumentTitle("ExtentReports - Created by TestNG Listener");
        htmlReporter.config()
        .setReportName("ExtentReports - Created by TestNG Listener");
        htmlReporter.config()
        .setTestViewChartLocation(ChartLocation.BOTTOM);
        htmlReporter.config().setTheme(Theme.STANDARD);
        extent = new ExtentReports();
        extent.attachReporter(htmlReporter);
        extent.setReportUsesManualConfiguration(true);
    }
    private void buildTestNodes(IResultMap tests,
                                Status status) {
        ExtentTest test;
        if (tests.size() > 0) {
            for (ITestResult result : tests.getAllResults()) {
                test = extent.createTest(
                       result.getMethod().getMethodName());
                for (String group : result.getMethod().getGroups())
                    test.assignCategory(group);
                if (result.getThrowable() != null) {
                    test.log(status, result.getThrowable());
                }
                else {
                    test.log(status,
                             "Test " +
                              status.toString().toLowerCase() +
                             "ed");
                }
                test.getModel().setStartTime(
                getTime(result.getStartMillis()));
                test.getModel().setEndTime(
                getTime(result.getEndMillis()));
            }
        }
    }
    private Date getTime(long millis) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(millis);
        return calendar.getTime();
    }
}

7. Sauce Labs 测试云服务

作为构建内部 Selenium Grid 的替代方案,有各种第三方服务提供商为公司提供用于测试浏览器和移动应用程序的虚拟机。Sauce Labs 是其中一流的提供商之一,它在云端提供 Selenium/Appium 测试解决方案,可按需创建具有各种平台和所选浏览器或移动设备的虚拟机。该公司声称拥有 900 多个用于浏览器兼容性测试的平台以及数百个用于移动模拟器/仿真器、移动网页、原生、混合和真机应用程序测试的平台。

7.1 Sauce Labs 测试云功能

7.1.1 浏览器和移动平台

Sauce Labs 测试云是一个云端虚拟测试实验室,为企业提供客户端浏览器和移动设备平台进行测试。用户无需构建网格并支持各种平台组合来运行被测应用程序,只需购买许可证即可使用无限的浏览器和移动设备池,可用于手动或自动化测试。

Sauce Labs 有一个仪表盘,允许用户查看虚拟机上运行的测试,因为它会记录用户会话。测试完成后,仪表盘提供重放会话、查看 Selenium 和 Appium 客户端及服务器日志以及显示测试运行元数据的功能。还有一个平台配置器功能,可让用户查看支持测试的平台、浏览器版本、移动模拟器(Android)和仿真器(iOS)版本及功能。

7.1.2 驱动代码更改

Sauce Labs 测试云是另一个云端 Selenium Grid,因此需要对框架中构建的 Selenium 驱动类进行一些更改。所需的更改类型包括远程 hub URL、特定于 Sauce 的所需功能以及设置驱动的任何浏览器或移动设备选项。

以下是驱动类中名为 saucelabs 的环境部分的一些代码示例:

// section in CreateDriver.java class for saucelabs URL
String remoteHubURL = null;
String SAUCE_USERNAME = "xyz";
String SAUCE_ACCESS_KEY = "XYZ";
if (environment.equalsIgnoreCase("saucelabs")) {
    if (System.getenv("SAUCE_USERNAME") != null &&
         System.getenv("SAUCE_ACCESS_KEY") != null) {
        remoteHubURL = "http://" + System.getenv("SAUCE_USERNAME") +
                        ":" +
                        System.getenv("SAUCE_ACCESS_KEY") +
                        "@ondemand.saucelabs.com:80/wd/hub";
    }
    else {
        remoteHubURL = "http://[SAUCE_USERNAME]:[SAUCE_ACCESS_KEY]@" + 
                       "ondemand.saucelabs.com:80/wd/hub";
    }
}
// section in CreateDriver.java class for saucelabs display
if (platform.toLowerCase().contains("mac") ||
     platform.toLowerCase().contains("os x")) {
    caps.setCapability("screenResolution", "1920x1440");
}
else {
    caps.setCapability("screenResolution", "2560x1600");
}
// section in CreateDriver.java class for saucelabs platform
if (System.getenv("SELENIUM_PLATFORM") != null) {
    caps.setCapability("platform",
                        System.getenv("SELENIUM_PLATFORM"));
}
// section in CreateDriver.java class for saucelabs features
...
caps.setCapability("build", System.getProperty("BUILD_NUMBER"));
caps.setCapability("maxDuration", 10800);
caps.setCapability("commandTimeout", 300);
caps.setCapability("idleTimeout", 300);
caps.setCapability("tags", platform + "," + browser + "," + "62.0");
if (System.getProperty("RECORDING").equalsIgnoreCase("true")) {
    caps.setCapability("recordVideo", true);
    caps.setCapability("videoUploadOnPass", true);
    caps.setCapability("recordScreenshots", true);
    caps.setCapability("recordLogs", true);
}
if (System.getenv("TUNNEL_IDENTIFIER") != null) {
    caps.setCapability("tunnelIdentifier",
                        System.getenv("TUNNEL_IDENTIFIER")); 
}
....
7.1.3 仪表盘

Sauce Labs 有一个仪表盘,为用户提供测试运行结果,可使用 SauceREST API 进行增强。该 API 类允许用户修改仪表盘窗口中显示的数据。

7.1.4 SauceConnect 隧道

在大多数企业环境中,开发和测试在企业防火墙内的 DMZ 中进行。这意味着运行在云端的 Sauce Labs 客户端要访问被测应用程序,必须有一种绕过防火墙进入网络的方法。

Sauce Labs 有一个名为 SauceConnect 的安全隧道功能,允许其云端平台与企业的开发环境进行通信。设置该隧道比较复杂,但一旦配置完成,可在测试运行前后启动和停止,避免在网络中留下无限期的隧道开口。

以下是 Sauce Labs 测试云服务的使用流程 mermaid 流程图:

graph LR
    A[选择 Sauce Labs 测试云服务] --> B[配置平台和设备]
    B --> C[修改驱动代码]
    C --> D[运行测试]
    D --> E[通过仪表盘查看结果]
    E --> F{是否需要隧道}
    F -- 是 --> G[配置 SauceConnect 隧道]
    F -- 否 --> H[结束测试]
    G --> D

综上所述,这些工具和服务为自动化测试提供了丰富的功能和多样化的选择,能够满足不同场景下的测试需求。无论是元素定位、报告生成还是云端测试,都有相应的解决方案可供使用。

8. 各工具与服务对比总结

为了更清晰地了解上述各种自动化测试工具和服务的特点,下面通过表格进行对比总结:
| 工具/服务 | 主要功能 | 优点 | 缺点 | 适用场景 |
| ---- | ---- | ---- | ---- | ---- |
| 元素定位器生成插件 | 创建 WebElement 定义、添加定位器并验证,提示语法错误 | 方便创建和验证 CSS、XPath 定位器 | 依赖插件 | 定位元素时 |
| Selenium IntelliJ 插件 | 处理定位器创建,提供示例下拉列表 | 辅助构建页面对象类,验证复杂定位器结构 | 仅适用于 IntelliJ 环境 | 结合 IntelliJ 开发 Selenium 测试 |
| TestNG in IntelliJ | 在 IntelliJ 中创建简单报告,可导出为 HTML 或 XML | 与 IntelliJ 集成,提供测试统计和运行时视图 | 报告不够详尽 | IntelliJ 环境下测试 |
| TestNG in Jenkins | 在 Jenkins 中提供测试结果,可深入查看日志 | 与 Jenkins 集成,有多种报告形式 | 配置相对复杂 | Jenkins 自动化测试流程 |
| HTML 发布器插件 | 在 Jenkins 中发布 HTML 报告 | 方便整合第三方 HTML 报告 | 依赖 Jenkins | Jenkins 项目报告发布 |
| BrowserMob 代理插件 | 捕获性能数据、识别网络瓶颈等 | 免费开源,支持多种功能 | 需一定配置 | 测试 Web 应用性能和网络 |
| ExtentReports | 构建和自定义 HTML 报告 | 有社区版和专业版,功能丰富 | 专业版需付费 | 生成详细测试报告 |
| Sauce Labs 测试云服务 | 提供云端测试环境 | 平台丰富,支持多种测试 | 依赖网络,有成本 | 跨平台和设备测试 |

9. 自动化测试工具选择建议

在选择自动化测试工具和服务时,可参考以下步骤:
1. 明确测试需求
- 确定是进行 Web 应用测试、移动应用测试还是 API 测试。
- 考虑是手动测试还是自动化测试,以及测试的频率和规模。
2. 评估工具功能
- 根据需求,对比各工具的主要功能,如元素定位、报告生成、性能测试等。
- 查看工具是否支持所需的技术栈,如 Java、.NET 等。
3. 考虑成本因素
- 对于开源工具,主要考虑学习和维护成本。
- 对于付费工具和服务,评估其价格是否在预算范围内。
4. 结合现有环境
- 考虑工具是否能与现有的开发和测试环境集成,如 IDE、持续集成工具等。

以下是选择自动化测试工具的 mermaid 流程图:

graph LR
    A[明确测试需求] --> B[评估工具功能]
    B --> C[考虑成本因素]
    C --> D[结合现有环境]
    D --> E[选择合适工具]

10. 代码使用注意事项

10.1 BrowserMob 代理插件代码

在使用 BrowserMob 代理插件与 Selenium WebDriver 集成的代码时,需要注意以下几点:
- 确保已经正确引入了 BrowserMob 代理的相关依赖库。
- 代码中的端口号 0 表示随机分配端口,可根据实际情况修改。
- 对于不同的浏览器,可能需要调整 DesiredCapabilities 的设置。

10.2 ExtentReports 代码

在使用 ExtentReports 的示例代码时,要注意:
- 确保项目中已经引入了 ExtentReports 的相关依赖。
- OUTPUT_FOLDER FILE_NAME 可根据实际需求修改,确保有相应的写入权限。
- 代码中的 Status 等类需要正确导入。

10.3 Sauce Labs 驱动代码

在修改 Sauce Labs 驱动代码时:
- 要正确设置 SAUCE_USERNAME SAUCE_ACCESS_KEY ,可通过环境变量或硬编码方式。
- 不同的平台和设备可能需要不同的 capabilities 设置,要根据实际情况调整。

11. 总结

自动化测试在软件开发过程中起着至关重要的作用,而选择合适的工具和服务是提高测试效率和质量的关键。本文介绍了多种自动化测试工具和服务,包括元素定位器生成插件、Selenium 相关插件、TestNG 报告工具、HTML 发布器插件、BrowserMob 代理插件、ExtentReports 报告 API 类以及 Sauce Labs 测试云服务。

通过对这些工具和服务的详细介绍,我们了解了它们的功能、使用方法、优缺点以及适用场景。在实际应用中,可根据具体的测试需求、成本预算和现有环境,综合考虑选择合适的工具和服务。同时,在使用代码时要注意相关的注意事项,确保代码的正常运行。

希望本文能为自动化测试人员提供有价值的参考,帮助他们更好地开展测试工作,提高软件的质量和稳定性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值