惠安县住房和城乡建设部网站,网址大全123,做网站一定要自己搭建服务器吗,好的网站设计模板对模块进行集成测试时#xff0c;希望能够通过输入URL对Controller进行测试#xff0c;如果通过启动服务器#xff0c;建立http client进行测试#xff0c;这样会使得测试变得很麻烦#xff0c;比如启动速度慢#xff0c;测试验证不方便#xff0c;依赖网络环境等#…对模块进行集成测试时希望能够通过输入URL对Controller进行测试如果通过启动服务器建立http client进行测试这样会使得测试变得很麻烦比如启动速度慢测试验证不方便依赖网络环境等这样会导致测试无法进行为了可以对Controller进行测试可以通过引入MockMVC进行解决。
MockMvc实现了对Http请求的模拟能够直接使用网络的形式转换到Controller的调用这样可以使得测试速度快、不依赖网络环境而且提供了一套验证的工具这样可以使得请求的验证统一而且很方便。
MockMvcBuilder是用来构造MockMvc的构造器其主要有两个实现StandaloneMockMvcBuilder和DefaultMockMvcBuilder分别对应两种测试方式即独立安装和集成Web环境测试此种方式并不会集成真正的web环境而是通过相应的Mock API进行模拟测试无须启动服务器。对于我们来说直接使用静态工厂MockMvcBuilders创建即可。
下面就写一个简单的案例告诉你是如何使用MockMvc进行Controller测试的
01 创建项目
创建一个Maven项目springboot-junit并配置pom.xml参照下面代码
project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdorg.lvgang/groupIdartifactIdspringboot-junit/artifactIdversion1.0-SNAPSHOT/versionpackagingjar/packagingnamespringboot-junit/nameurlhttp://maven.apache.org/urlparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.1.3.RELEASE/version/parentpropertiesproject.build.sourceEncodingUTF-8/project.build.sourceEncoding/propertiesdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactId/dependency/dependencies/project
创建一个Controller类我们在后面就测试空上Controller 02 编写测试类
下面我们就是编写测试类了
package org.lvgang;import org.junit.Assert;import org.junit.Before;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.http.MediaType;import org.springframework.test.context.junit4.SpringRunner;import org.springframework.test.context.web.WebAppConfiguration;import org.springframework.test.web.servlet.MockMvc;import org.springframework.test.web.servlet.MvcResult;import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;import org.springframework.test.web.servlet.result.MockMvcResultHandlers;import org.springframework.test.web.servlet.setup.MockMvcBuilders;import org.springframework.web.context.WebApplicationContext;//SpringBoot1.4版本之前用的是SpringJUnit4ClassRunner.classRunWith(SpringRunner.class)//SpringBoot1.4版本之前用的是SpringApplicationConfiguration(classes Application.class)SpringBootTest(classes App.class)//测试环境使用用来表示测试环境使用的ApplicationContext将是WebApplicationContext类型的WebAppConfigurationpublic class HelloControllerTest { Autowiredprivate WebApplicationContext webApplicationContext; private MockMvc mockMvc; Beforepublic void setUp() throws Exception{ //MockMvcBuilders.webAppContextSetup(WebApplicationContext context)指定WebApplicationContext将会从该上下文获取相应的控制器并得到相应的MockMvcmockMvc MockMvcBuilders.webAppContextSetup(webApplicationContext).build();//建议使用这种} Testpublic void getHello() throws Exception{ /*** 1、mockMvc.perform执行一个请求。* 2、MockMvcRequestBuilders.get(XXX)构造一个请求。* 3、ResultActions.param添加请求传值* 4、ResultActions.accept(MediaType.TEXT_HTML_VALUE))设置返回类型* 5、ResultActions.andExpect添加执行完成后的断言。* 6、ResultActions.andDo添加一个结果处理器表示要对结果做点什么事情* 比如此处使用MockMvcResultHandlers.print()输出整个响应结果信息。* 5、ResultActions.andReturn表示执行完成后返回相应的结果。*/MvcResult mvcResult mockMvc.perform(MockMvcRequestBuilders.get(/).param(name,lvgang).accept(MediaType.TEXT_HTML_VALUE)) // .andExpect(MockMvcResultMatchers.status().isOk()) //等同于Assert.assertEquals(200,status);// .andExpect(MockMvcResultMatchers.content().string(hello lvgang)) //等同于 Assert.assertEquals(hello lvgang,content);.andDo(MockMvcResultHandlers.print()).andReturn(); int statusmvcResult.getResponse().getStatus(); //得到返回代码String contentmvcResult.getResponse().getContentAsString(); //得到返回结果Assert.assertEquals(200,status); //断言判断返回代码是否正确Assert.assertEquals(hello lvgang,content); //断言判断返回的值是否正确}
}
整个测试过程如下 准备测试环境 通过MockMvc执行请求 添加验证断言 添加结果处理器 得到MvcResult进行自定义断言/进行下一步的异步请求 卸载测试环境
03 测试结果
通过执行HelloControllerTest得到以下结果 并且把整个返回结果都打印到了Console中
MockHttpServletRequest:HTTP Method GETRequest URI /Parameters {name[lvgang]}Headers {Accept[text/html]}Handler:Type org.lvgang.HelloControllerMethod public java.lang.String org.lvgang.HelloController.hello(java.lang.String)Async:Async started falseAsync result nullResolved Exception:Type nullModelAndView:View name nullView nullModel nullFlashMap:Attributes nullMockHttpServletResponse:Status 200Error message nullHeaders {Content-Type[text/html;charsetUTF-8], Content-Length[12]}Content type text/html;charsetUTF-8Body hello lvgangForwarded URL nullRedirected URL nullCookies []
通过以上代码我们就完成了一个简单的案例。
附
RequestBuilder/MockMvcRequestBuilders
在上面的测试类中我们用到了这么一个类MockMvcRequestBuilders用来构建请求的此类有以下主要的API
MockHttpServletRequestBuilder get(String urlTemplate, Object... urlVariables)根据uri模板和uri变量值得到一个GET请求方式的MockHttpServletRequestBuilder如get(/user/{id}, 1L)MockHttpServletRequestBuilder post(String urlTemplate, Object... urlVariables)同get类似但是是POST方法MockHttpServletRequestBuilder put(String urlTemplate, Object... urlVariables)同get类似但是是PUT方法MockHttpServletRequestBuilder delete(String urlTemplate, Object... urlVariables) 同get类似但是是DELETE方法MockHttpServletRequestBuilder options(String urlTemplate, Object... urlVariables)同get类似但是是OPTIONS方法MockHttpServletRequestBuilder request(HttpMethod httpMethod, String urlTemplate, Object... urlVariables)提供自己的Http请求方法及uri模板和uri变量如上API都是委托给这个APIMockMultipartHttpServletRequestBuilderfile Upload(String urlTemplate, Object... urlVariables)提供文件上传方式的请求得到MockMultipartHttpServletRequestBuilderRequestBuilder asyncDispatch(final MvcResult mvcResult)创建一个从启动异步处理的请求的MvcResult进行异步分派的RequestBuilder
MockMvcRequestBuilders通过方法得到两类Builder 一个是MockHttpServletRequestBuilder 一个是MockMultipartHttpServletRequestBuilder 上传文件
MockHttpServletRequestBuilder
主要有以下API
MockHttpServletRequestBuilder header(String name, Object... values)/MockHttpServletRequestBuilder headers(HttpHeaders httpHeaders)添加头信息MockHttpServletRequestBuilder contentType(MediaType mediaType)指定请求的contentType头信息MockHttpServletRequestBuilder accept(MediaType... mediaTypes)/MockHttpServletRequestBuilder accept(String... mediaTypes)指定请求的Accept头信息MockHttpServletRequestBuilder content(byte[] content)/MockHttpServletRequestBuilder content(String content)指定请求Body体内容MockHttpServletRequestBuilder param(String name,String... values)请求传入参数MockHttpServletRequestBuilder cookie(Cookie... cookies)指定请求的CookieMockHttpServletRequestBuilder locale(Locale locale)指定请求的LocaleMockHttpServletRequestBuildercharacterEncoding(String encoding)指定请求字符编码MockHttpServletRequestBuilder requestAttr(String name, Object value) 设置请求属性数据MockHttpServletRequestBuilder sessionAttr(String name, Object value)/MockHttpServletRequestBuilder sessionAttrs(Mapstring, object sessionAttributes)设置请求session属性数据MockHttpServletRequestBuilder flashAttr(String name, Object value)/MockHttpServletRequestBuilder flashAttrs(Mapstring, object flashAttributes)指定请求的flash信息比如重定向后的属性信息MockHttpServletRequestBuildersession(MockHttpSession session) 指定请求的SessionMockHttpServletRequestBuilder principal(Principal principal) 指定请求的PrincipalMockHttpServletRequestBuilder contextPath(String contextPath) 指定请求的上下文路径必须以“/”开头且不能以“/”结尾MockHttpServletRequestBuilder pathInfo(String pathInfo) 请求的路径信息必须以“/”开头MockHttpServletRequestBuilder secure(boolean secure)请求是否使用安全通道MockHttpServletRequestBuilder with(RequestPostProcessor postProcessor)请求的后处理器用于自定义一些请求处理的扩展点
MockMultipartHttpServletRequestBuilder
继承自MockHttpServletRequestBuilder又提供了如下API
MockMultipartHttpServletRequestBuilder file(String name, byte[] content)/MockMultipartHttpServletRequestBuilder file(MockMultipartFile file)指定要上传的文件
ResultActions
调用MockMvc.perform(RequestBuilder requestBuilder)后将得到ResultActions通过ResultActions完成如下三件事
ResultActions andExpect(ResultMatcher matcher) 添加验证断言来判断执行请求后的结果是否是预期的
ResultActions andDo(ResultHandler handler) 添加结果处理器用于对验证成功后执行的动作如输出下请求/结果信息用于调试
MvcResult andReturn() 返回验证成功后的MvcResult用于自定义验证/下一步的异步处理
ResultMatcher/MockMvcResultMatchers
ResultMatcher用来匹配执行完请求后的结果验证其就一个match(MvcResult result)断言方法如果匹配失败将抛出相应的异常
具体提供以下API
HandlerResultMatchers handler()请求的Handler验证器比如验证处理器类型/方法名此处的Handler其实就是处理请求的控制器
RequestResultMatchers request()得到RequestResultMatchers验证器
ModelResultMatchers model()得到模型验证器
ViewResultMatchers view()得到视图验证器
FlashAttributeResultMatchers flash()得到Flash属性验证
StatusResultMatchers status()得到响应状态验证器
HeaderResultMatchers header()得到响应Header验证器
CookieResultMatchers cookie()得到响应Cookie验证器
ContentResultMatchers content()得到响应内容验证器
JsonPathResultMatchers jsonPath(String expression, Object ... args)/ResultMatcher jsonPath(String expression, Matcher matcher)得到Json表达式验证器
XpathResultMatchers xpath(String expression, Object... args)/XpathResultMatchers xpath(String expression, Mapstring, string namespaces, Object... args)得到Xpath表达式验证器
ResultMatcher forwardedUrl(final String expectedUrl)验证处理完请求后转发的url绝对匹配
ResultMatcher forwardedUrlPattern(final String urlPattern)验证处理完请求后转发的urlAnt风格模式匹配since spring4
ResultMatcher redirectedUrl(final String expectedUrl)验证处理完请求后重定向的url绝对匹配
ResultMatcher redirectedUrlPattern(final String expectedUrl)验证处理完请求后重定向的urlAnt风格模式匹配since spring4
最后 下方这份完整的软件测试视频教程已经整理上传完成需要的朋友们可以自行领取【保证100%免费】 软件测试面试文档
我们学习必然是为了找到高薪的工作下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料并且有字节大佬给出了权威的解答刷完这一套面试资料相信大家都能找到满意的工作。 行动吧在路上总比一直观望的要好未来的你肯定会感谢现在拼搏的自己如果想学习提升找不到资料没人答疑解惑时请及时加入群1150305204里面有各种测试开发资料和技术可以一起交流哦。