转载: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的更多相关文章

  1. jenkin插件整理

    分类 plugin名称 wiki地址 源码地址 plugin作用范围 备注 Build Reports构建报告(此类插件用来分析构建结果,比果代码检查,测试CASE分析,并将这些结果以报表,趋势图等形 ...

  2. 负载,性能测试工具-Gatling

    前言 Gatling Gatling是一款功能强大的负载测试工具,它为易于使用,高可维护性和高性能而设计. 开箱即用,Gatling由于对HTTP协议的出色支持,使其成为负载测试任何HTTP服务器的首 ...

  3. 阿里,百度,腾讯招聘 Java 程序员的技术标准

    阿里巴巴篇 扎实的计算机专业基础,包括算法和数据结构,操作系统,计算机网络,计算机体系结构,数据库等 具有扎实的Java编程基础,理解IO.多线程等基础框架 熟练使用Linux系统的常用命令及shel ...

  4. DEVOPS技术实践_12:创建持续集成的管道

    持续集成不仅包含了Jenkins或者相关其它的CI工具,也包含了包含代码如何控制,采用的什么分支策略等.不同的组织可能采用不同的类型的策略来完成CI,策略类型和项目的类型的有很大的关系. 一 分支策略 ...

  5. DEVOPS技术实践_08:声明式管道语法

    简介 前面简单的做了管道的实验,看了一下的它的效果 声明式管道是Groovy语法中的一个更简单和结构化的语法.下面主要学习明式管道语法. 一 声明式管道的基本结构 以上节的代码为例 node { de ...

  6. 搭建持续集成单元测试平台(Jenkins+Ant+Java+Junit+SVN)

    一.环境准备 Jenkins: 到官网下载jenkins.war包:http://jenkins-ci.org/ 安装方法有两种: 把下载下来的jenkins.war包放到文件夹下,如C:\jenki ...

  7. jenkins+maven+junit构建自动化测试,整合junit xml生成直观的测试报告[留存]

    在自动化测试过程中,测试报告最能直观的体现测试的价值,之前一直使用maven+junit来构建我的自动化测试,但这样有几个缺点,一是,不能定时构建自动化任务(也许是我没有找到maven有没有提供这样的 ...

  8. Jenkins配置Publish Junit test result report(转)

    参考这篇文章:http://www.yiibai.com/jenkins/jenkins_unit_testing.html 插件:JUnit Plugin

  9. ruby rspec+jenkins+ci_report持续集成生成junit测试报告

    1.加载ci_report gem install ci_reporter_rspec 2.给测试工程编写rakefile require 'ci/reporter/rake/rspec' requi ...

随机推荐

  1. 前端读者 | 如何判断Javascript对象是否存在

    本文来自@阮一峰 Javascript语言的设计不够严谨,很多地方一不小心就会出错. 举例来说,请考虑以下情况. 现在,我们要判断一个全局对象myObj是否存在,如果不存在,就对它进行声明.用自然语言 ...

  2. LOJ #6284. 数列分块入门 8-分块(区间查询等于一个数c的元素,并将这个区间的所有元素改为c)

    #6284. 数列分块入门 8 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2   题目描述 给出 ...

  3. 洛谷P3195 [HNOI2008] 玩具装箱 [DP,斜率优化,单调队列优化]

    题目传送门 题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N ...

  4. LoggerAspect

    package nc.oss.utils; import java.util.Date; import nc.bs.framework.common.InvocationInfoProxy; impo ...

  5. jsp页面中获取session中的值

    Jsp中获取Session: session是jsp的内置对象,所以你可以直接写在jsp的 <% session.setAttribute("a", b); //把b放到se ...

  6. Spring Security静态资源访问

    在使用Spring Security时要求所有请求都需要授权访问,此时会定义过滤规则如下 protected void configure(HttpSecurity http) throws Exce ...

  7. 线性基【CF845G】Shortest Path Problem?

    Description 给定一张 \(n\) 个点 \(m\) 条边的无向图,一开始你在点 \(1\),且价值为 \(0\) 每次你可以选择一个相邻的点,然后走过去,并将价值异或上该边权 如果在点 \ ...

  8. 求高精度幂(poj1001)

    Description Problems involving the computation of exact values of very large magnitude and precision ...

  9. 【BZOJ 2803】【POI 2012】Prefixuffix

    http://www.lydsy.com/JudgeOnline/problem.php?id=2803 核心思想是利用单调性. 因为长度为L的前缀和后缀循环同构是AB和BA的形式,我们设\(f(i) ...

  10. Educational Codeforces Round 9 A. Grandma Laura and Apples 水题

    A. Grandma Laura and Apples 题目连接: http://www.codeforces.com/contest/632/problem/A Description Grandm ...