首页 > 编程语言 >Java接口自动化测试框架系列(八)测试结果通知(钉钉通知)

Java接口自动化测试框架系列(八)测试结果通知(钉钉通知)

时间:2022-09-05 11:35:41浏览次数:63  
标签:Java String java 通知 new util 测试 import org

通过前七步的框架搭建,此时框架已经可以开始进行接口测试了,但是运行的结果需要手动去项目的工作空间去查看,非常不方便。

很多公司使用的钉钉来进行日常办公的沟通,我们也可以通过发送钉钉消息,来推送测试结果。

钉钉设置

在钉钉群聊的智能群助手中选择添加自定义机器人

 

机器人添加完成后可以给机器人进行取名、获取webhook与密钥。

 

 

 代码编写

新建DingTalkRobot方法类

package com.Auto_Test.utils;

import java.net.URLEncoder;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;

import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.apache.tomcat.util.codec.binary.Base64;


public class DingTalkRobot {
    
    /**
     * 钉钉机器人签名
     */
    private String secret;

    /**
     * 钉钉机器人webhook
     */
    private String url;


    public DingTalkRobot(String secret, String url) {
        this.secret = secret;
        this.url = url;
    }

    /*
     * 方法描述 获取签名
     */
    private String signature(String timestamp) throws Exception {
        String stringToSign = timestamp + "\n" + secret;
        Mac mac = Mac.getInstance("HmacSHA256");
        mac.init(new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256"));
        byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));
        return URLEncoder.encode(new String(Base64.encodeBase64(signData)), "UTF-8");
    }


    public String sendLinkMsg(String msg) throws Exception {
        String timestamp = String.valueOf(System.currentTimeMillis());
        CloseableHttpClient httpclient = HttpClients.createDefault();
        String postUrl = url + "&timestamp=" + timestamp + "&sign=" + signature(timestamp);
        HttpPost httppost = new HttpPost(postUrl);
        httppost.addHeader("Content-Type", "application/json; charset=utf-8");
        httppost.addHeader("sign", signature(timestamp));
        httppost.addHeader("timestamp", timestamp);
        StringEntity se = new StringEntity(msg, "utf-8");
        httppost.setEntity(se);
        String result = null;
        CloseableHttpResponse response = httpclient.execute(httppost);
        int status = response.getStatusLine().getStatusCode();
        if (status >= 200 && status < 300) {
            System.out.println("信息发送成功");
            result = EntityUtils.toString(response.getEntity());
        }
        return result;
    }

}

新建监听类

package com.Auto_Test.listeners;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.naming.java.javaURLContextFactory;
import org.testng.IReporter;
import org.testng.IResultMap;
import org.testng.ISuite;
import org.testng.ISuiteResult;
import org.testng.ITestContext;
import org.testng.ITestResult;
import org.testng.Reporter;
import org.testng.xml.XmlSuite;

import com.Auto_Test.utils.DingTalkRobot;
import com.alibaba.fastjson.JSONObject;
import com.aventstack.extentreports.ExtentReports;
import com.aventstack.extentreports.ExtentTest;
import com.aventstack.extentreports.Status;
import com.aventstack.extentreports.model.TestAttribute;

public class DingTalkListener implements IReporter {
    //总体测试数量
        int totalTestCase = 0;
        //成功率
        double passRate = 0;
        //失败数量
        int failNum = 0;
        //成功数量
        int passNum = 0;
        //跳过数量
        int skipNum = 0;
        //测试名称
        String projectName="";

        @Override
        public void generateReport(List<XmlSuite> xmlSuites, List<ISuite> suites, String outputDirectory) {
            for (ISuite suite : suites) {
                Map<String, ISuiteResult> results = suite.getResults();
                projectName += results.keySet();
                //获取总数据
                for (ISuiteResult suiteResult : results.values()) {
                    //获取各状态用例的数量
                    passNum += suiteResult.getTestContext().getPassedTests().getAllResults().size();
                    failNum += suiteResult.getTestContext().getFailedTests().getAllResults().size();
                    skipNum += suiteResult.getTestContext().getSkippedTests().getAllResults().size();
                }
                
            }
            //获取用例总数
            totalTestCase = passNum + failNum + skipNum;
            //获取用例成功率
            passRate = new BigDecimal((float) passNum / totalTestCase * 100).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
            //机器人的webhook地址
            String url = "***";
            //机器人密钥
            String secret = "***";
            // 调用钉钉工具类的发消息方法
            DingTalkRobot dingTalkRobot = new DingTalkRobot(secret, url);
            try {
                //调用发送方法
                dingTalkRobot.sendLinkMsg(convertToCard());
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
        
        /**
              * 测试组装发送的消息
         */
         private String convertToCard() {
             JSONObject sendObj = new JSONObject();
             JSONObject actionCardObj = new JSONObject();
             //获取系统时间并进行格式化
              Date day = new Date();
              SimpleDateFormat days = new SimpleDateFormat("yyyy-MM-dd");
             actionCardObj.put("title", "上海SAAS电子保函接口测试");
             //   \n换行    \t空格
             actionCardObj.put(
                     "text", "![screenshot](http://58.34.218.220:30002/job/%E7%94%B5%E5%AD%90%E4%BF%9D%E5%87%BD%E6%8E%A5%E5%8F%A3%E8%87%AA%E5%8A%A8%E5%8C%96/ws/src/Log/AutoLog.png) " + 
                             "\n\n执行接口:"+projectName+
                             "\n\n用例总数:" + totalTestCase + "\t通过率:" + passRate + 
                             "\n\n通过:" + passNum + "\t失败:" + failNum + "\t跳过:" + skipNum
                             );
             //示例:dingtalk://dingtalkclient/page/link?url=http%3A%2F%2Fwww.dingtalk.com&pc_slide=false
             //dingtalk://dingtalkclient/page/link?url=
             //&pc_slide为false时则为外部打开
             actionCardObj.put("singleURL", "dingtalk://dingtalkclient/page/link?url=http://58.34.218.220:30002/job/%E7%94%B5%E5%AD%90%E4%BF%9D%E5%87%BD%E6%8E%A5%E5%8F%A3%E8%87%AA%E5%8A%A8%E5%8C%96/ws/TestRport/"+days.format(day)+"/SaaSReport.html&pc_slide=false");
             actionCardObj.put("singleTitle", "详细报告");
             sendObj.put("msgtype", "actionCard");
             sendObj.put("actionCard", actionCardObj);
             return sendObj.toString();
         }
}

在TestNG.xml中添加DingTalkListener方法的监听,运行完成后会在钉钉群里发送信息通知,点击详细报告自动跳转到ExtentReports测试报告上(图片与测试报告的路径需要进行配置)

 

 

 

 

<!-- 注册监听 -->
<listeners>
<listener class-name="com.Auto_Test.listeners.DingTalkListener"/>

</listeners>

标签:Java,String,java,通知,new,util,测试,import,org
From: https://www.cnblogs.com/yogouo/p/16643689.html

相关文章

  • import declarations are not supported by current JavaScript version
    Idea的js文件报错:ImportdeclarationsarenotsupportedbycurrentJavaScriptversion报这个错原因是,vue用的es6的语法,解决的话也很简单,只需要把idea的javaScript的版......
  • [javascript] 闭包问题
    闭包1.闭包的前置知识1.函数的执行上下文环境(Executioncontextoffunction)链接2.作用域(scope)在JavaScript中,对象和函数同样也是变量。在JavaScript中,......
  • [javascript]document的open() write() close()用法
    1、document.open()作用:打开一个新文档,即打开一个流,并擦除当前文档的内容。执行完后会打开一个空的html文档语法:document.open(mimetype,replace)参数:mimetype:可选。......
  • Idea 的Test测试报错:java.lang.IllegalStateException: Failed to load ApplicationC
    转载自:https://www.cnblogs.com/zhian/p/12600429.html因为在Test里面使用了注解@Autowired引入来至bean.xml文件的内容,而在Test没有没有办法自动引入,需要在Test类上加......
  • 性能测试基准软件 lmBench (待补充)
    lmBench说明Lmbench是一套简易,可移植的,符合ANSI/C标准为UNIX/POSIX而制定的微型测评工具。一般来说,它衡量两个关键特征:反应时间和带宽。Lmbench旨在使系统开发者深入了解......
  • JavaScript日期处理类库-Moment.js
    JavaScript日期处理类库-Moment.js参考链接日期格式化moment().format('MMMMDoYYYY,h:mm:ssa');//九月5日2022,10:00:10上午moment().format('dddd');......
  • Java反射机制
    一、获取字节码c(三种方法).Class.getClass().Class.forName("完整的全路径")二、获取构造方法1.c通过下列方法得到构造方法的对象con(四种方法)getConstruct......
  • java随笔(七)——多线程(比较详细)
    线程线程是进程中单个的顺序控制流,是一条执行路径单线程:一个进程如果只有一条执行路径,则称为单线程程序多线程:一个进程如果有多条执行路径,则称为多线程程序多线程的实......
  • Java运行机制
    Java运行机制高级语言的运行机制我们编程都是用的高级语言(写汇编和机器语言的大牛们除外),计算机不能直接理解高级语言,只能理解和运行机器语言,所以必须要把高级语言翻译......
  • 动画标签 HTML CSS JavaScript
    动画标签HTMLCSSJavaScript动画标签HTMLCSSJavaScript免费下载HTML:<linkrel="样式表"href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1......