美文网首页
Spring中测试如何写

Spring中测试如何写

作者: Huld多 | 来源:发表于2018-09-10 16:58 被阅读0次

最近在实践测试,经常遇到一个问题,就是测试怎么写,测试粒度是怎么样的?所以狂补了一下测试相关的知识。

测试金字塔

测试金字塔将测试进行了分层,越底层的测试,实现成本越低,测试效率更高,可维护性越高,但是业务需求的反映越低


测试金字塔

如图,测试被分成了三层,从下到上分成:Unit层,UI层和Service层。

  • Unit层则是我们常说的单元测试。
  • Service层又可以细分,如(集成测试,功能测试,系统测试,契约测试,端到端测试)。
  • UI层则是用户界面测试。

单元测试

单元测试处于金字塔最底部,这类测试的特点是:

  • 只测试单独的class
  • 只需要有应用的源码,而不需要跑服务实例
  • 够快
  • 不依赖于外部系统(web service,database)且不需要很多/基本没有I/O操作(不用建立数据库)

在Spring boot中主要有三种测试方法

  • Controller测试 - 使用mockMvc
@RunWith(SpringRunner.class)
@WebMvcTest(TaskController.class)
public class TaskControllerTest { 
    @Autowired 
    private MockMvc mockMvc; 
    @MockBean 
    private TaskService taskService; 
    @Test 
    public void should_get_all_tasks_by_getAllTask() throws Exception { 
      given(taskService.getTasks())
        .willReturn(Lists.newArrayList(createTask("test"), createTask("aaa"))); 
       mockMvc.perform(MockMvcRequestBuilders.get("/tasks")) 
        .andExpect(status().isOk())
        .andExpect(jsonPath("$[0].name").value("test")) 
        .andExpect(jsonPath("$[1].name").value("aaa")); 
     } 
    public Task createTask(String name) { 
      Task task = new Task(); 
      task.setName(name); return task; 
    }
 }
  • Service测试 - 使用Mockito
@RunWith(MockitoJUnitRunner.class)
public class TaskServiceTest {
  @InjectMocks
  private TaskService taskService;
  @Mock
  private TaskRepository taskRepository;
  @Test
  public void should_return_all_tasks_when_getAllTasks() {
    given(taskRepository.findAll())
      .willReturn(Lists.newArrayList(createTask("test"), createTask("aaa")));
    List<Task> tasks = taskService.getTasks();

    assertThat(tasks.size(), is(2));
    assertThat(tasks.get(0).getName(), is("test"));
    assertThat(tasks.get(1).getName(), is("aaa"));
  }

  public Task createTask(String name) {
    Task task = new Task();
    task.setName(name);
    return task;
  }
}

repository 测试 - 使用DataJpaTest

@RunWith(SpringRunner.class)
@DataJpaTest
@AutoConfigureTestDatabase(replace = NONE)
public class TaskRepositoryTest {
  @Autowired
    private TaskRepository taskRepository;

  @Autowired
  private TestEntityManager entityManager;

  @Test
  public void get_all_will_return_all_tasks() {
    List<Task> tasks = taskRepository.findAll();
    assertThat(tasks.size(), is(2));
    assertThat(tasks.get(0).getName(), is("test"));
    assertThat(tasks.get(1).getName(), is("aaa"));
  }
}

基于H2,flywayTest annotation测试的写法。
@FlywayTest可以放在3个地方

  • class上面:单个class 会跑flywayclean 和flywaymigrate
  • setup方法上面:每个测试都会跑flywayclean 和flywaymigrate
  • 单个测试方法上面:单个测试会跑flywayclean 和flywaymigrate
@SpringBootTest(classes = {Application.class}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@Slf4j
@RunWith(SpringRunner.class)
@TestExecutionListeners({
        DependencyInjectionTestExecutionListener.class,
        TransactionalTestExecutionListener.class,
        FlywayTestExecutionListener.class
})
class FlywayMethodTest {

    @Autowired
    private UserRepository repository;

    @Test
    @FlywayTest
    void contextLoads() {
        assertThat(repository.findAll().size(), is(3));
    }
}

相关文章

  • Spring中测试如何写

    最近在实践测试,经常遇到一个问题,就是测试怎么写,测试粒度是怎么样的?所以狂补了一下测试相关的知识。 测试金字塔 ...

  • Spring Boot应用的健康监控

    在之前的系列文章中我们学习了如何进行Spring Boot应用的功能开发,以及如何写单元测试、集成测试等,然而,在...

  • Spring Boot测试

    Spring Boot测试 Spring 提供的了一个test框架,用于系统的集成测试。在Spring Boot中...

  • Spring Boot 系列(二)单元测试&网络请求

    实际开发中,Junit单元测试是必不可少的。在spring-boot 中可以通过测试模块(spring-boot-...

  • Spring Boot中的测试

    Spring Boot中的测试 简介 本篇文章我们将会探讨一下怎么在SpringBoot使用测试,Spring B...

  • 如何写一篇付费文章

    测试如何写一篇测试文章

  • Spring Cloud Feign demo

    Spring Cloud Feign 测试demo 测试使用的是之前测试Spring Cloud Eureka服务...

  • spring boot进行Test测试

    spring boot中集成了junit测试,无需自行安装junit。 在pom.xml中添加spring中的ju...

  • Spring Test 和 JUnit的结合

    使用Spring做单元测试的不足 例如,很多人做单元测试的时候,还要在Before方法中,初始化Spring容器,...

  • Spring中的测试

    我们先从最基础的spring项目说起1.首先是依赖 2.测试类 @RunWith :是Junit的注解,它会提供一...

网友评论

      本文标题:Spring中测试如何写

      本文链接:https://www.haomeiwen.com/subject/ognsgftx.html