Jenkins +JUnit

余生颓废 提交于 2020-03-07 06:01:29

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 }
MessageUtil.java
 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 }
TestMessageUtil.java
 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>
build.xml

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目录下,重新构建,成功!

 

 

 

  

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!