TestNG+Jekins+Maven+Spring集成方案

一、问题描述:

现有Jekins+Maven+Spring项目并没有做系统的单元测试,仅有少量勤快的开发者会为业务模块添加单元测试。为实现项目系统的单元测试过程,本文将TestNG测试框架与现有项目进行整合,从而支持单元测试以及项目在构建前进行项目范围内的单元测试,从而保障项目代码质量,确保项目新的改动不影响原有代码。

二、需求:

2.1 Maven构建的Spring项目中使用TestNG进行单元测试;
2.2 Jekins构建项目时进行批量单元测试得出测试报告,单元测试通过才能成功构建;

三、实现:

3.1 在Maven项目中的pom.xml配置文件中添加如下内容:
//TestNG依赖 
//5.11以上版本使用下述配置,5.11及以下版本需要指定使用jdk15版本
<dependencies>
  [...]
    <dependency>
      <groupId>org.testng</groupId>
      <artifactId>testng</artifactId>
      <version>6.8.8</version>
      <scope>test</scope>
    </dependency>
  [...]
</dependencies>
//注意,若项目中已有JUnit依赖,可exclude对JUnit的依赖避免冲突
//在本项目中Elasticsearch与TestNG都存在com.google.guava依赖,从而产生冲突,通过exclude其中低版本的guava依赖解决
//若你的项目未使用JUnit、Elasticsearch则不存在冲突使用上述配置即可
<dependencies>
  [...]
    <dependency>
      <groupId>org.testng</groupId>
      <artifactId>testng</artifactId>
      <version>6.8.8</version>
      <scope>test</scope>
      <exclusions>
            <exclusion>
                  <artifactId>junit</artifactId>
                  <groupId>junit</groupId>
            </exclusion>
            <exclusion>
                  <artifactId>guava</artifactId>
                  <groupId>com.google.guava</groupId>
            </exclusion>
      </exclusions>
    </dependency>
  [...]
</dependencies>
//TestNG调用插件surefire
<plugin>
//TestNG的Maven调用插件
 <artifactId>maven-surefire-plugin</artifactId>
 <version>2.18.1</version>
 <dependencies>
 <dependency>
 <groupId>org.apache.maven.surefire</groupId>
 <artifactId>surefire-testng</artifactId>
 <version>2.18.1</version>
 </dependency>
//需要TestNG兼容JUnit时添加下述依赖,则可以通过TestNG调用JUnit测试用例
 <dependency>
 <groupId>org.apache.maven.surefire</groupId>
 <artifactId>surefire-junit47</artifactId>
 <version>2.18.1</version>
 </dependency>
 </dependencies>
<configuration>
<suiteXmlFiles>
//testng.xml 为TestNG的调用xml配置,默认放在项目根目录下,其他目录需要指定路径
<suiteXmlFile>testng.xml</suiteXmlFile>
</suiteXmlFiles>
</configuration>
</plugin>
//若你的项目仅用到TestNG不使用JUnit可采用下述简化配置
<plugin>
//TestNG的Maven调用插件
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.18.1</version>
  <configuration>
    <suiteXmlFiles>
//testng.xml 为TestNG的调用xml配置,默认放在项目根目录下,其他目录需要指定路径
      <suiteXmlFile>testng.xml</suiteXmlFile>
    </suiteXmlFiles>
  </configuration>
</plugin>

此外可以通过Maven直接配置TestNG的测试运行配置替换上述的suiteXmlFiles部分,但建议还是通过上述通过xml配置的方式把TestNG的配置放到独立的xml中来做。
更多:maven文档:Using TestNG

3.2 配置testng.xml

可通过ide工具或手动创建TestNG配置文件

//调用TestNG测试用例
<!DOCTYPE suite SYSTEM"http://testng.org/testng-1.0.dtd"> 
//测试套件名称,即本测试的一个名称标识
<suite name="my_test">
    <test verbose="1" name="xxx" >
//指定测试该类的测试用例
        <classes>
            <class name="com.lianjia.configserver.SmokeTest"/>
        </classes>
    </test>
</suite>
//调用TestNG、JUnit测试用例
<!DOCTYPE suite SYSTEM"http://testng.org/testng-1.0.dtd"> 
//测试套件名称,即本测试的一个名称标识
<suite name="TestAll">
//允许JUnit测试
 <test name="junitTestCases" junit="true">
//该测试覆盖的包名
 <packages>
 <package name="com.test.*"/>
 </packages>
 </test>
//TestNG测试配置
 <test name="testNGTestCases"> 
//测试该包下的测试用例
 <packages>
 <package name="com.test.*"/>
 </packages>
 </test>
</suite>

通过@Test(groups={"公用测试组",“私用测试组”})标明测试用例属于的分组,在testng.xml中指明需要测试的分组,则可以灵活的运行指定的部分测试。

//调用TestNG分组测试
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Suite1">
    <test name="test1">
        <groups>
        <run>
        <include name="functest" />
        </run>
    </groups>
    <classes>
        <class name="GroupTestExample" />
    </classes>
    </test>
</suite>

TestNG配置支持运行指定包、类的测试用例,支持排除指定包、类的测试用例,以及分组测试、并发测试、依赖测试等等,更多设置再次不赘述。
更多:testng配置文件学习

3.3 编写测试用例
3.3.1 测试目录结构

在src/test/java目录下放置项目单元测试用例、调用器;可以定义单元测试用例的基类放到service目录;单元测试用例放在usecase目录;TestNG(或JUnit)均支持java代码调用测试用例,再次称作测试用例调用器,可以放在src/test/java目录下方便位置。


项目单元测试包结构
3.3.2 单元测试用例

Spring提供AbstractTestNGSpringConyextTests与AbstractTransactionalTestNGSpringConyextTests(支持事务自动回滚)抽象类用于支持TestNG测试;通过@ContextConfiguration注解支持Spring配置文件的加载,则测试用例中就可以像在Spring项目中一样的使用Bean。可以通过ide直接运行测试用例类或方法或通过Maven调用或者通过下述java代码调用。

testng单元测试类

建议在每个测试用例中输出表明业务功能、测试预期、测试结果的日志输出,便于查阅定位问题。
import static org.testng.Assert.* 该声明后能够直接在代码中使用org.testng.Assert中的断言方法,简化代码。

testng单元测试类

可以通过ide直接运行测试用例类或方法或通过Maven调用或者通过下述java代码调用。

java代码调用testng单元测试

开发者开发完业务模块功能后通过调用测试用例,可以进行单元测试。

ide(idea)中运行测试用例结果
至此已经可以成功的进行单元测试了,可通过mvn test的方式调用单元测试执行;也可以通过ide直接运行指定的测试用例方法。
3.4 Jekins配置

然而单元测试的执行到目前只能通过开发人员自觉调用来确保单元测试的进行,如果一个同学新提了一新模块代码,应该进行一次覆盖范围足够涉及各影响面的单元测试,从而确保新代码未影响以前的各功能模块。本项目通过Jekins配合TestNG实现该需求,Jekins支持在构建前后调用mvn test进行单元测试,并且支持针对单元测试的多种设置,比如:单元测试不通过则构建失败、生成单元测试报告、生成单元测试覆盖率统计等等。通过集成Jekins能够保障我们通过Jekins构建的代码均进行过单元测试。

配置构建过程,构建时不进行测试,通过下述 “Invoke top-level Maven targets”过程调用测试

构建配置
添加test

配置进行 mvn test,则Jekins构建时会触发Maven调用surefire插件进行TestNG测试

添加test后的test配置
添加构建后操作用于生成报告
testng报告生成配置

testng-results.xml是TestNG生成的测试报告,Jekins通过该插件拿取该报告并进行显示。若你的项目没有“Publish TestNG Results”插件可以联网下载或到Jekins官网下载插件通过“系统管理->管理插件->高级->上传”的方式离线安装该插件;若你的项目是JUnit测试的可通过“Publish JUnit Results”插件生成JUnit测试报告。

至此你已经可以通过Jekins在构建前进行单元测试,并得到单元测试报告。
测试结果
测试报告
Console Output输出日志

Console Output输出日志

单元测试未通过则会构建失败,通过查阅Console Output输出日志或TestNG报告可定位测试失败的单元测试用例。

四、总结

单元测试能够细粒度的检测项目中业务模块的质量,同时能保障项目增加新代码时对旧有模块的影响可见性,此外能为集成测试提供基础。单元测试中若用到外部依赖的接口等场景下可利用mock测试工具进行仿真。后续可以通过指定单元测试规范定义怎么样的场景、方法应该进行单元测试提高单元测试质量,此外,可以通过监控单元测试覆盖率保障单元测试覆盖范围。


参考

用于执行JUnit、TestNG测试用例的Maven插件:Maven Surefire Plugin

Maven中测试插件(surefire)的相关配置及常用方法

eclipse+maven+testng+maven-surefire-plugin使用问题全记录

maven-2 - 在使用maven-surefire-plugin的同一个项目中,如何执行JUnit和TestNG测试?

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

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,087评论 18 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,289评论 6 344
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,543评论 25 707
  • 说到我写作的历程,分为三个阶段: 第一个阶段是:随意写作。 我16岁时写过几首小诗,也喜欢和同学们通信。但是走上了...
    MAY聆听诗语阅读 248评论 0 4
  • 大家都知道,张良是汉朝的一代忠臣。也是刘邦手下最具有谋略和计策的人之一。也是刘邦手下的著名的智囊。他同样也...
    是这样的吗阅读 299评论 0 0