1
resposta

duvida sobre testes

no caso eu tenho uma aplicacao que nao utilizei flyway, como posso usar os dados que tem no banco da aplicacao para realizar os testes? ao criar o application-test.properties ele criou todas as tabelas, mas nao carregou os dados.

application.properties

spring.application.name=system

spring.datasource.url=jdbc:postgresql://localhost:5432/patrimony
spring.datasource.username=postgres
spring.datasource.password=root
spring.jpa.hibernate.ddl-auto=update

api_token_secret = ${JWT_SECRET:auth_secret}

application-test.properties

spring.datasource.url=jdbc:postgresql://localhost:5432/patrimony-test
spring.datasource.username=postgres
spring.datasource.password=root

spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

os dois bancos (patrimony e patrimony-test) tem as mesmas tabelas, porem a tabela test nao tem nenhum dado, ou seja, carregou as tabelas mas nao os dados de cada uma. por que isso acontece? para carregar os dados das tabelas deveria ser usado flyway?

1 resposta

Olá Vinícius,

Entendi sua dúvida sobre como carregar os dados do banco de dados da aplicação para os testes, especialmente sem o uso do Flyway. O problema ocorre porque, ao criar um banco de dados de teste, as tabelas são criadas, mas os dados não são carregados automaticamente.

Para resolver isso, você pode usar algumas abordagens:

  1. Carregar Dados Manualmente nos Testes: Você pode inserir os dados necessários diretamente nos métodos de teste usando o TestEntityManager ou os repositórios. Isso garante que cada teste tenha os dados específicos que precisa.

    Exemplo:

    @Autowired
    private TestEntityManager em;
    
    @Test
    @DisplayName("Deveria devolver null quando unico medico cadastrado nao esta disponivel na data")
    void escolherMedicoAleatorioLivreNaDataCenario1() {
        var proximaSegundaAs10 = LocalDate.now()
                        .with(TemporalAdjusters.next(DayOfWeek.MONDAY))
                        .atTime(10, 0);
        
        var medico = cadastrarMedico("Medico", "medico@voll.med", "123456", Especialidade.CARDIOLOGIA);
        var paciente = cadastrarPaciente("Paciente", "paciente@email.com", "00000000000");
        cadastrarConsulta(medico, paciente, proximaSegundaAs10);
    
        var medicoLivre = medicoRepository.escolherMedicoAleatorioLivreNaData(Especialidade.CARDIOLOGIA, proximaSegundaAs10);
        assertThat(medicoLivre).isNull();
    }
    
    private Medico cadastrarMedico(String nome, String email, String crm, Especialidade especialidade) {
        var medico = new Medico(dadosMedico(nome, email, crm, especialidade));
        em.persist(medico);
        return medico;
    }
    
    private Paciente cadastrarPaciente(String nome, String email, String cpf) {
        var paciente = new Paciente(dadosPaciente(nome, email, cpf));
        em.persist(paciente);
        return paciente;
    }
    
    private void cadastrarConsulta(Medico medico, Paciente paciente, LocalDateTime data) {
        em.persist(new Consulta(null, medico, paciente, data));
    }
    
    private DadosCadastroMedico dadosMedico(String nome, String email, String crm, Especialidade especialidade) {
        return new DadosCadastroMedico(
                nome, email, "61999999999", crm, especialidade, dadosEndereco()
        );
    }
    
    private DadosCadastroPaciente dadosPaciente(String nome, String email, String cpf) {
        return new DadosCadastroPaciente(
                nome, email, "61999999999", cpf, dadosEndereco()
        );
    }
    
    private DadosEndereco dadosEndereco() {
        return new DadosEndereco(
                "rua xpto", "bairro", "00000000", "Brasilia", "DF", null, null
        );
    }
    
  2. Usar Scripts SQL no application-test.properties: Você pode adicionar um arquivo SQL com os dados iniciais e configurá-lo no application-test.properties para ser executado ao iniciar os testes.

    Crie um arquivo data.sql em src/test/resources com os dados que deseja inserir:

    INSERT INTO medico (id, nome, email, crm, especialidade) VALUES (1, 'Medico', 'medico@voll.med', '123456', 'CARDIOLOGIA');
    INSERT INTO paciente (id, nome, email, cpf) VALUES (1, 'Paciente', 'paciente@email.com', '00000000000');
    INSERT INTO consulta (id, medico_id, paciente_id, data) VALUES (1, 1, 1, '2023-10-09 10:00:00');
    

    E configure no application-test.properties:

    spring.datasource.data=classpath:data.sql
    
  3. Usar Flyway ou Liquibase: Embora você tenha mencionado que não usou Flyway, é uma boa prática usar ferramentas de migração de banco de dados como Flyway ou Liquibase para gerenciar a estrutura e os dados do banco de dados. Isso facilita a manutenção e a consistência entre os ambientes de desenvolvimento, teste e produção.

Espero ter ajudado e bons estudos!