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

hivapdat  于 2023-02-11  发布在  Android
关注(0)|答案(3)|浏览(215)

我正在尝试使用Jenkins中的“Publish JUnit test result report”,但无法让它为我的android测试项目工作。Jenkins中android测试项目的设置基于以下指南:https://wiki.jenkins-ci.org/display/JENKINS/Building+an+Android+app+and+test+project
我希望有人可以发布一个简单的分步指南,介绍如何从测试运行中获得JUnit测试结果报告,以便能够使用“发布JUnit测试结果报告”。希望使用此功能,因为Jenkins中JUnit测试的标准控制台输出不是很方便。
我在网上找到了一些指南(不多),但没有一个对我有用。这是我目前为止尝试过的(没有成功):

  • 只是添加了不带参数的“发布JUnit测试结果报告”构建后操作
  • 按照此指南操作,该指南建议可以从设备/模拟器(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),它与上一指南类似,但添加了自定义工具库
  • 然后我在junit reports(http://www.example.com)上找到了这个用于蚂蚁的APIant.apache.org/manual/Tasks/junitreport.html,但我完全不知道如何将其添加到由android sdk生成的android测试计划中

(Some链接显示不正确,因为不能发布超过两个链接与我的声誉。)
非常感谢帮助:)

8cdiaqws

8cdiaqws1#

我只需要自己解决这个问题,这就是我如何让它工作的:
1.安装性能插件
1.在项目设置中,添加新的构建后操作“发布JUnit-testresults”
1.添加“/app/build/androidTest-results/connected/*.xml”作为路径(路径在您的计算机上可能略有不同)
1.现在,在项目第一次运行之后,您有了一个新的链接“Lasttestresult”,并且在右侧有一个图形表示。
问候

frebpwbc

frebpwbc2#

Spoon library从jenkins添加到您的项目中,添加构建apk的步骤,再添加一个运行命令的步骤

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

进行仪器测试,看看它的神奇之处。

3okqufwl

3okqufwl3#

为某个测试套件"TestExecutionOrder"和项目"com. example"的仪器测试用例生成报告

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

这将生成一个包含成功和失败测试用例的raw-tests文件。成功测试用例没有stack字段,但失败测试用例有。

    • 使用简单的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" +
            "\t\t<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" +
            "\t\t<![CDATA[]]>\n" +
            "\t</system-out>\n" +
            "\t<system-err>\n" +
            "\t\t<![CDATA[]]>\n" +
            "\t</system-err>\n" +
            "</testsuite>";

    return top + cases + bottom;
    }

}
    • 输出:**

junit_report. xml将是JUnit报告,可通过Jenkins Junit报告插件进行可视化。

相关问题