您现在的位置是:主页 > news > 怎样进入医院公众号/好的seo网站

怎样进入医院公众号/好的seo网站

admin2025/4/29 13:43:26news

简介怎样进入医院公众号,好的seo网站,二维码生成器网页版,小型教育网站的开发与建设spring测试单元测试之前,我向您展示了如何总体上测试Spring应用程序:通过创建“模块化”应用程序。 在这里,“模块化”一词的含义与通常的含义不同,您可以将模块升级或替换为另一个。 “模块化”意味着将大型的整体式Spring配置分…

怎样进入医院公众号,好的seo网站,二维码生成器网页版,小型教育网站的开发与建设spring测试单元测试之前,我向您展示了如何总体上测试Spring应用程序:通过创建“模块化”应用程序。 在这里,“模块化”一词的含义与通常的含义不同,您可以将模块升级或替换为另一个。 “模块化”意味着将大型的整体式Spring配置分…

spring测试单元测试

之前,我向您展示了如何总体上测试Spring应用程序:通过创建“模块化”应用程序。 在这里,“模块化”一词的含义与通常的含义不同,您可以将模块升级或替换为另一个。 “模块化”意味着将大型的整体式Spring配置分解为多个配置片段,无论是基于XML还是JavaConfig的片段(这在使应用程序在传统意义上更具模块化方面肯定走了很长一段路)。

还请参见: 用于集成测试的Spring配置模块化

如今,大多数现代应用程序都是Web应用程序,在Spring世界中,这意味着Spring MVC应用程序。 有两种方法可以测试此类Web应用程序,但可以将其缩小到这三种类型。

在代码级别进行测试

可以像在任何标准应用程序中一样在代码级别进行测试。 基本上,这意味着用已知的输入调用所需的方法并验证输出。 测试代码如下所示:

PetController petController = new PetController();
Map model = new HashMap<>();
String forward = petController.initCreationForm(1, model);
// Assert the forward is the expected
// Assert the model has been updated

这对于标准应用程序非常有效,但是Spring MVC应用程序存在很大的缺点。 以这种方式进行的测试会忽略应用程序的重要功能:拦截器,国际化,通过@ModelAttribute批注通过其他方法完成的模型实例,等等。 本质上,我们的测试水平太低,因此对测试结果没有信心。

在HTML级别进行测试

要解决此问题,可以向下一层进行HTML级别的测试。 这种方法是加载页面,找到所需的GUI组件-例如登录字段和提交按钮,并以某种方式与它们交互-填写登录字段并单击按钮,然后最后在返回的页面上声明组件–检查标题为“ Welcome”。 这种测试策略的一个例子是Selenium框架。

该解决方案的主要缺点是它的脆弱性:GUI是应用程序中更改最频繁,更改最大的层; 这意味着投资回报率非常低,即使是正数也是如此。 当然,有两种缓解技术,但仅仅是缓解技术。

在HTTP级别进行测试

最终的方法是降低测试水平并在HTTP级别进行测试。 您无需考虑组件,而可以考虑请求和响应,即您没有在字段中填写登录值,而是设计了将登录名添加到查询字符串的请求。 尽管URL比GUI组件更稳定,但参数名称却不稳定。 此外,断言结果仍然必须在HTML级别完成,并且具有与以前的解决方案相同的缺点。 HTTPUnit是可以与该策略一起使用的框架的一个很好的例子。

由于没有现有的解决方案可以满足我们的要求,因此必须找到一种新的方法,这正是Spring Test提供的有关Spring MVC的方法。 Spring Test允许您在URL级别进行测试,同时断言与Spring相关的不同内容-模型,闪存属性等,并启用所有Spring MVC功能-i18n,拦截器等。

Spring MVC测试的入口点是MockMvc类。 可以通过以下任何一个片段来获取它:

  • MockMvcBuilders.webAppContextSetup(WebApplicationContext).build()用于在应用程序服务器中部署的“标准”应用程序
  • 使用新的Spring Boot模块的MockMvcBuilders.standaloneSetup(Object…).build()用于应用程序
1个

图1. Spring Test MVC概述

MockMvc类本身相对较小,它仅提供perform()方法。 但是,它位于完整的类层次结构的中心,如图1所示。

要求建造者

请求构建器用于构建伪请求对象。 RequestBuilder是一个简单的接口,提供单个buildRequest(ServletContext)并返回MockHttpServletRequest对象。 它通过MockHttpServletRequestBuilder实现Builder模式。

后者的实例可以通过MockMvcRequestBuilders工厂获得(请注意类名中的复数形式)。 每个HTTP方法都有一个工厂方法,以该方法命名,但是使用小写形式: get()put()post()等。所有方法都有两种不同的重载形式:

图2. Request Builder类的层次结构

图2. Request Builder类的层次结构

  • 一个采用单个URI参数
  • 另一个接受URI模板的String和变量的varargs Object。 URI模板(例如get(“ / customer / {customerId}”) )将由测试框架解析。

MockHttpServletRequestBuilder以流畅的API的形式为生成的Fake请求提供了许多配置功能。 有两种类型的配置方法,如图2所示。

  • 与HTTP协议本身有关的内容:

屏幕截图2015年2月27日在16.30.38

  • 与JavaEE API相关的内容:

屏幕截图2015年2月27日在16.30.50

这是使用fluent API的示例:

MockServletContext servletContext = new MockServletContext(); MockHttpServletRequestBuilder builder = get("/customer/{id}", 1234L)
.accept("text/html")
.param("lang", "en")
.secure(true);
MockHttpServletRequest request = builder.buildRequest(servletContext);

请求处理程序

图3.结果处理程序类的层次结构

图3.结果处理程序类的层次结构

请求处理程序用于对ResultActions实例执行操作。 Spring提供了一个开箱即用的处理程序,可以将MvcResult的完整详细信息打印到标准输出中。

这是一个使用它的示例:

DefaultMockMvcBuilder mockMvcBuilder =
webAppContextSetup((WebApplicationContext) applicationContext);
MockMvc mockMvc = mockMvcBuilder.build();
MockHttpServletRequestBuilder getCustomer = get("/customer/{id}", 1234L)
.accept("text/html")
.param("lang", "en")
.secure(true);
mockMvc.perform(getCustomer).andDo(print());

结果匹配器

最后,结果匹配器是Spring MVC对结果的一种断言。 MockMvcResultMatchers类是返回以下任意一个的入口点:

  • ResultMatcher实例:

屏幕截图2015年2月27日的16.31.00

  • 或专用于提供不同类型ResultMatcher的对象 。 将它们视为提供返回紧密组合的匹配器的方法的类:

屏幕截图2015年2月16日在16.31.16

综上所述,针对Spring MVC控制器创建有用且强大的测试非常容易。 作为示例,让我们为Spring Clinic的PetController创建一个。 processCreationForm(Pet,BindingResult,SessionStatus)方法是一个很好的例子,因为它的结果不仅是纯Spring,而且还在数据库中插入了一行:这是非常重要的输出,因此也必须声明。

这导致以下测试:

import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.samples.petclinic.model.*;
import org.springframework.samples.petclinic.repository.*;
import org.springframework.test.context.*;
import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import o.s.test.web.servlet.request.MockHttpServletRequestBuilder;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
import org.testng.annotations.*;
import static o.s.test.web.servlet.request.MockMvcRequestBuilders.post;
import static o.s.test.web.servlet.result.MockMvcResultMatchers.*;
import static org.testng.Assert.assertEquals;
@WebAppConfiguration
@ContextHierarchy({
@ContextConfiguration("classpath:spring/business-config.xml"),
@ContextConfiguration("classpath:spring/mvc-core-config.xml")
})
@ActiveProfiles("jdbc")
public class PetControllerIT extends AbstractTestNGSpringContextTests {
@Autowired
private PetRepository petRepository;
@Autowired
private OwnerRepository ownerRepository;
private Owner george;
private PetType cat;
private Pet johnDoe;
@BeforeMethod // --- (A) ---
protected void setUp() {
george = new Owner();
george.setId(1);
cat = new PetType();
cat.setId(1);
johnDoe = new Pet();
johnDoe.setName("John Doe");
johnDoe.setBirthDate(new DateTime());
johnDoe.setType(cat);
george.addPet(johnDoe); // --- (A) ---
}
@Test
public void should_create_new_pet() throws Exception {
WebApplicationContext wac = (WebApplicationContext) applicationContext;
MockMvc mvc = MockMvcBuilders.webAppContextSetup(wac).build();
MockHttpServletRequestBuilder newPet =                          // --- (B) ---
post("/owners/{ownerId}/pets/new", george.getId())
.sessionAttr("pet", johnDoe);
mvc.perform(newPet).andExpect(redirectedUrl("/owners/" + george.getId()))
.andExpect(model().attributeExists("types"));               // --- (B) ---
Pet actualPet = petRepository.findById(14);                     // --- (C) ---
assertEquals(actualPet.getName(), johnDoe.getName());           // --- (D) ---
assertEquals(actualPet.getType().getId(), johnDoe.getType().getId());
assertEquals(actualPet.getOwner().getId(), johnDoe.getOwner().getId()); // --- (D) ---
}
}

A节

需要设置从控制器创建的Pet实体及其依赖对象,所有者和PetType。 请注意,所有者和类型只需要设置一个ID。 要设置正确的ID,只需浏览一下名为populateDB.sqlSQL脚本,并注意ID 1为“ cat”,所有者ID 1为“ george”。 尽管不是严格必需的,但这些值使测试更具可读性。

B区

使用本文中看到的方法创建一个新的帖子请求构建器,并将所需的URL和在设置中制作的宠物设置为会话属性。 断言的输出包括正确的重定向URL,并且模型包含宠物类型。

C线

该行使用自动装配的存储库加载Pet实例。 通过在populateDB.sql脚本中插入的宠物的ID的最大值加1来推断要找到的宠物的ID。

D区

Pet类不会覆盖equals(Object)方法,因此必须检查每个单独的字段。 全面的集成测试

本示例结束了本文的结尾,该文章展示了如何通过使用正确的粒度声明在控制器级别进行测试来使用Spring MVC提高代码的置信度。

如果您想走得更远,则有一本专门针对集成测试的书,叫做《 Trenches中的集成测试》 。 看看吧,有一个免费的示例章节供您评估内容!

翻译自: https://jaxenter.com/testing-spring-cleaning-114342.html

spring测试单元测试