彩票走势图

开始喜欢用Java单元测试助手进行Spring测试

原创|使用教程|编辑:郑恭琳|2021-01-21 17:12:36.523|阅读 200 次

概述:Spring是领先的企业Java应用程序框架,因此需要进行适当级别的测试以确保使用其构建的应用程序的质量和安全性。

# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>

相关链接:

Spring是领先的企业Java应用程序框架,因此需要进行适当级别的测试以确保使用其构建的应用程序的质量和安全性。

Spring框架(以及Spring Boot)是最受欢迎的Java企业软件框架之一。它在关键任务应用程序中的使用意味着它已经受到质量和安全性的审查。

之前,我们讨论了尽管开发人员拥有良好的改进记录,但开发人员如何不喜欢单元测试,并详细介绍了Parasoft Jtest的单元测试助手如何提供一种指导性的自动化测试方法,以使测试不仅更加可口,而且更容易更有效。在本文中,我将继续与Spring框架相同的主题,向您展示如何在这个重要的应用程序框架中利用自动化和指导性测试。


测试Spring应用程序的挑战

Spring框架对集成测试提供了很好的支持,但是需要大量的手动编码才能正确设置测试用例。为Spring应用程序构建和维护测试为开发人员带来了一系列独特的挑战,其中包括:

  • Spring框架必须初始化和配置

  • 该应用程序通常具有第三方库依赖项(永久存储,外部服务等)

  • 应用程序通常使用内置的Spring功能来进行会话,安全性,消息传递等。对于刚开始使用Spring测试的开发人员来说,设置这些功能可能很棘手。

  • 需要适当配置应用程序依赖项(即Bean

这些挑战,加上编写全面且可维护的测试套件通常要花费大量时间这一事实,导致开发人员编写的测试不足,从而导致安全漏洞、缺陷、退化和许多麻烦。

Parasoft Jtest单元测试助手可以使生成,改进和维护JUnit测试的过程变得更加轻松和省时,从而为开发人员提供帮助,从而使开发人员可以快速构建良好的测试,并返回他们想的东西–编写代码。


Spring MVC测试框架

Spring框架包括一个测试框架,该框架使测试控制器服务和其他组件更加容易。它包括用于配置Spring测试容器,调用Controller处理程序方法以及使用自定义断言验证行为的功能。

Spring MVC控制器示例:

@Controller

public class TodoController {     @Autowired

    private TodoService service;

    @GetMapping("/")    public String findAll(Model model) {

        List<Todo> todos = service.findAll();

        model.addAttribute("todos", todos);

        return "todo/list";

    }

}

该示例控制器实现了一个简单的REST服务,以从“待办事项”列表中获取项目。它取决于包含业务逻辑的TodoService

要测试findAll方法,我们需要一个JUnit测试,该测试执行以下操作:

  • 使用受测控制器和TodoService依赖的TodoService配置Spring容器。

  • 将有效请求发送到findAll处理程序方法。

  • 验证响应的元素,包括返回值(todo/list”)和Model属性“todos”。

Spring MVC Junit测试示例可能如下所示:

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration

public class TodoControllerTest {

    @Autowired

    TodoController controller;

 

    @Autowired

    TodoService todoService;

 

    MockMvc mockMvc;

 

    @Before

    public void setup() {

        mockMvc = MockMvcBuilders.standaloneSetup(controller).build();

    }

 

    @Configuration

    static class Config {

        @Bean

        public TodoController getTodoController() {

            return new TodoController();

        }

 

        @Bean

        public TodoService getTodoService() {

            return new TodoService();

        }

    }

 

    @Test

    public void testFindAll() throws Exception {

        mockMvc.perform(get("/")).andExpect(view().name("todo/list"));

    }

}

上面的示例是一个非常简单的测试-但是仍然有很多“样板”代码需要编写,并且还有很多工作要做。在此示例中,我们使用内部Configuration类为Spring配置了控制器及其服务。然后,我们使用MockMvc函数将请求发送到处理程序方法(使用Perform),并使用andExpect验证返回的视图名称。

上述测试有什么问题?没什么-想象一个更复杂的控制器方法,它具有多个处理程序方法,这些方法接受更多的参数并产生更多的输出。编写测试将花费更多时间,尤其是在良好的测试覆盖范围很重要的情况下。此外,大多数实际测试都需要更多的配置(XML或类配置、会话和环境、安全性等)。


使用Parasoft Jtest生成Spring测试

Parasoft Jtest的单元测试助手可帮助开发人员以多种方式编写Spring测试:

  • 快速自动生成样板代码以进行Spring MVC测试

  • 自动生成参数化测试以增加测试范围

  • 模拟依赖关系以隔离辅助方法并简化测试

  • 在运行时收集覆盖率数据并分析测试流程

  • 提供快速修复建议以改善测试

自动生成测试

Parasoft Jtest中生成Spring测试非常简单–只需在IDE中为控制器选择一个Spring处理程序方法,然后选择一个test-creation操作:


选择常规Spring或参数化Spring会自动为您生成样板Spring MVC测试,包括Configuration类(以及控制器依赖的所有Bean)。还添加了mockMvc.perform调用,并且将其预先配置为调用为其创建测试的处理程序方法。Jtest单元测试助手甚至添加了一些示例断言,您可以取消注释和配置它们。

通过在首选项中设置Spring测试的ContextConfiguration属性”选项,Parasoft Jtest支持使用XML或类配置生成测试。

模拟依赖

管理单元测试中的依赖关系至关重要,因为很多复杂性和工作都来自隔离测试中的单元。默认情况下,Jtest单元测试助手使用MockitoPowerMockito来模拟依赖关系(如果您不想这样做,可以在首选项中将其禁用)。模拟依赖关系允许测试控制那些依赖关系,将处理程序方法与应用程序的其余部分隔离开来,从而将测试工作集中在处理程序上。在我们的示例处理程序中,findAll方法是在TodoService上调用的-如果我们使用真实的TodoService,我们将有效地测试TodoControllerTodoService。这可能是我们想要进行集成测试而不是单元测试所需要的。在测试中模拟TodoService.findAll的响应,使我们可以将测试工作重点放在处理程序方法上。

(如果您想了解有关Spring测试中的模拟依赖项的更多信息,请阅读我的下一篇文章。)

由于Spring BootBean提供简化的配置以及测试的附加注释,因此,单元测试助手在检测到项目中的Spring Boot时会生成稍有不同的测试。例如,MockMvc是自动装配的,依赖项使用@MockBean进行了模拟,并使用了@SpringBootTest批注。


运行测试并分析结果

您可以使用任何普通的JUnit运行器运行生成的测试。Parasoft Jtest提供了运行JUnit并分析测试的工具栏操作。


运行测试后,将显示测试执行流程,并由单元测试助手提出改进测试的建议,并在您的IDE中进行报告:



提供处理程序方法输入

处理程序方法通常被配置为接受路径,查询或其他参数作为该方法的参数。若要测试MVC处理程序方法,可以使用MockMvc来构建路径/查询以及调用该方法所需的任何其他参数。

Jtest单元测试助手会自动配置mockMvc.perform调用以调用处理程序方法。个别参数在测试中显示为局部变量(或参数化测试中的参数),需要对其进行配置以使测试正常运行。

例如(请参阅下面的单元测试助手,缩写为UTA):

@Test public void testGetPerson() throws Throwable {     // When     String id = ""; // UTA: Configure an appropriate parameter value since the tested method depends on it     ResultActions actions = mockMvc.perform(get("/people/" + id));

在这里,需要配置id”字符串–如果未配置,则使用的路径将是“/people/”,并且Spring不会将提供的路径与适当的处理程序方法进行匹配。

class=p1>单元测试助手会查找各种类型的处理程序方法参数,并通过以下方式自动为它们准备测试:

  • HttpSession(添加示例setAttribute()调用)

  • 标头(添加header()调用),

  • 请求主体(添加有效负载变量和content()调用)

  • 身份验证(将示例实例化添加到setup方法,并调用principal()

运行不会导致调用处理程序方法的测试,会产生如下建议:


验证处理程序方法输出

根据处理程序方法应提供给调用者的方式,它可能返回各种类型。在大多数情况下,处理程序方法返回ModelAndView(或类似的对象,如ModelRedirectView)以服务于页面,或返回某种ResponseEntity(有时只是要序列化的原始对象)。Spring MVC Test框架可以访问此响应以进行验证。

例如,Jtest单元测试助手为返回ModelAndView的处理程序方法添加了以下断言:

  // When

  String id = "1";

  ResultActions actions = mockMvc.perform(get("/people/" + id));

 

  // Then

  // actions.andExpect(status().isOk());

  // actions.andExpect(header().string("", ""));

  // actions.andExpect(view().name(""));

  // actions.andExpect(model().attribute("", ""));

生成测试后,您可以取消注释这些断言并填充值以快速构建有用且有价值的测试。如果断言在运行时失败,则单元测试助手会提供建议和快速修复,以自动更新期望值或简单地删除断言。要使用适当的值快速设置断言,您可以取消注释断言,使其失败,然后使用快速修复程序设置正确的期望值。


结论

Spring(与Spring Boot结合使用)是领先的企业Java应用程序框架,因此需要进行适当级别的测试,以确保使用其构建的应用程序的质量和安全性。但不幸的是,目前尚无法达到此级别的测试,这主要是由于时间不足以及所需的手动编码和维护量。Parasoft Jtest单元测试助手不仅提供单元测试自动化,还提供指导性的测试创建和依赖管理,以加速测试创建并减少维护。

要了解更多信息,请阅读单元测试助手如何通过模拟框架帮助进行依赖项管理。



标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn


为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP