一、背景
目前只有web接口有测试人员在测试或回归,但service接口却没有专门的人员测试。为了保证接口的功能性的质量稳定,同时减少潜在的代码bug,需要对每一个接口的方法都需要测试,而且也需要对这些接口的方法定期的回归测试。所以,单元测试与集成测试应运而生。
词语解释:
“单元测试”是指接口的方法测试。每一个方法对应一个单元测试方法。
“集成测试”也叫组装测试或联合测试。在单元测试的基础上,将所有模块按照设计要求(如根据结构图)组装成为子系统或系统,进行集成测试。
二、目标
1、service接口的每个方法都得对应一个单元测试。
2、每个单元测试都需要有断言确定结果是否通过或不通过。
3、集成测试需要对单元测试每天定期覆盖性的测试并发送测试报告,提醒开发人员及时修复。
4、单元测试与集成测试可以系统部署定期测试,无需人工守护。
5、集成测试生成的数据不能写入数据库,不能污染数据库数据。
三、技术方案
1、描述:
1.1、系统部署使用现有的部署工具Jenkins。
1.2、每个项目中的单元测试框架使用TestNG,通过插件maven-surefire-plugin插件来执行TestNG的测试用例。
1.3、通过Jenkins的插件:git插件、maven插件、TestNG插件、定时插件、发送邮件的插件等,配合Jenkins实现自动化集成测试框架。
1.4、每个项目的集成测试框架搭建好后,将在每天早上8点自动执行并将结果发送至大家。
1.5、使用TestNG包里的支持事物的类org.springframework.test.context.testng.AbstractTransactionalTestNGSpringContextTests做测试数据回滚,防止数据的污染,所有测试类都继承此类。
注意:
使用TestNG单元测试,想回滚事务,需要确认一下两点:
1)、确认是否继承自 org.springframework.test.context.testng.AbstractTransactionalTestNGSpringContextTests,只有该抽象类支持事务,org.springframework.test.context.testng.AbstractTestNGSpringContextTests 这个类不支持事物。
2)、确认单元测方法是否有@Rollback注解配置,@Rollback(false) 不回滚;@Rollback,回滚;不配置@Rollback,默认回滚。
2、框架流程图:
四、实施方案
一、项目中的配置
1、service实现类的工程在pom.xml中添加testng依赖包, 通过插件maven-surefire-plugin插件来执行TestNG的测试用例:
|
|
|
|
注意:
- 所有的测试类的名称命名格式为XXXTest.java,否则不会被插件扫描到。
- skipTests的值默认为true,如果不希望打包或编译时执行test代码,则带上-DskipTests=false,不写默认执行。
2、新建的测试类
2.1、我们的项目都是基于springBoot搭建的框架,所以测试类在类上配置注解org.springframework.boot.test.context.SpringBootTest, 并指定项目启动类。
2.2、extends(继承)org.springframework.test.context.testng.AbstractTransactionalTestNGSpringContextTests类,该类回将执行测试单元产生的数据回滚。(不是要继承AbstractTestNGSpringContextTests类,该类不会回滚执行单元测试产生的数据)
2.3、单元方法配置注解org.testng.annotations.Test。
具体如下图:
本地跑单元测试选择图标进行操作,如下图:
2.4、本地单元测试指定环境
如果本地开发时写单元好测试方法时,总是提示未指定配置“{spring.application.name}”,那是因为Spring 框架未接收到指定的环境,需要添加“-Dspring.profiles.active=环境参数”;如果不想每个单元测试方法运行时添加这个命令行参数,那么在单元测试类上加上注解org.springframework.test.context.ActiveProfiles,并指定环境参数,如“@ActiveProfiles("dev")”,甚至可以写个基类直接继承,但请勿提交至自动化测试分支。
二、jenkins中部署配置
1、登陆jenkins后,选择“new auto interface test”后,点击“新建Item”,如下图:
2、接着进入新建任务名称页面,任命名称命名规范是"项目名_test",记得选中“Freestyle project”自由风格的项目,然后点击“OK”按钮创建,如下图:
3、接着,下一个页面有多个配置,需要特别注意,分步走:
3.1、 “源码管理”面板配置,在标记1的地方勾选git,在标记2的地方“Repository URL”输入ssh方式的git地址,注意这里的git域名需要改成ip指定,然后在标记3的地方输入分支名,注意,自动化测试分之名统一使用“test_automation”,如果变更代码也请合并到该分支。
4、“构建触发器”面板配置,勾选“build periodically”,表示定期触发构建,在“日程表”输入框中天蝎corn表达式,建议填写“H 8 * * *”,表示每天早上8点触发构建。
5、“构建”面板配置,选择“invoke top-level maven targets”表示maven设置,“maven版本”选择“maven”,目标填写命令行参数“clean test -P daily -DskipTests=false”,其中:clean 表示“删除之前编译的文件”,test“表示执行单元测试,“-P daily”表示选择构建的环境是“daily”;"-DskipTests=false"表示不跳过测试用例,执行测试用例。
6、“构建后操作”面板配置
6.1、点击按钮“增加构建后操作步骤”,选中“Editable Email Notification Templates”,编辑邮件通知,注意,这里是选择邮件模板,模板已配置好。选择后多出一块配置“Editable Email Notification Templates”, 这里选择“自动化测试报告结果邮件模板 - 自动化测试报告结果邮件模板”。
6.6、点击按钮“增加构建后步骤”,选中“Publish TestNG Results”,缺少这一步,邮件中的部分值将拿不到。
8、最后别忘“保存”,否则不生效。