一步步实现持续集成(八)执行单元测试

本章将在Jenkins中自动执行单元测试脚本,并生成测试报告。使用了较为方便的Spock测试框架,非常值得在Java项目的单元测试中推广应用。

(一)使用Spock框架进行自动化单元测试

  1. Spock的介绍

谈到java的单元测试框架,一般常用的是JUnit,但我们今天推荐的单元测试框架是Spock。

Spock是基于groovy和Java语言的框架,它的特点是能够高效方便的进行编码和展示测试结果。Spock用groovy语言编写,groovy语言是基于Java的,语法很多类似Python,Java程序员可以无缝掌握。

Spock框架的优点很多。除了继承了groovy的方便的语法外,还有两个比较重要的优点:

  • 方法名称、输入输出都可以用字符串表示,并出现在测试报告内。这样,直接通过方法名称和输入输出名称,就能直观的看到测试了哪些内容。
  • 测试结果能够很直观的展现,便于查找问题,这是区别于Junit最明显的一点。

Spock的几个优点我们会在后面的案例里逐步演示。

  1. pom的配置

要在代码中使用Spock框架,首先当然是在pom中声明依赖项。Spock的依赖项可以分为两个部分,一个是框架本身的依赖项,一个是生成测试报告的依赖项,具体的配置项如下所示。

</plugins> 
<plugin>
  <artifactId>maven-surefire-plugin</artifactId>
     <version>2.6</version>
     <configuration>
    <userFile>false</userFile>
     <includes>
     <include>**/*Spec.java</include>
    <include>**/*Test.java</include>
     </includes>
     </configuration>

   </plugin>
  </plugins>
   </build>

  <dependencies>
    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
  <scope>test</scope>
  </dependency>
  <dependency>
  <groupId>org.spockframework</groupId>
  <artifactId>spock-core</artifactId>
  <version>1.1-groovy-2.4</version>
  <scope>test</scope>
  </dependency>
  <dependency>
  <groupId>org.codehaus.groovy</groupId>
  <artifactId>groovy-all</artifactId>
  <version>2.4.4</version>
  <scope>test</scope>
  </dependency>

  <!---->
  <!-- 单元测试报告 -->
  <dependency>
  <groupId>com.athaydes</groupId>
  <artifactId>spock-reports</artifactId>
  <version>1.6.1</version>
  <scope>test</scope>
  <!-- this avoids affecting your version of Groovy/Spock -->
  <exclusions>
    <exclusion>
    <groupId>*</groupId>
    <artifactId>*</artifactId>
    </exclusion>
    </exclusions>
  </dependency>

  <!-- // if you don't already have slf4j-api and an implementation of it in the classpath, add this! -->
  <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.13</version>
    <scope>test</scope>
    </dependency>
    <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-simple</artifactId>
    <version>1.7.13</version>
    <scope>test</scope>
   </dependency>
  1. 单元测试的编码

下面使用Spock开发单元测试编码。简单的对一个变量赋值方法进行测试。方法所在的类如下所示。

public class test {
    int i;
    public String j;
    public String AAA;

    public void mytest() {
    if(AAA !=j)
        j = AAA;
  }
}

方法的测试代码如下所示。

class myTest extends spock.lang.Specification{

    def "测试基本功能"(){

        given:"赋初始值"
        def test1 = new test()
        test1.j = j
        test1.AAA = a

        when:"执行赋值语句"
        test1.mytest()

        then:"两个值相等"
        test1.j == test1.AAA

        where:"给定初始值"
        j        | a
        "01"     |  "02"
    }
}

测试结果如图所示,明显测试已通过。


测试已通过.jpg

通过上面的测试代码可以发现,Spock的语法是非常直观方便的,测试内容,输入输出都能够通过命名一目了然。

为了进一步演示Spock的特点,我们将测试要求做一点修改,将两个变量判等,修改为判不等,那么测试当然是无法通过的,我们看看对于测试失败的情况,Spock会如何显示,显示结果见下图。


1.将测试结果修改为将失败.jpg

由图中可见,Spock对于失败的测试,清晰的显示了输入输出和最终失败的原因。

2.Spock的结果展示.jpg
  1. 测试结果和报告

Spock对于测试报告也有非常直观的显示方式,有专用的spock-reports插件进行测报显示。测报效果如图。


3.spock测报显示效果.jpg
  1. 代码提交远程服务器

至此,我们的单元测试脚本已经编码执行完毕,需要将代码提交到远程服务器,准备交由Jenkins去执行。设置好远程服务器地址,add和commit代码后,就可以push到远程服务器了。

(二)Jenkins的配置

  1. 任务配置

要在Jenkins内自动进行单元测试,需要在两个位置进行配置。一个是在编译时,配置maven来执行test部分代码,一个是在编译后,向Jenkins指定测试报告路径,在Jenkins任务内显示单元测报。下面我们来看具体配置。


Jenkins任务配置.jpg
  1. 执行结果

在Jenkins内进行手工构建,执行结果见下图。在页面上可以点击测报的超链接,进一步查看测报。

任务页面的测报链接.jpg
3.spock测报显示效果.jpg

总结

至此,我们完成了在Jenkins内的自动化单元测试脚本的执行和生成测报。通过本章,我们接触了Spock这一方便的Java项目测试框架,大家有兴趣可以进一步了解groovy和Spock。另外对于Jenkins内的单元测试调用配置也是非常方便,通过本章也能有个大概的了解。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355

推荐阅读更多精彩内容