Spring boot Mybatis-Plus banco de dados teste único em combate real (três maneiras)

  O teste de unidade tem sido um tópico quente, este artigo não discutirá ou precisará escrever um único teste, você pode ver o material de referência 1 , eu pessoalmente acho que uma única medida deve ser escrita para todo bom desenvolvedor as habilidades necessárias, escritas em uma única medição de Não vou discutir os benefícios aqui, mas rapidamente entrarei no tópico em que este artigo se concentra, como escrever um bom teste único de banco de dados.

  Por que você quer escrever um único teste de banco de dados? Acredito que você tenha uma experiência semelhante, depois de escrever instruções SQL complexas, levantou o teste com segurança, descobriu que uma grande parte dos bugs são devido a problemas com a instrução SQL, ou escreva menos A vírgula, ou falta o campo, lamento muito, nossa, porque não testar depois de escrever!

  Está certo! Isso vai te ensinar como escrever um único teste de banco de dados, permitindo que você diga adeus facilmente aos bugs relacionados ao banco de dados.

1. Amostra de banco de dados e ambiente

  Vamos começar este tutorial com a tabela do usuário como exemplo:
mesa do usuário

Figura 1.1 Diagrama ER da tabela do usuário

  Depois de introduzir o plug-in mybatis-plus, a classe do mapeador é a seguinte:

@Mapper
public interface UserMapper  extends BaseMapper<UserDO> {
    
    
}

  Ambiente geral:

  1. bota de mola: 1.5.18.RELEASE
  2. mybatis: 3.5.1
  3. mybatis plus: 3.4.0 (a versão mais recente no momento, usaremos os recursos da versão mais recente)

  Aqui, testamos diretamente alguns CRUDs fornecidos pelo mybatis plus. Claro, esses CRUDs geralmente não estão errados. Em projetos reais, só precisamos fazer o teste de unidade do SQL personalizado.

2. Método 1: Iniciar todo o ambiente

  Este método deve ser o mais comumente usado em ambientes diários . A anotação @SpringBootTest introduzida pelo SpringBoot desde a versão 1.4.0 pode iniciar todos os ambientes necessários para nosso teste de unidade. Claro, se você usar outros serviços distribuídos em seu projeto, ele também irá Esses serviços também serão iniciados. O código de teste único é o seguinte:

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserMapperTest {
    
    

    @Autowired
    private UserMapper userMapper;


    @Test
    public void testCurd() {
    
    
        UserDO userDO = new UserDO();
        userDO.setId(7777L);
        userDO.setGmtModified(new Date());
        userDO.setGmtCreate(new Date());
        userDO.setRealName("ke");
        userDO.setUserName("ni");
        userMapper.insert(userDO);

        UserDO select = userMapper.selectById(1);
        System.out.println(select);
    }
}

A anotação @SpringBootTest pode definir as classes que precisam ser iniciadas e carregadas sob demanda

3. Método 2: Inicie apenas o ambiente de banco de dados + banco de dados remoto

  Na referência 2, o iniciador de teste é apresentado na última versão de lançamento do mybatis-plus (3.4.0), conforme mostrado na figura:

Novos recursos do Mybatis-plus 3.4.0

Figura 3.1 Mybatis-plus 3.4.0 apresenta o módulo de teste

  O módulo apresenta uma nova anotação @MybatisPlusTest, esta anotação pode nos ajudar apenas a iniciar um módulo específico específico, diretamente no código de teste único:

@RunWith(SpringRunner.class)
@MybatisPlusTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
public class UserMapperTest {
    
    

    @Autowired
    private UserMapper userMapper;


    @Test
    public void testCurd() {
    
    
        UserDO userDO = new UserDO();
        userDO.setId(7777L);
        userDO.setGmtModified(new Date());
        userDO.setGmtCreate(new Date());
        userDO.setRealName("ke");
        userDO.setUserName("ni");
        userMapper.insert(userDO);

        UserDO select = userMapper.selectById(1);
        System.out.println(select);
    }
}

  É fácil? Mas devemos prestar atenção aos seguintes pontos-chave:

  • @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)A função é usar uma fonte de dados personalizada em vez de uma fonte de dados de memória incorporada configurada automaticamente
  • Se estiver usando um pool de conexão semelhante ao druid em seu projeto, você precisará usar a fonte de dados jdbc diretamente no arquivo de configuração do aplicativo no módulo de teste, porque a @MybatisPlusTestanotação não iniciará a estrutura do pool de conexão. O arquivo de configuração típico application.yml é o seguinte:
spring:
  datasource:
    url: jdbc:mysql://xxx.xxx.1.110:3306/test?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8
    username: root
    password: 123456

4. Método 3: Inicie apenas o ambiente de banco de dados + banco de dados local

  Com base no Método 2, proceda da seguinte forma:

  1. Removemos as @AutoConfigureTestDatabasanotações e iniciamos o banco de dados embutido de teste diretamente.Aqui escolhemos o banco de dados de memória H2, primeiro introduzimos a dependência de maven do banco de dados H2 no pom;
  2. Em seguida, introduza o arquivo sechema.sql no ambiente de teste, este arquivo é usado para inicializar o banco de dados, o núcleo é criar uma instrução de tabela;
  3. Finalmente, depois de remover esta página, o método de escrita é o mesmo que o método dois, então não vou dar aqui.

Nota: O arquivo sechema.sql deve estar de acordo com a sintaxe do banco de dados embutido. Neste caso, é o banco de dados h2. Se você estiver usando o banco de dados mysql, é necessário converter a sintaxe do banco de dados mysql para a sintaxe do banco de dados h2.

5. Princípio da anotação @MybatisPlusTest

  Se você já usou o MyBatis-Spring-Boot-Starter-Test @MybatisTest(Referência 3) antes, você descobrirá que o @MybatisPlusTestprincípio de anotação é semelhante a ele, todos os quais restringem a configuração automática do boot de mola (Referência 4), e só precisa carregar específico A configuração pode ser. Vamos dar uma olhada no código-fonte da anotação:

@Target({
    
    ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@BootstrapWith(MybatisPlusTestContextBootstrapper.class)
@ExtendWith({
    
    SpringExtension.class})
@OverrideAutoConfiguration(
    enabled = false
)
@TypeExcludeFilters({
    
    MybatisPlusTypeExcludeFilter.class})
@Transactional
@AutoConfigureCache
@AutoConfigureMybatisPlus
@AutoConfigureTestDatabase
@ImportAutoConfiguration
public @interface MybatisPlusTest {
    
    
    String[] properties() default {
    
    };

    boolean useDefaultFilters() default true;

    Filter[] includeFilters() default {
    
    };

    Filter[] excludeFilters() default {
    
    };

    @AliasFor(
        annotation = ImportAutoConfiguration.class,
        attribute = "exclude"
    )
    Class<?>[] excludeAutoConfiguration() default {
    
    };
}
  • @OverrideAutoConfiguration(enabled = false)É a chave, ela desliga a configuração automática e, geralmente, no projeto de inicialização de primavera, a ativação está ligada;
  • @AutoConfigureMybatisPlusAnotação é uma anotação personalizada. Esta anotação define todas as classes de carregamento necessárias a serem carregadas. As classes a serem configuradas automaticamente são declaradas em spring.factories:
# AutoConfigureMybatis auto-configuration imports
com.baomidou.mybatisplus.test.autoconfigure.AutoConfigureMybatisPlus=\
org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,\
org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration,\
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration,\
com.baomidou.mybatisplus.autoconfigure.MybatisPlusLanguageDriverAutoConfiguration,\
com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration

  • @AutoConfigureTestDatabaseA anotação indica que o banco de dados na memória é usado em vez do banco de dados real

  Com essas restrições e regulamentações, mybatis-plus pode carregar automaticamente a configuração necessária no ambiente de teste, o que elimina o carregamento de recursos desnecessários.

6. Resumo

Resumo de teste único de três bancos de dados

Figura 6.1 Resumo de teste único de três bancos de dados

  Se você estiver usando o banco de dados mysql, recomendo o segundo método. Se você puder resolver o problema de converter a gramática mysq em h2, é recomendado usar o método três, de forma que você possa realizar um único teste mesmo em situações offline sem conectar-se a um banco de dados remoto.

PS: Se você tem uma boa ferramenta para completar a conversão do mysql h2, você pode recomendá-la na área de comentários. Há muito tempo que procuro aqui, incluindo conversão de escrita personalizada, algumas ferramentas profissionais, etc., sinto que a conversão das frases exportadas pelo Navicat não é muito Funciona bem.

7. Materiais de referência

[1] Você realmente precisa de teste de unidade?
[2] Versão de lançamento do Mybatis-Plus
[3] MyBatis-Spring-Boot-Starter-Test
[4] Configuração automática dos quatro artefatos do SpringBoot

Acho que você gosta

Origin blog.csdn.net/u012397189/article/details/109288747
Recomendado
Clasificación