开发者学堂课程【高校精品课-厦门大学 -JavaEE 平台技术:切片测试与集成测试】学习笔记,与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/80/detail/15966
切片测试与集成测试
内容介绍:
一、前言
二、切片测试
三、Controller
四、Service
五、集成测试的代码
一、前言
切片测试和集成测试。切片测试和集成测试其实用了相同的技术,都会依赖于spring 框架以及 spring 的环境来进行测试。但切片测试和集成测试的差别在于切片测试可以在 spring 的环境中间把某一部分切开,切的时候既可以横向切也可以纵向切。在本课例子中的是横向切,也就是把 control 层和 service 层切开,也可以纵向切,就是把相互依赖的,比如 service 对象,切开来单独进行测试。切片测试
和集成测试是怎样做的?
二、切片测试
切片测试中 controller 的代码跟 service 代码分开来单独做切片测试。下面分为
controller 和 service 两部分进行梳理。
三、Controller
因为数据里只有一个 controller 即 goodscontroller ,所以做了一个叫做goods controller taste 的类放到了 controller 的包底下。测试类前面里有两个标签。
1.第一个标签
(1)、第一个标签是@Spring book taste,当前的类是一个测试类,而且是一个springboard 测试类,所以后面有一个 classes=demo application class,跟model对象或者vo对象的测试不一样,要测试 controller 需要依赖于 spring 容器的环境。(2)、spring 容器的环境在哪?后面定义其实就是要用 demoapplication.class文件中间所描述的 spring 的环境,这个文件就是生产的环境的,与应用环境是一致的。因为根是定义在 demoapplication.class 里。
第一句话,所描述的内容只有两个,第一个是当前的类是一个测试类,第二测试类所用的环境是跟的生产的环境是完全一样。
(3)、第二个注解是关于 MVC 的部分,因为如果严格去测试 controller 的话,应该把service容器运行起来,向 service 容器发HTTP的请求,然后去看HTTP的返回,是不是预期的结果。但是这样测试很慢,因为过程虽然单机上来来执行,但它还是通过网络的网络端口的一个过程,而且还要依赖于设备的容器,所以在测控制器的时候,往往采用了一种模拟的方式,并不真正的去启动设备的容器,而是模拟的一个测试过程,通过模拟的过程,去发 HTT P的 request,实际没发,就是模拟了一个HTTP 的 request 的过程。完成一个测试,称这样的一个模拟测试叫做 mockmvc。
图中可以看到 mockmvc 是被注入进来的,mockmvc 有很多的配置。
2.第二个标签
第二个标签 AuttoConfiguremockmvc,其实就是去自动配置模拟MVC的这个相关
的配置,现在没有给值,其实可以在后面配一些值。这是测试类前面的两个标签。
3.测试类里注入的两个对象
测试类里面,注进了两个对象,一个对象是 mock mvc,就是用来模拟MVC的控制器。第二个是 mock bean。
(1)、因为 goods service 需要跟 controller 切割开,因为 goodscontroller 之间只用了goodsservice,所以用一个mock bean 去标记 goodsservice 对象,加了两个标签以后,Spring 的容器会把这两个对象注射进来,通过这点来说,能够看出来good controller case 其实是一个 spring 的并对象。
(2)、spring的容器注进来两个对象的话,其中,goods service 对象其实并不是真正在生产代码中间的 goods service 对象,而是注进来一个模拟的对象。,实现跟goods service 类相同的行为。
四、service
goods service 实现的方法。提供一个 given 的方式来模拟所有的方法返回的值。
1. 第一个测试方法,
这个方法前面要加一个@test 标签,就表示这个方法是一个要运行的测试的方法。
(1)、第一句话是,对于住进来的模拟的 goods service 要定义它的 find ID的这个方法的行为是什么?因为目前要测 controller 的 get goods 版 ID 的方法是调goods service的find ID方法的,通过 given 的一个定义,定义了find ID。
(2)、如果参数值输进来是1的话,它会返回一个什么样的值?它会返回从goods factory 中间创建出来的一个ID为1的对象,这个可以去看 goods factory 的相关的方法,后面的部分有了这样的一个前提,就会通过某个 MVC 去发出一个 get的请求,从 Perform get 发出一个 get 的请求,And expect 所描述的就是期望请求的返回值,它的 statvs 是OK,就是200。
(3)、期望content的content type是application Json的Utf-8码,然后,要把真正的返回值拿过来,所以去andReturn(). getResponse() getCountent AsString ();作为一个字符串拿过来。拿过来的是一个 Json 的串,所以把期望的值也用 Json 的字串写,然后再利用了 Json asser 包,或者说引入一个叫做 Json assert 包里的方法。
(4)、Json asser这个方法的主要作用就是去比较两个 Json 字串的是不是一样的。
第一个参数是期望的 Json 字串。
第二个是正式返回的 Json 字串。
第三个参数其实是做严格比较,还是不严格比较。true 的话就是严格比较,就是两个自串的东西是完全一样的,不严格比较就是可以允许r esponse Json 里的值多于expect里Json 的值。就是expect 的Json 的项可能少一些,response 的项是多一些,只要 response 里返回的 Expect response中间有的值在 response string 中间也有,结果就是对的。如果第三步是 force 的话,就是这样的一个定义。
2.第二个测试方法
后面的方法其实类似,第二个方法,是去测它的search goods by name,同样因为方法中间调了goods service的search by name方法,所以定义了参数是“墨迹”
的话,创建一个带墨迹的goods,就会给它一个返回值。
创建对象的部分来说,given,是描述了 good servic e的 create goods 一个方法。因为在creategoods中间传进去的是一个 goodsvo 的对象,但是在测试代码中间的vo的对象,和goods service对象不一定是同一个对象,所以用了一个 any,但其实用了any的话,就是只要去调 create goods,它返回的就是看到 goods 对象,就是return 建出来的 goods 对象。
Modify 和 modify goods taste 和并列特色比较简单,其实就是直接返回了 true,来把 goods service 的对象和 controller 对象切开,使得测试代码只会测controller 的对象。
五、集成测试的代码
集成测试代码在 good controller integration tes t里,集成测试的代码跟切片测试代码是一样的,只是没有去模拟 goods service。
注入对象中间没有去注入goods service 模拟的 goods service 的对象,在所有的方法之前,也没有去定义 Good service 对象将会返回什么样的值,就直接去通过mockMVC 去调它对应的 controller 的方法,然后去看它的值是不是强硬的值,测的是一个整体,把它称之为集成测试。