结合 Jenkins,完成钉钉推送 (java+junit+allure)

仙童 测试交流1 381字数 1336阅读4分27秒阅读模式

前言

公司接口和 UI 自动化用 python 写,所以写了一篇 python 版的推送,最近领导写单元测试,开发代码是 java;虽然 python 的脚本也能用,但是我觉得整个项目就一个 python 的脚本,有些囧;所以还是用 java 写了一个钉钉推送脚本。

需要做的事

1.junit,allure,rest-assured 的相关依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.elensdata</groupId>
<artifactId>chinese_adress</artifactId>
<version>1.0</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<aspectj.version>1.8.10</aspectj.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.20</version>
<configuration>
<testFailureIgnore>true</testFailureIgnore>
<argLine>
-javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar"
</argLine>
<systemProperties>
<property>
<name>allure.results.directory</name>
<value>${project.build.directory}/allure-results</value>
</property>
<property>
<name>allure.link.issue.pattern</name>
<value>https://example.org/issue/{}</value>
</property>
</systemProperties>
<properties>
<property>
<name>listener</name>
<value>io.qameta.allure.junit4.AllureJunit4</value>
</property>
</properties>
</configuration>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${aspectj.version}</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>io.qameta.allure</groupId>
<artifactId>allure-junit4</artifactId>
<version>2.13.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    </artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>json-schema-validator</artifactId>
<version>3.1.0</version>
</dependency>
</dependencies>
</project>

其他的准备工作可以参考上篇文章,不过这次使用 Jenkins 中:REST API 来实现推送。文章源自玩技e族-https://www.playezu.com/181889.html

2.获取需要的接口 url

2.1 获取包含最后一次构建号的 url

进入 Job 页面,点击右下角 Rest API
文章源自玩技e族-https://www.playezu.com/181889.html

结合 Jenkins,完成钉钉推送 (java+junit+allure)插图


本文用 JSON API 的方法取值
文章源自玩技e族-https://www.playezu.com/181889.html

结合 Jenkins,完成钉钉推送 (java+junit+allure)插图1


到这个页面,get 请求 "http://ip:port/job/job/api/json?pretty=true",返回下面的 json;包含我们需要的最后一次构建号。名称文章源自玩技e族-https://www.playezu.com/181889.html

文章源自玩技e族-https://www.playezu.com/181889.html

2.2 获取包含运行结果的 url

这里需点击 allure 报告,查看 NetWork 里的接口。
文章源自玩技e族-https://www.playezu.com/181889.html

结合 Jenkins,完成钉钉推送 (java+junit+allure)插图2


get 请求 “http://ip:port/job/job/构建号/allure/widgets/summary.json,就可以获得运行结果了。名称
文章源自玩技e族-https://www.playezu.com/181889.html

结合 Jenkins,完成钉钉推送 (java+junit+allure)插图3

文章源自玩技e族-https://www.playezu.com/181889.html

3.jenkins 安装 Post Build task 插件

安装这个插件是为了构建后,执行 shell 命令;文章源自玩技e族-https://www.playezu.com/181889.html

mvn compile
mvn exec:java -Dexec.mainClass="com.xxx.xx.DDPush"

编写推送脚本

package com.xxxxx.addr;
import io.restassured.http.ContentType;
import io.restassured.response.Response;
import java.util.ArrayList;
import static io.restassured.RestAssured.*;
public class DDPush {
static String token_url = ""; //钉钉的自定义机器人,webhook值
static String jobname = "";
static String lastnum = getLastBuildNum();//该job最后一个构建号
public static void main(String[] args){
DDPush.ddPush();
}
public static void ddPush(){
DDPush dd = new DDPush();
String retries_run = dd.testStatus().get(0);//获取运行总数并赋值
String status_passed = dd.testStatus().get(1);//获取通过数量并赋值
String status_failed = dd.testStatus().get(2);//获取失败数量并赋值
String job_url = "http://192.168.1.176:8090/job/"+jobname;
String report_url = job_url+lastnum+"/allure";
given()
.contentType(ContentType.JSON)
.body("{"msgtype":"text",n" +
""text":{"content":" +
"n"地址标准化单元测试已完成:" +
"n测试概述:" +
"n运行总数:"+retries_run+
"n通过数量:"+status_passed+
"n失败数量:"+status_failed+
"n构建地址:"+job_url+
"n报告地址:"+report_url+""}}")
.when().post(token_url)
.then()//.log().all()
.statusCode(200)
.extract().response();
}
/*
return:ArrayList包含所有运行状态
*/
public ArrayList<String> testStatus(){
ArrayList b = new ArrayList();
Response response=given()
.when().get("http://ip:port/job/"+jobname+lastnum+"/allure/widgets/summary.json")
.then()//.log().all()
.statusCode(200)
.extract().response();
String total=response.jsonPath().getString("statistic.total");
String passed=response.jsonPath().getString("statistic.passed");
String failed=response.jsonPath().getString("statistic.failed");
String skipped=response.jsonPath().getString("statistic.skipped");
String broken=response.jsonPath().getString("statistic.broken");
String unknown=response.jsonPath().getString("statistic.unknown");
b.add(total);
b.add(passed);
b.add(failed);
b.add(broken);
b.add(unknown);
b.add(skipped);
return b;
}
/*
return:最后一次构建号
*/
public static String getLastBuildNum(){
Response response=given()
.when().get("http://ip:port/job/"+jobname+"api/json?pretty=true")
.then()//.log().all()
.statusCode(200)
.extract().response();
String lastnum=response.jsonPath().getString("builds.number[0]");
return lastnum;
}
}

整体 job 配置

文章源自玩技e族-https://www.playezu.com/181889.html

结合 Jenkins,完成钉钉推送 (java+junit+allure)插图4

最终效果

结合 Jenkins,完成钉钉推送 (java+junit+allure)插图5

注意事项

1.需要把推送的脚本,放到 main 下:

结合 Jenkins,完成钉钉推送 (java+junit+allure)插图6


2.jenkins 生成 allure 报告的路径为:
target/allure-results
网上有些是:target/surefire-reports,如果用此路径,虽然会生成报告;但不会有增加@Feature,@Story注释。
3.运行中找不到 mvn、allure、java 等等
之前遇到,去网上找了很多解决方案大多是:
配置环境变量,jenkins 全局工具安装等等解决方案。我都试了一遍,并没有什么效果。
后来添加了软连接就号了,ln -s [解压的地址] /usr/local/bin/[软件名称],然后就好了~真香!
如果你公司用 windows 的话,解决方案为:换成 linux

后记

其实也可以在 jenkins 构建时,运行这个命令:allure generate [服务器 jenkins—job 路径]/target/surefire-reports -c -o [服务器 jenkins—job 路径]/allure-report
之后找到这个 allure-report 下面 prometheusData.txt 文件,直接取里面值也可以。
条条大路通罗马,就是路费有点贵。

 最后更新:2024-8-21
    • 木小白
      木小白 9

      楼主,我最近在用 junit4+allure,我把携带 allure 的 plugin 和 dependency 那两段复制上去,编译后没有在 target 生成 json 文件,请问是什么原因

    匿名

    发表评论

    匿名网友
    确定

    拖动滑块以完成验证