前言

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


↙↙↙阅读原文可查看相关链接,并与作者交流