前言
公司接口和 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
本文用 JSON API 的方法取值
文章源自玩技e族-https://www.playezu.com/181889.html
到这个页面,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
get 请求 “http://ip:port/job/job/构建号/allure/widgets/summary.json,就可以获得运行结果了。名称
文章源自玩技e族-https://www.playezu.com/181889.html
文章源自玩技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
最终效果
注意事项
1.需要把推送的脚本,放到 main 下:
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 文件,直接取里面值也可以。
条条大路通罗马,就是路费有点贵。
未知地区 1F
楼主,我最近在用 junit4+allure,我把携带 allure 的 plugin 和 dependency 那两段复制上去,编译后没有在 target 生成 json 文件,请问是什么原因