今年四月底我花了一天时间简单搭建了php接口测试工程,maven + TestNG + jenkins,从0开始到现在510个用例(持续增长中),逐渐开始提高了测试回归效率并发现一些线上bug,这期间遇到过不少问题,这次先分享下如何利用TestNG监听器优化测试报告。
接口用例量上来以后,我们遇到的第一个问题就是http方式调用php接口会有部分接口偶尔不稳定或者超时的情况,但第二次运行又正常,每次接口失败都需要花费时间排查,但实际没有问题,为了排除不稳定带来的干扰,节约排查维护时间,首先需要做的是给工程添加失败自动重试机制。
目前我的做法是实现了TestNG自带的IRetryAnalyzer接口,定义了一个MAX___RETRY_COUNT,即最大重试次数,实现的retry方法非常简单,如下:
public boolean retry(ITestResult result) {
if (retryCount < MAX_RETRY_COUNT) {
retryCount++;
return true;
}
return false;
}
如果团队有人想要使用失败重试的功能也很简单,只需要在Annotation里面加上retryAnalyzer属性即可,如下:
@Test(retryAnalyzer = TestRetry.class)
public void summaryTest(){
String url = urlList.get(0);
JSONObject map = ResponseJsonBase.manageJson(url, "");
String total = map.getString("total");
assert "7.59".equals(total) : url;
}
这种方式带来的好处是有比较大的自由度,可以自由选择某个用例是否需要失败重试的功能,因为部分接口重试第二次是不允许的,比如有频率限制的接口等。 但是加了失败重试机制以后,我们会发现接口测试报告有问题:一是被失败重试的用例被重复输出了,二是即使失败重试后通过的情况,依然会有邮件“骚扰”,还是需要花费很多时间看接口问题。
有问题的接口测试报告如下:
根据遇到的问题,首先我们需要优化一下测试报告,从而避免给大家带来太多干扰。 我的做法是定义了一个TestNG的监听器来处理失败重试的用例。具体实现是通过继承TestListenerAdapter类,覆盖onTestFailure、 onStart、 onFinish方法,贴一下主要的代码段:
@Override
public void onTestFailure(ITestResult tr) {
if (tr.getMethod().getRetryAnalyzer() == null) {
log(tr.getMethod() + "--Test method failed\n");
}
if (tr.getMethod().getRetryAnalyzer() != null) {
TestRetry testRetry = (TestRetry) tr.getMethod().getRetryAnalyzer();
if (testRetry.getRetryCount() < testRetry.getMaxRetryCount()) {
tr.setStatus(ITestResult.SKIP);
Reporter.setCurrentTestResult(null);
isRemoveSkipNeeded = true;
skippedCases.addResult(tr, tr.getMethod());
}
else {
failedCases.addResult(tr, tr.getMethod());
isRetryNeeded = true;
}
}
}
其实上面代码里面就是统一对失败的用例做处理,每次失败都会去判断是否已经达到最大失败次数,如果没有,会将该用例状态设置为skip,到这里为止,看我们的测试报告,大概长这样:
可以看到,依然有很明显的问题,所以第二步要做的事情是:失败的用例列表去重,以及在Skipped的Test Case里面剔除真正Failed的Test Case。 其实测试报告的主要数据获取是下面几个:
getFailedConfigurations()
getSkippedConfigurations()
getFailedTests()
getSkippedTests()
做对应优化就很简单了,贴下我这边failed Cases去重的代码段,可以举一反三写其他几个:
private void removeFailedTestsInTestNG(ITestContext test) {
IResultMap returnValue = test.getFailedTests();
for (ITestResult resultToCheck : failedCases.getAllResults()) {
int c = 0;
for (ITestResult result : returnValue.getAllResults()) {
if (result.getMethod().equals(resultToCheck.getMethod())) {
c++;
if (c > 1) {
returnValue.removeResult(result.getMethod());
test.getFailedConfigurations().removeResult(
result.getMethod());
}
}
}
}
}
然后就是在每个testSuit运行结束的时候,统一处理:
@Override
public void onFinish(final ITestContext testContext) {
if(isRetryNeeded){
removeIncorrectlySkippedTests(testContext,failedCases);
removeFailedTestsInTestNG(testContext);
}
else{
if(isRemoveSkipNeeded)
removeSkippedTestsInTestNG(testContext);
else{
skippedCases= testContext.getSkippedTests();
failedCases= testContext.getFailedTests();
}
}
}
将该监听器配置到testng.xml内或者pom.xml内就可以生效了。
自此为止,看下我们的测试报告已经是我们想要的样子了:
最后就是CI的配置,我用了扩展邮件插件,实现了一个相对直观的邮件模版,只对Fail和Fixed的情况进行提醒(见下图右),对于skipped的用例,虽然不再有邮件“骚扰”,但依然可以在jenkins里面查看(见下图左):
上周,我在工程里面加了日志模块,会记录skip的和返回时间超过1秒的用例,设想是运行一段时间后,对这部分用例进行统计,看是否接口本身存在优化空间。这部分工作后续计划优化为自动完成、自动出图表,要看时间是否充足了。
欢迎关注我们的公众号
Original url: Access
Created at: 2019-09-26 16:41:56
Category: default
Tags: none
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论