微信号:mogu_ttech

介绍:蘑菇街测试技术基础

IntelliJ IDEA插件自动生成单元测试代码

2016-12-16 18:36 天宸

一、背景介绍:

当项目开发逐渐稳定之后,为了保证代码的质量,通常我们需要编写单元测试用例来测试我们的service方法层,但是通常在编写了大量的测试代码后,我们会发现有点心塞:

  1. 单元测试代码的结构很类似,时间一部分浪费在编写测试框架代码上

  2. Spring工程的代码,如何在测试的时候,自动使用Spring的依赖注入功能

  3. 单元测试的测试数据,如何提取出来,并通过文件的方式进行管理

  4. 对DB的测试上,经常需要在beforeTest中编写数据插入插入操作, 在afterTest中编写清理数据DB的操作,有没有基于单元测试的事务回滚功能?

  5. 单元测试使用的包配置和线上的要独立区分开来,如何做配置上的区分?

  6. 对于JSONObject对象,要写一大坨代码来构造一个对象,有点烦




二、IDEA插件基于单元测试上的功能介绍

(1)主要功能:

  1. 支持Spring和非Spring的普通工程,基于TestNG和JUnit(还未扩展)的测试框架, 可以自动生成单元测试的代码框架

  2. 粒度是基于service的method方法

  3. 自动判断方法的参数类型, 如果是基本类型(int 、char、long...)、String , 则会将参数自动写入到csv文件中去, 如果是JSONObject对象,则会自动创建json文件,默认提供方法转化为JSONObject对象注入到Test方法中去

  4. 普通的Maven工程,选中要测试的方法后,会默认生成基于TestNG的以下方法:

    1. BeforeTest

    2. AfterTest

    3. Test

    4. 默认的DataProvider方法 或 基于CSV文件的DataProvider

  5. 基于Spring的Maven工程:

    1. 对于DB操作 ,支持测试类的自动事务管理,通过Spring AOP拦截db请求,测试完成后,自动回滚数据

    2. 集成Spring的IOC功能,只需要配置springContext文件即可,自动注入测试类

    3. 提供隔离单元测试和线上环境要使用的bean,支持使用spring的profile标签

    4. 普通Maven工程生成的测试方法

  6. 支持反射出测试方法的所有参数对象, 并解析出参数对象的所有构造器列表,提供了后续通过数据文件构造复杂数据对象的扩展入口




(2)介绍下Spring testContext的基本原理:

       Spring test framework 主要位于 org.Springframework.test.context 包中,主要包括下面几个类:

  • TestContextManager:主要的入口类,提供 TestContext 实例的管理,负责根据各种事件来通知测试监听器

  • TestContext:实体类,提供访问 Spring applicatoin context 的能力,并负责缓存 applicationContext

  • TestExecutionListener:测试监听器,提供依赖注入、applicationContext 缓存和事务管理等能力

  • ContextLoader:负责根据配置加载 Spring 的 bean 定义,以构建 applicationContext 实例对象

  • SmartContextLoader:Spring 3.1 引入的新加载方法,支持按照 profile 加载


Spring 通过 AOP hook 了测试类的实例创建、beforeClass、before、after、afterClass 等事件入口,执行顺序主要如下:


 

  • 测试执行者开始执行测试类,这个时候 Spring 获取消息,自动创建 TestContextManager 实例

  • TestContextManager 会创建 TestContext,以记录当前测试的上下文信息,TestContext 则通过 ContextLoader 来获取 Spring ApplicationContext 实例

  • 当测试执行者开始执行测试类的 BeforeClass、Before、After、AfterClass 的时候,TestContextManager 将截获事件,发通知给对应的 TestExecutionListener


(3)使用前提条件:

  1. 适用工程类型:  Maven工程, 具有src/main  和src/test 的目录, 可以运行mvn test来执行单元测试

  2. 需要引入一些基础的pom依赖

     
      3. 安装Hydra-Idea-plugin.jar (普通的IDEA插件) : 插件下载及版本说明

(4)具体使用介绍:

  1. 选中想要测试的service方法, 点击邮件后,选中生成单元测试用例



  2.  上图中的方法的参数为: 

public String queryResultFromJira(HttpServletRequest request String issueKey String fields JSONObject requestData )

  

3.  点击按钮后,插件会自动在这个类中, 去寻找methodName 为 queryResultFromJira的方法,可能会有多个(不同参数), 插件会全部解析出来,并展示到UI界面上



需要注意的几点,举例如下:

       a、Spring的配置文件,需要填写classpath对应的路径下,例如resource目录下的,需要填写 /spring-mybatis.xml , /applicatonContext-CrowdRestClient.xml

      b、在WEB-INF下的,填写: /WEB-INF/applicationContext.xml , /WEB-INF/spring-servlet.xml

      c、需要手动选择一个要测试的方法


4. 选中了第一个方法后,插件会自动判断,哪些类型可以自动生成到csv的测试文件中,目前支持基本类型、String、JSONObject对象(会生成单独的json文件)



5.  点击OK后,可以看到生成了下列文件:


    a) TestQueryResultFromJira : 主要的测试类(基于Spring工程),代码如下:



    TestQueryResultFromJira : 主要的测试类(非Spring工程),代码如下:



(b)CSV文件,根据插件的解析, 将可以注入到测试方法的参数,全部写入csv中,如果是json对象,就写入文件路径

issueKey,fields,requestData
,,com/mogujie/qa/require/serviceImpl/TestQueryResultFromJira-requestData.json

    (c)  参数为JSONObject requestData , 根据 测试类名-参数名.json 的格式, 文件为空

    (d)选中了工具方法loadCSV4Testng后, 就会默认在test目录下的com.mogujie.qa.tools包下,生成一个TestUtils.java方法, 主要用来读取csv数据及获取当前的路径信息等, 不会重复生成





6. 到此, 代码的结构就生成完毕了,我们填一下需要的测试数据到csv文件和json文件中去后,编写主要的测试逻辑代码后,就可以跑下测试咯

7. maven跑单元测试的规则:


      Maven本身并不是一个单元测试框架,它只是在构建执行到特定生命周期阶段的时候,通过插件来执行JUnit或者TestNG的测试用例。这个插件就是maven-surefire-plugin,也可以称为测试运行器(Test Runner),它能兼容JUnit 3、JUnit 4以及TestNG。

在默认情况下,maven-surefire-plugin的test目标会自动执行测试源码路径(默认为src/test/Java/)下所有符合一组命名模式的测试类。这组模式为:

  • **/Test*.java:任何子目录下所有命名以Test开关的Java类。

  • **/*Test.java:任何子目录下所有命名以Test结尾的Java类。

  • **/*TestCase.java:任何子目录下所有命名以TestCase结尾的Java类。


添加项目的pom.xml文件描述:




8. 最后, 执行下mvn test就可以啦 , 基于Spring的工程, 会自动启动容器,并注入Context Bean




 
MoguTTech 更多文章 PYTHON调用动态库(so) 数据工厂第二期——场景化的数据工厂构建 基于gatling&jenkins快速打造性能测试平台 研发工具链系统之初步构想 自动化测试框架之推广篇
猜您喜欢 应该知道的前端性能二三事 —— Reflow 和 Repaint 2014 年大数据市场趋势十大预测 有梦的人抓住2016的尾巴 他们黑了几乎所有的苹果,还黑了几乎所有的安卓 ClassyShark——apk分析利器