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

阿廉 · September 11, 2019 · Last by 霍格沃兹测试学院官方 replied at September 11, 2019 · 920 hits

前言

公司接口和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来实现推送。

2.获取需要的接口url

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

进入Job页面,点击右下角Rest API

本文用JSON API的方法取值

到这个页面,get请求 "http://ip:port/job/job/api/json?pretty=true",返回下面的json;包含我们需要的最后一次构建号。名称

2.2 获取包含运行结果的url

这里需点击allure报告,查看NetWork里的接口。

get请求“http://ip:port/job/job/构建号/allure/widgets/summary.json,就可以获得运行结果了。名称

3.jenkins安装Post Build task插件

安装这个插件是为了构建后,执行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;
}
}

整体job配置

最终效果

注意事项

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文件,直接取里面值也可以。
条条大路通罗马,就是路费有点贵。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 1 条回复 时间 点赞
3Floor has been deleted
需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up