如何在android上为jenkins生成JUnit测试报告



我试图在Jenkins中使用"发布JUnit测试结果报告",但无法让它为我的android测试项目工作。在Jenkins中设置我的android测试项目是基于以下指南:https://wiki.jenkins-ci.org/display/JENKINS/Building + +安卓+应用+和+测试+项目

我希望有人可以发布一个简单的一步一步的指南,如何获得JUnit测试结果报告的测试运行能够使用"发布JUnit测试结果报告"。我想使用这个特性,因为Jenkins中Junit测试的标准控制台输出不是很方便。

我在网上找到了一些指南(不是很多),但没有一个对我有用。这是我到目前为止尝试过的(没有成功):

  • 在build-action后添加"Publish JUnit test result report",不带参数
  • 遵循本指南,建议可以从设备/模拟器(http://blackriver.to/2012/08/android-continuous-integration-with-ant-and-jenkins-part-2-2/)下载报告
  • 然后这个指南(http://blog.cloudbees.com/2012/11/unit-test-results-code-coverage-and.html)与上一个指南类似,但增加了一个自定义仪器库
  • 然后我发现这个API蚂蚁在junit报告(http://ant.apache.org/manual/Tasks/junitreport.html),但我完全不知道如何将此添加到我的android测试投影由android sdk生成

(有些链接不能正确显示,因为不能以我的声誉发布两个以上的链接)

帮助是非常感谢的:)

我只需要自己解决这个问题,这就是我如何让它工作:

    安装性能插件
  1. 在项目设置中,添加一个新的Post build操作"Publish JUnit-testresults"
  2. 作为路径,添加"/app/build/androidTest-results/connected/*.xml"(路径在您的机器上可能略有不同)
  3. 现在,在项目第一次运行之后,您有一个新的链接"最后测试结果"右侧为图形表示。

从jenkins中加入Spoon库到你的项目中,添加构建步骤来构建apk,再多一个步骤来运行命令

java -jar spoon-runner-1.1.8-jar-with-dependencies.jar 
--apk example-app.apk 
--test-apk example-tests.apk

运行检测测试并查看魔术。

为一些测试套件"TestExecutionOrder"和项目"com生成测试用例报告。示例 "

adb shell am instrument -w -r -e log true -e class 
'com.example.TestExecutionOrder' 
com.example.test/android.support.test.runner.AndroidJUnitRunner > 
/home/user/Downloads/raw-tests.txt

这会生成一个包含成功和失败测试用例的原始测试文件。成功的测试用例没有堆栈字段,但失败的测试用例有。

使用简单的java解析器解析该文本文件。

import java.io.*;
public class ReportScript {
    public static void main(String[] args) {
    File file = new File("/home/user/Downloads/raw-tests.txt");
    FileInputStream fis = null;
    try {
        fis = new FileInputStream(file);
        byte[] data = new byte[(int) file.length()];
        fis.read(data);
        fis.close();
        String inputStream = new String(data, "UTF-8");
        String[] tests = inputStream.split("INSTRUMENTATION_RESULT: ");
        String[] testCases = tests[0].split("NSTRUMENTATION_STATUS_CODE: -2|INSTRUMENTATION_STATUS_CODE: -1|INSTRUMENTATION_STATUS_CODE: 0|INSTRUMENTATION_STATUS_CODE: 1|INSTRUMENTATION_STATUS_CODE: 2");
        //Don't take last one since blank string
        String cases="";
        int failed = 0;
        for(int i = 1 ; i < testCases.length-1 ; i+=2){
            String[] result = testCases[i].split("INSTRUMENTATION_STATUS: ");
            String test  = " ", classname  = " ", time = " " , stack = " ";
            if(result.length == 7){
                for(int j =1 ; j<=6 ; j++){
                    String[] map = result[j].split("=");
                    String key  = map[0];
                    String value = map[1];
                    if("test".equalsIgnoreCase(key)){
                        test = value;
                    }else if ("class".equalsIgnoreCase(key)){
                        classname = value;
                    }else if ("time".equalsIgnoreCase(key)){
                        time = value;
                    }
                }
                cases += makePassXml(test,classname,time);
            }else{
                for(int j =1 ; j<=6 ; j++){
                    String[] map = result[j].split("=");
                    String key  = map[0];
                    String value = map[1];
                    if("test".equalsIgnoreCase(key)){
                        test = value;
                    }else if ("class".equalsIgnoreCase(key)){
                        classname = value;
                    }else if ("time".equalsIgnoreCase(key)){
                        time = value;
                    }else if ("stack".equalsIgnoreCase(key)){
                        stack = value;
                    }
                }
                cases += makeFailXml(test,classname,stack,time);
                failed++;
            }
        }
        String xml = makeTestSuiteXml(cases,"TestExecutorOrder",(testCases.length-1)/2 + "" ,failed + "");
        FileWriter writer = new FileWriter("/home/user/Downloads/junit_report.xml");
        writer.write(xml);
        writer.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    }
    public static String makePassXml(String test, String classname, String time){
    return "<testcase name=""+ test +"" classname=""+classname+"" time="0.0"/>n";
    }
    public static String makeFailXml(String test, String classname, String stack,String time){
    return "<testcase name=""+ test +"" classname=""+ classname +"" time="0.0">n" +
            "tt<failure message="java.lang.AssertionError: test failed " type="java.lang.AssertionError">" +  stack.replaceAll("\<","") +
            "</failure>n" +
            "t</testcase>n";
    }
    public static String makeTestSuiteXml(String cases, String testSuite, String total , String failed){
    String top  = "<?xml version="1.0" encoding="UTF-8"?>n" +
            "<testsuite name=""+testSuite+"" tests=""+total+"" skipped="0" failures=""+failed+"" errors="0" timestamp="2019-01-08T18:36:58" hostname="jenkins-android-testing" time="0.000">n" +
            "t<properties/>n";
    String bottom = "<system-out>n" +
            "tt<![CDATA[]]>n" +
            "t</system-out>n" +
            "t<system-err>n" +
            "tt<![CDATA[]]>n" +
            "t</system-err>n" +
            "</testsuite>";
    return top + cases + bottom;
    }
}
输出:

junit_report.xml将是一个JUnit报告,可以通过Jenkins JUnit报告插件可视化。

相关内容

  • 没有找到相关文章