公司接口和 UI 自动化用 python 写,所以写了一篇 python 版的推送,最近领导写单元测试,开发代码是 java;虽然 python 的脚本也能用,但是我觉得整个项目就一个 python 的脚本,有些囧;所以还是用 java 写了一个钉钉推送脚本。
<?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 来实现推送。
进入 Job 页面,点击右下角 Rest API
本文用 JSON API 的方法取值
到这个页面,get 请求 "http://ip:port/job/job/api/json?pretty=true",返回下面的 json;包含我们需要的最后一次构建号。名称
这里需点击 allure 报告,查看 NetWork 里的接口。
get 请求 “http://ip:port/job/job/构建号/allure/widgets/summary.json,就可以获得运行结果了。名称
安装这个插件是为了构建后,执行 shell 命令;
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;
}
}
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 文件,直接取里面值也可以。
条条大路通罗马,就是路费有点贵。