如何在android上为jenkins生成JUnit测试报告
我正试图利用Jenkins中的“发布JUnit测试结果报告”,但无法使其用于我的android测试项目。 我在Jenkins的android测试项目的设置基于以下指南: 我希望有人能够发布一个简单的分步指南,介绍如何从测试运行中获取JUnit测试结果报告,以便能够使用“发布JUnit测试结果报告”。 希望使用此功能,因为Jenkins中Junit测试的标准控制台输出不太方便 我在网上找到了一些导游(不是很多),但没有一个对我有用。 这是我迄今为止尝试的(没有成功):如何在android上为jenkins生成JUnit测试报告,android,ant,junit,jenkins,report,Android,Ant,Junit,Jenkins,Report,我正试图利用Jenkins中的“发布JUnit测试结果报告”,但无法使其用于我的android测试项目。 我在Jenkins的android测试项目的设置基于以下指南: 我希望有人能够发布一个简单的分步指南,介绍如何从测试运行中获取JUnit测试结果报告,以便能够使用“发布JUnit测试结果报告”。 希望使用此功能,因为Jenkins中Junit测试的标准控制台输出不太方便 我在网上找到了一些导游(不是很多),但没有一个对我有用。 这是我迄今为止尝试的(没有成功): 只需添加“发布JUnit
- 只需添加“发布JUnit测试结果报告”构建后操作,无需任何参数
- 遵循此指南,该指南建议可以从设备/仿真器()下载报告
- 然后,本指南(http://blog.cloudbees.com/2012/11/unit-test-results-code-coverage-and.html)与前面的指南类似,但添加了一个定制的工具库
- 然后我在junit报告(http://ant.apache.org/manual/Tasks/junitreport.html)上找到了这个ant API,但我完全不知道如何将它添加到由android sdk生成的android测试中
非常感谢您的帮助:)我必须自己解决这个问题,我就是这样让它工作的: 1.)安装性能插件 2.)在项目设置中,添加新的生成后操作“发布JUnit testresults” 3.)作为路径,添加/app/build/androidTest results/connected/*.xml(路径在您的计算机上可能略有不同) 4.)现在,在项目第一次运行之后,您有了一个新的链接“LastTestResult”,在右侧有一个图形表示 关于在jenkins的项目中包括添加构建步骤以构建apk,并再添加一个步骤以运行命令
java -jar spoon-runner-1.1.8-jar-with-dependencies.jar \
--apk example-app.apk \
--test-apk example-tests.apk
运行仪器测试并查看神奇之处。为某些测试套件“TestExecutionOrder”和项目“com.example”的仪器测试用例生成报告 这将生成一个包含成功和失败测试用例的原始测试文件。成功的测试用例没有堆栈字段,但失败的测试用例有堆栈字段 使用简单java解析器解析此文本文件。
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
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;
}
}
import java.io.*;
公共类报告脚本{
公共静态void main(字符串[]args){
File File=新文件(“/home/user/Downloads/raw tests.txt”);
FileInputStream fis=null;
试一试{
fis=新文件输入流(文件);
字节[]数据=新字节[(int)file.length()];
fis.读取(数据);
fis.close();
字符串输入流=新字符串(数据,“UTF-8”);
String[]tests=inputStream.split(“检测结果:”);
String[]testCases=tests[0]。拆分(“仪器状态代码:-2 |仪器状态代码:-1 |仪器状态代码:0 |仪器状态代码:1 |仪器状态代码:2”);
//从空白字符串开始,不要取最后一个
字符串大小写=”;
int失败=0;
对于(int i=1;i输出:
xml将是一个junit报告,可以由Jenkins junit报告插件可视化