Jenkins +JUnit
转载:https://www.cnblogs.com/helloIT/p/5761740.html
1.环境
windows10 专业版
Jenkins 2.7
apache-ant-1.9.6
JDK1.8.0_20
2.整体思路
jdk:支持ant脚本中的编译、测试等target。
ant脚本:负责java代码的编译、JUnit。
Jenkins:调度触发ant脚本的执行。

3.开始练兵
3.1 项目整体结构

com.java.src下面放源码 MessageUtil.java
com.java.test目录下放JUnit测试文件 TestMessageUtil.java
build.xml文件放在根目录下,即位于AntJunit-v1.0目录下,和src位于同一级别。
3.2 项目源码

1 package com.java.src;
2
3 public class MessageUtil {
4 private String message;
5
6 //Constructor
7 //@param message to be printed
8 public MessageUtil(String message){
9 this.message = message;
10 }
11
12 // prints the message
13 public String printMessage(){
14 System.out.println(message);
15 return message;
16 }
17
18 // add "Hi!" to the message
19 public String salutationMessage(){
20 message = "Hi!" + message;
21 System.out.println(message);
22 return message;
23 }
24 }


1 package com.java.test;
2
3
4
5
6 import static org.junit.Assert.*;
7
8 import org.junit.Test;
9
10 import com.java.src.MessageUtil;
11
12 public class TestMessageUtil {
13 String message = "Robert";
14 MessageUtil messageUtil = new MessageUtil(message);
15
16 @Test
17 public void testPrintMessage() {
18 System.out.println("Inside testPrintMessage()");
19 assertTrue(message.equals(messageUtil.printMessage()));
20 }
21
22 @Test
23 public void testSalutationMessage() {
24 System.out.println("Inside testSalutationMessage()");
25 message = "Hi!" + "Robert";
26 assertTrue(message.equals(messageUtil.salutationMessage()));
27 }
28 }


1 <?xml version="1.0" encoding="utf-8"?>
2 <project name="test" default="test" basedir=".">
3
4 <!--配置基本属性-->
5 <property name="src" value="src"/>
6 <property name="build" value="build"/>
7 <property name="lib" value="lib" />
8 <property name="dist" value="dist"/>
9 <property name="classpath" location="${build}"/>
10
11 <!--配置测试报告的属性-->
12 <property name="report" value="report"/>
13 <property name="report.xml" value="${report}/junit/xml"/>
14 <property name="report.html" value="${report}/junit/html"/>
15
16 <!--配置运行时classpath-->
17 <path id="classpath.run">
18 <pathelement path="${classpath}"/>
19 <fileset dir="${lib}">
20 <include name="*.jar"/>
21 </fileset>
22 </path>
23
24 <!--配置测试时classpath-->
25 <path id="classpath.test">
26 <path refid="classpath.run"/>
27 <path location="${dist}/lib/test-${DSTAMP}.jar"/>
28 </path>
29
30 <!--任务初始化-->
31 <target name="init" >
32 <tstamp/>
33 <delete dir="${build}"/>
34 <delete dir="${report}"/>
35 <delete dir="${dist}"/>
36 <delete file="${lib}/test-*.jar"/>
37 <mkdir dir="${build}"/>
38 <mkdir dir="${lib}"/>
39 <mkdir dir="${dist}"/>
40 <mkdir dir="${report}"/>
41 </target>
42
43 <!--配置编译任务-->
44 <target name="compile" depends="init">
45 <javac srcdir="${src}" destdir="${build}">
46 <classpath refid="classpath.run" />
47 </javac>
48 </target>
49
50 <!--配置运行任务-->
51 <target name="run" depends="compile, dist">
52 <java classname="com.test.TestCalculator">
53 <classpath>
54 <path refid="classpath.run"/>
55 </classpath>
56 </java>
57 </target>
58
59 <!--配置JUnit测试,打印测试结果-->
60 <target name="test" depends="compile, dist">
61 <mkdir dir="${report.xml}"/>
62 <mkdir dir="${report.html}"/>
63 <junit printsummary="yes" haltonfailure="no">
64 <classpath refid="classpath.run"/>
65 <formatter type="xml"/>
66 <batchtest fork="yes" todir="${report.xml}">
67 <fileset dir="${src}" includes="**/Test*.java"/>
68 </batchtest>
69 </junit>
70 <junitreport todir="${report.html}">
71 <fileset dir="${report.xml}">
72 <include name="*.xml"/>
73 </fileset>
74 <report format="frames" todir="${report.html}"/>
75 </junitreport>
76 </target>
77
78 </project>

3.3 必要的环境配置
将junit-4.10.jar复制到%ANT_HOME%\lib目录下。例如,我需复制到D:\SoftInstall\apache-ant-1.9.6\lib下。
这一步很有必要,否则正式运行会报错。
3.4 配置Jenkins
新建一个自由风格的job,名字为AntJunit-V1.0。
源码管理:选择No。利用SVN或git对源码进行管理时,Jenkins总是会把代码拷贝一份到自己的工作空间,然后对备份进行操作,因此本demo忽略源码管理,直接将代码拷贝到Jenkins工作区。

增加构建步骤:选择Invoke Ant。Targets的名字test来自build.xml中的target名字test(test在build.xml中也是默认执行的target)。
另外,这里的构建可以用windows脚本执行。二者效果完全一样。

构建后操作:选择Publish JUnit test result report。测试报告xml填:report/junit/html/TESTS-TestSuites.xml 。

点击「保存」。
4.构建结果

点击中间的「最新测试结果」,查看详情:

5.总结
①完全可以在ant环境下调试好结果再放到jenkins工作空间。因为起实质作用的是ant,jenkins仅仅是调度。ant和jenkins天然有着密切的联系。
②这个demo中ant脚本模拟的是手动编译、测试java代码的过程。ant典型应用还有对Java程序的打包、部署等。当然,ant还有更多应用,有兴趣的童鞋可以搜索ant学习。
6.致谢
7.在ubuntu14.04下遇到的问题(2016.8.16,jenkins版本为2.7.2)
上述作业在windows下没有任何问题。但是移植到ubuntu14.04虽然能够构建,但查看详情发现报错:Error Message:org/hamcrest/SelfDescribing 。

原来是由于Junit4.10.jar中不包含hamcrest-core-1.3.jar(参考这里)。
将hamcrest-core-1.3.jar添加到${JENKINS_HOME}/workspace/AntJunit/lib目录下,重新构建,成功!


Jenkins +JUnit的更多相关文章
- jenkin插件整理
分类 plugin名称 wiki地址 源码地址 plugin作用范围 备注 Build Reports构建报告(此类插件用来分析构建结果,比果代码检查,测试CASE分析,并将这些结果以报表,趋势图等形 ...
- 负载,性能测试工具-Gatling
前言 Gatling Gatling是一款功能强大的负载测试工具,它为易于使用,高可维护性和高性能而设计. 开箱即用,Gatling由于对HTTP协议的出色支持,使其成为负载测试任何HTTP服务器的首 ...
- 阿里,百度,腾讯招聘 Java 程序员的技术标准
阿里巴巴篇 扎实的计算机专业基础,包括算法和数据结构,操作系统,计算机网络,计算机体系结构,数据库等 具有扎实的Java编程基础,理解IO.多线程等基础框架 熟练使用Linux系统的常用命令及shel ...
- DEVOPS技术实践_12:创建持续集成的管道
持续集成不仅包含了Jenkins或者相关其它的CI工具,也包含了包含代码如何控制,采用的什么分支策略等.不同的组织可能采用不同的类型的策略来完成CI,策略类型和项目的类型的有很大的关系. 一 分支策略 ...
- DEVOPS技术实践_08:声明式管道语法
简介 前面简单的做了管道的实验,看了一下的它的效果 声明式管道是Groovy语法中的一个更简单和结构化的语法.下面主要学习明式管道语法. 一 声明式管道的基本结构 以上节的代码为例 node { de ...
- 搭建持续集成单元测试平台(Jenkins+Ant+Java+Junit+SVN)
一.环境准备 Jenkins: 到官网下载jenkins.war包:http://jenkins-ci.org/ 安装方法有两种: 把下载下来的jenkins.war包放到文件夹下,如C:\jenki ...
- jenkins+maven+junit构建自动化测试,整合junit xml生成直观的测试报告[留存]
在自动化测试过程中,测试报告最能直观的体现测试的价值,之前一直使用maven+junit来构建我的自动化测试,但这样有几个缺点,一是,不能定时构建自动化任务(也许是我没有找到maven有没有提供这样的 ...
- Jenkins配置Publish Junit test result report(转)
参考这篇文章:http://www.yiibai.com/jenkins/jenkins_unit_testing.html 插件:JUnit Plugin
- ruby rspec+jenkins+ci_report持续集成生成junit测试报告
1.加载ci_report gem install ci_reporter_rspec 2.给测试工程编写rakefile require 'ci/reporter/rake/rspec' requi ...
随机推荐
- 出现Unrecognized field "state" (class com.jt.manage.pojo.ItemCat)异常
当在pojo中,往往会出现字段无法一一对应时,有可能就会出现创建Unrecognized field "state" (class com.jt.manage.pojo.ItemC ...
- 使用keras时出现 `pydot` failed to call GraphViz的解决办法
问题来源于使用了 keras.utils.plot_model,报错内容为: 2018-08-29 08:58:21.937037: I tensorflow/core/platform/cpu_fe ...
- 51nod 1052 (dp)
最大M子段和 N个整数组成的序列a[1],a[2],a[3],…,a[n],将这N个数划分为互不相交的M个子段,并且这M个子段的和是最大的.如果M >= N个数中正数的个数,那么输出所有正数的和 ...
- 【Leetcode】264. Ugly Number II ,丑数
原题 Write a program to find the n-th ugly number. Ugly numbers are positive numbers whose prime facto ...
- linux——(1)初识linux
linux有窗口管理员环境和纯文本界面环境,同时linux默认提供6个Terminal来让用户登录.crtl+alt+F1-6可自由切换.其中如果窗口管理员环境处于运行状态,那么可以按crtl+alt ...
- [HDU1542]Atlantis(扫描线+线段树)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- AGC 022 B - GCD Sequence
题面在这里! 锻炼脑子的小构造题... 一开始被 a[]<=30000 且 序列 gcd = 1所困扰,但是发现这并没有什么,因为我接下来发现了一种总是能构造出 序列和是6的倍数的方案. 首先如 ...
- 【DFS】【DP】岳麓山上打水
[vijos1159]岳麓山上打水 描述 今天天气好晴朗,处处好风光,好风光!蝴蝶儿忙啊,蜜蜂也忙,信息组的同学们更加忙.最近,由于XX原因,大家不得不到岳麓山去提水.55555555~,好累啊. 信 ...
- python 多继承详解
class A(object): # A must be new-style class def __init__(self): print "enter A" print &qu ...
- ArrayList源码及解析
package java.util; import java.util.function.Consumer; import java.util.function.Predicate; import j ...