O teste de unidade é usado para testar componentes de código individuais e garantir que o código funcione conforme o esperado. Os testes de unidade são escritos e executados por desenvolvedores. Na maioria dos casos, estruturas de teste como JUnit ou TestNG são usadas. Os casos de teste geralmente são escritos no nível do método e executados por meio de automação.
Spring Boot fornece algumas anotações e ferramentas para ajudar os desenvolvedores a testar seus aplicativos.
Antes de falar sobre o teste de unidade springboot, vamos apresentar brevemente os tipos de teste de software (de uma perspectiva de desenvolvimento) e como escrever um teste de unidade.
Navegação neste artigo
Tipo de teste de software
- Teste de unidade: usado para testar componentes de código individuais e garantir que o código funcione conforme o esperado. Os testes de unidade são escritos e executados por desenvolvedores.
- Teste de integração: Verifique se todo o sistema está funcionando corretamente. O teste de integração também é feito por desenvolvedores, mas em vez de testar componentes individuais, o objetivo é testar os componentes. O sistema consiste em muitos componentes individuais, como código, banco de dados, servidor web, etc. O teste de integração pode encontrar problemas como conexão de componentes, acesso à rede e problemas de banco de dados.
- Teste funcional: Verifique se cada recurso está implementado corretamente, comparando o resultado da entrada fornecida com a especificação. Esse estágio geralmente é realizado pela equipe de testes dedicada da empresa.
- Teste de aceitação: O teste de aceitação visa garantir que o software está pronto, de acordo com o contrato do projeto, a declaração de atribuição e o documento de aceitação acordado por ambas as partes, para mostrar ao comprador do software os requisitos originais do software.
Pontos de teste de unidade
- A granularidade do teste está no nível do método.
- O resultado do caso de teste deve ser estável.
- O caso de teste deve escrever o mínimo de lógica possível ou não escrever a lógica de teste.
- Os casos de teste devem ter uma alta taxa de cobertura, cobrindo entradas e saídas básicas, e alguns limites também devem ser cobertos.
- Use asserções em vez de emitir declarações impressas.
- O caso de teste de unidade deve ter um bom nome, como test_MethodName ()
Teste de unidade de integração SpringBoot
Introduzir dependências
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
Dependência
- JUnit - O padrão de fato para aplicativos Java de teste de unidade.
- Spring Test e Spring Boot Test - Utilitários e suporte de teste de integração para aplicativos Spring Boot.
- AssertJ - Uma biblioteca de asserções fluente.
- Hamcrest - uma biblioteca de objetos correspondentes (também conhecidos como restrições ou predicados).
- Mockito - Uma estrutura de simulação Java.
- JsonPath - XPath para JSON
Descrição de anotação comum
- @RunWith (SpringRunner.class)
JUnit é executado usando o suporte de teste do Spring. SpringRunner é o novo nome de SpringJUnit4ClassRunner. O objetivo de fazer isso é apenas para tornar o nome mais simples. - @SpringBootTest é
usado para teste de aplicativos Spring Boot. Por padrão, ele pesquisará nível por nível de acordo com o nome do pacote. Ele sempre encontra o programa principal Spring Boot. Ele determina se o programa principal é o programa principal, se a anotação de classe contém @SpringBootApplication e inicia a classe durante o teste. Crie um ambiente de contexto Spring. - @BeforeClass
é executado apenas uma vez para todos os testes e deve ser estático nulo - Método de
inicialização @BeforeEach , executado antes de cada método de teste da classe de teste atual ser executado
Método de teste @Test , onde você pode testar a exceção esperada e o tempo limite- @AfterEach
libera recursos e executa cada método de teste da classe de teste atual - @AfterClass
é executado apenas uma vez para todos os testes e deve ser estático nulo
Métodos de teste ignorados por @Ignore
Asserção de uso comum
- assertNotNull ("mensagem", A) // O juiz A não está vazio
- assertFalse ("mensagem", A) // A condição de julgamento A não é verdadeira
- assertTure ("mensagem", A) // Julgando a condição A é verdadeira
- assertEquals (“mensagem”, A, B) // 判断 A.equals (B)
- assertSame (“mensagem”, A, B) // 判断 A == B
método de teste
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserRepositoryTest {
@Autowired
UserRepository userRepository;
@Test
@Ignore
public void testFindAll(){
Page<UserDO> userDOS= userRepository.findAll(PageRequest.of(1,10));
Assert.assertNotNull(userDOS.getContent());
}
@Test(expected = RuntimeException.class)
public void testNullPointerException(){
throw new RuntimeException();
}
}
Interface API de teste
- MockMvcRequestBuilders
constrói o caminho da solicitação, os parâmetros da solicitação e outras informações - andExpect
adiciona uma afirmação para determinar se o resultado atende às expectativas - andDo
adiciona um processador de resultado, como a impressão no exemplo - andReturn
retorna o MvcResult após a verificação bem-sucedida, que é usado para verificação personalizada / processamento assíncrono da próxima etapa.
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
class UserControllerTest {
@Autowired
MockMvc mockMvc;
UserDO userDO;
MultiValueMap<String,String> params;
@BeforeEach
public void setUp()throws Exception{
userDO=new UserDO();
userDO.setPasswd("123456");
params=new LinkedMultiValueMap<>();
params.add("name","codehome");
}
//测试get接口
@Test
public void queryUser() throws Exception {
String result= mockMvc.perform(MockMvcRequestBuilders.get("/user/query")
.contentType(MediaType.APPLICATION_FORM_URLENCODED)
.params(params)
).andExpect(MockMvcResultMatchers.status().is2xxSuccessful())
.andDo(MockMvcResultHandlers.print())
.andReturn().getResponse()
.getContentAsString();
Assert.assertEquals("调用成功","codehome",result);
}
//测试post接口
@Test
void addUser() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.post("/user/add")
.contentType(MediaType.APPLICATION_JSON)
.content(JsonUtil.toJson(userDO))
.accept(MediaType.APPLICATION_JSON)
).andExpect(MockMvcResultMatchers.status().is2xxSuccessful())
.andDo(MockMvcResultHandlers.print())
.andExpect(MockMvcResultMatchers.jsonPath("$.data.passwd").value("123456"));
}
//测试cookie
@Test
void testCookie()throws Exception{
String token= mockMvc.perform(MockMvcRequestBuilders.get("/user/cookie")
.cookie(new Cookie("token","123456")))
.andDo(MockMvcResultHandlers.print())
.andReturn().getResponse()
.getContentAsString();
Assert.assertEquals("token从cookie中获取成功","123456",token);
}
}
//测试的接口类
@RestController
@RequestMapping("/user")
public class UserController {
@GetMapping("/query")
public String queryUser(String name){
return name;
}
@PostMapping("/add")
public R addUser(@RequestBody UserDO userDO){
return R.ok(userDO);
}
@GetMapping("/cookie")
public String testCookie(@CookieValue("token") String token){
return token;
}
}
Mil milhas começam com um único passo. Este é o sétimo artigo da série de tutoriais do SpringBoot. Todos os códigos-fonte do projeto podem ser baixados no meu GitHub . **