Se você deseja ser muito conveniente para testar as APIs e integrá -lo ao IC para verificar cada commit, então a inicialização da Spring Boot é definitivamente a melhor escolha.
Escreva um caso de teste rapidamente
@Runwith (springrunner.class) @springboottest (webenvironment = springboottest.webenvironment.random_port) @activeProfiles ({perfis.env_it}) classe public class DEMointEgTest {@Autowired Private FOOSVICE POOOSVICE FOOSO; @Test public void test () {System.out.println ("testado"); }}Entre eles, o SpringBootts define algumas configurações ao executá -las. O código acima usa portas aleatórias e, é claro, também pode predefinido portas, como esta
@Springboottest (webenvironment = springboottest.webenvironment.defined_port, Propriedades = {"server.port = 9990"})Os perfis ativos forçam o uso do perfil de TI. De uma prática recomendada, os endereços de bancos de dados ou outros componentes de recursos configurados pelo perfil de TI devem ser isolados do ambiente de desenvolvimento ou estadiamento. Porque quando um TI percorre muitas situações, precisamos limpar os dados do teste.
Você pode descobrir que esse caso pode ser injetado com o Sowired em qualquer serviço desejado. Isso ocorre porque a mola carrega todo o contexto, o mesmo que o ambiente de corrida real, incluindo banco de dados, cache e outros componentes. Se você acha que não precisa de todos os recursos durante o teste, poderá excluir a configuração correspondente no perfil. Este é um ambiente operacional completo, a única diferença é que ele será desligado automaticamente após a conclusão do caso de uso.
Teste uma API REST
Recomendo uma biblioteca para adicionar ao gradle
TestCompile 'io.rest-sulei: segura de descanso: 3.0.3'
Apoie o JSONPATH, que é muito útil. Clique aqui para documentos específicos
@Sql (scripts = "/testdata/users.sql")@testpublic void test001Login () {string userName =" [email protected] "; String senha = "Demo"; JwtauthenticationRequest request = novo jwtauthenticationRequest (nome de usuário, senha); Resposta resposta = dado (). ContentType (contentType.json) .body (request) .When (). Post ("/auth/login"). Então () .statuscode (httpstatus.ok.value ()) .extract () .Response (); assertThat (Response.Path ("token"), é (isnull.notNullValue ())); assertThat (Response.Path ("Expiration"), é (isnull.notNullValue ()));} @SQL é usado para executar dados de teste de inserção do SQL antes do teste. Observe que given().body() Obviamente, você também pode colocar o JSON convertido no corpo, o efeito é o mesmo.
O resultado do retorno é capturado por uma resposta e, em seguida, os dados podem ser obtidos usando o JSONPATH para verificação. É claro que existe outra maneira mais intuitiva, que pode obter a resposta completa através da resposta.ASSTRING () e, em seguida, a deseralizá -la em um objeto Java para verificação.
Neste ponto, o mais básico é concluído. A adição de um teste de graduação a Jenkins pode obter testes sempre que o código for enviado.
Algumas situações complicadas
Dados mistos
Este é o mais fácil de acontecer. Um projeto possui muitos desenvolvedores, e cada desenvolvedor escreverá seu próprio caso de TI, e se houver um impacto entre os dados. É fácil de entender. Por exemplo, em um cenário em que um lote de teste escreve, o método de verificação final é verificar se a quantidade de dados escritos é de 10.000 linhas. Outro desenvolvedor escreveu outros casos e adicionou novos dados a esta tabela, que se transformou em linhas 10W+1, para que o caso escrito em lotes não pudesse escapar.
Para evitar essa situação, usamos cada classe de teste para limpar os dados. Como é uma operação baseada em classe, você pode escrever uma classe base para resolvê-la.
@Runwith (springrunner.class) @springboottest (webenvironment = springboottest.webenvironment.random_port) @activeProfiles ({perfis.env_it}) classe public class BaseIntegrationTest {private static jdbctemplate JdbcTemplate; @AUTOWIRED Public void setDataSource (DataSource DataSource) {JDBCTemplate = new JDBCTemplate (DataSource); } @Value ("$ {local.server.port}") protegida int porta; @EBE Antes de public void SetupeNv () {RESTASSURED.PORT = PORT; RESTASSURED.BASEPATH = "/API"; RESTASSURED.BASEURI = "http: // localhost"; RESTASSURED.CONFIG = RESTASSURED.CONFIG (). } public void telTownenv () {dited (). ContentType (contentType.json) .When (). post ("/auth/logout"); } @Afterclass public static void cleanDB () lança sqlexception {Resource Resource = new ClassPathResource ("/testData/cleanDb.sql"); Conexão de conexão = jdbcTemplate.getDataSource (). GetConnection (); ScriptUtils.executesqlscript (conexão, recurso); conexão.Close (); }}O @afterclass usa o JDBCTemplate para executar um CleanDB.SQL, que limpa todos os dados de teste dessa maneira.
@ Value("${local.server.port}") também precisa ser mencionado, porque a porta é aleatória, segura de descanso não sabe para qual porta a solicitação é enviada. Aqui, use @value para obter o número da porta atual e defina -o como restringido.port para resolver esse problema.
Como processar dados compartilhados
Executando um completo, pode exigir dezenas de classes e centenas de métodos. Então, e se alguns dados forem necessários para todos os casos e precisarem ser limpos apenas depois que todos os casos foram executados? Em outras palavras, esse tipo de limpeza de dados não se baseia na aula, mas em uma execução de uma só vez. Por exemplo, dados iniciais do usuário, biblioteca da cidade, etc.
Tocamos um truque inteligente e usamos a mosca
@Configuration@condicionalOnClass ({DataSource.class}) public class UpgradeAtoconfiguration {public static final String Flyway = "Flyway"; @Bean (Name = Flyway) @Profile ({Env_it}) public UpgradeService CleanAndUpGradService (DataSource DataSource) {UpgradeService UpgradeService = new FlywayUpgradeService (DataSource); tente {upgradeService.cleanandupgrade (); } catch (Exceção ex) {Logger.error ("Flyway falhou!", Ex); } retornar upgradeService; }} Você pode ver que, quando o perfil é, a Flyway soltará todas as tabelas e executará o script de atualização, criando assim uma tabela de dados completa, que obviamente está vazia. No caminho de teste do projeto, adicione uma versão enorme do SQL, para que o Flyway possa inserir dados de teste comuns no final, como src/test/resources/db/migration/V999.0.1__Insert_Users.sql , resolva perfeitamente vários problemas de dados.
resumo
O uso do serviço de teste interno no Spring Boot pode verificar rapidamente a API. Não preciso iniciar o serviço e clicar na página manual para testar minha API. Eu me comunico diretamente com meus colegas de front-end, o formato de solicitação e escrevo um caso para verificar.
Obviamente, há também uma desvantagem desse método, que é inconveniente testar o sistema. Anteriormente, os casos de teste da API da empresa foram escritos pelo JMeter, que seria muito mais conveniente ao fazer testes de desempenho.