Pergunta

Sou novo em testes e dbunit automatizados. Então, eu apreciaria seu conselho.

Vou criar uma suíte de teste, que será executada da seguinte maneira:

  • Crie um banco de dados H2 na memória
  • Execute scripts DDL para criar tabelas
  • Execute dbunit para inserir dados iniciais (vamos chamá -los State0) Isso será usado por todos os testes.
  • executar testes

Até lá parece bom para mim, mas o que não entendo, é como faço para reverter o banco de dados para o State0 Após uma execução de teste e alterou os dados?

Posso fazer isso com dbunit?
Ou com outra coisa?
Devo recriar o banco de dados antes de cada teste?

Simples, não cometer transações nos testes não é apropriado para mim, porque os testes acabarão sendo executados mais de uma transação sobre o que pode ser mais de uma conexão de banco de dados.

Foi útil?

Solução

Dbunit pode fazer o trabalho quatro que você automaticamente @BeforeClass, @Before e @After métodos corretamente. Por exemplo, em nosso projeto, usando o derby, um desses casos de teste parece

public class MyTest {
    protected static IDataSet getDataSet() throws Exception {
        URL url = MyTest.class.getClassLoader().getResource("MyDataSet.xml");
        return new XmlDataSet(new FileInputStream(url.getPath()));
    }

    private static JdbcDatabaseTester databaseTester;

    @BeforeClass
    public static void setUpClass() throws Exception {
        // Init test environment, session etc.
        databaseTester = new JdbcDatabaseTester(
                "org.apache.derby.jdbc.ClientDriver",
                "jdbc:derby://localhost:1527/myschema", 
                "username", "password");
        databaseTester.setDataSet(getDataSet());
    }

    @AfterClass
    public static void tearDownClass() {
        // Close session etc.
    }

    @Before
    public void setUp() throws Exception {
        databaseTester.onSetup();
    }

    @After
    public void tearDown() throws Exception {
        databaseTester.onTearDown();
    }

    @Test
    public void test() throws Exception { ... }
}

Este código coloca de volta (um subconjunto de) o esquema de banco de dados para o estado definido por MyDataSet.xml Após cada teste. (Observe que, como @Pascal comentou, a redefinição nem sempre está cheia - se um teste modificar uma tabela que não está no conjunto de dados, ela não será afetada pelo @Before / @After métodos.)

Outras dicas

Para inicializar o banco de dados no conjunto de dados inicial, basta implementar esses métodos no seu caso de teste:

@Override
protected DatabaseOperation getSetUpOperation() throws Exception
{
    return DatabaseOperation.CLEAN_INSERT; // by default (will do DELETE_ALL + INSERT)
}

@Override
protected DatabaseOperation getTearDownOperation() throws Exception
{
    return DatabaseOperation.NONE; // by default
}

Você pode ter restrições de chaves estrangeiras se alguns de seus testes insira linhas em uma tabela vazia (não definida no conjunto de dados inicial, por exemplo).

Basta adicionar esta tabela vazia no seu conjunto de dados sem qualquer linha:

<mydb_mypopulatedtable id="1" name="toto" alias="funky"/>
<mydb_mypopulatedtable id="2" name="titi" alias="groovy"/>
<mydb_mypopulatedtable id="3" name="tutu" alias="creepy"/>

<mydb_myemptytable />

Aqui, o MyEmptyTable tem uma chave estrangeira para mypopulatedtable. Se o MyEmptyTable não fosse definido, o DBunit tentaria excluir o mypopulatedtable, mas falhará por causa da restrição. Se definido, o dbunit excluirá linhas myemptytable antes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top