Back-End

3 ago, 2009

Fixtures: preparando os ingredientes

Publicidade

Quando você vai reunir os ingredientes de alguma receita, você preza em manter sempre um padrão. A mudança de um único ingrediente pode resultar no fracasso da sua receita. Imagine você mudar a farinha de trigo por farinha de mandioca (eu sei, são totalmente diferentes, mas quero que peguem a idéia). O bolo será uma droga. Ter os ingredientes certos é fundamental para o resultado.

Quando estamos num ambiente de testes automatizados, temos que nos preocupar com a preparação dos dados de entrada. Ambientes mal preparados podem acarretar em testes não conclusivos ou que falhem de uma hora para outra. Os testes devem começar em um ambiente fixo e conhecido para que possamos prever o comportamento dos testes e funções que estamos programando. É aí que entram os Fixtures.

Fixtures são uma solução de automação na preparação do ambiente de teste. Ele garante que todos os testes serão rodados com um conjunto de dados iniciais padrão, garantindo assim a integridade dos testes. Para isto, a cada início de testes, todos os dados são reiniciados e preparados. Portanto, quando estamos trabalhando num banco de dados, o fluxo de um teste começaria com um TRUNCATE da tabela, INSERT dos dados pré-estabelecidos e execução dos ASSERTS.

No CakePHP há uma implementação própria de Fixtures que é muito simples de usar. Para cada Model que você pretende definir o ambiente inicial, você cria um arquivo /app/tests/fixtures/nomemodel_fixtures.php contendo a seguinte estrutura:

class NomemodelFixture extends CakeTestFixture {
var $name = 'Nomemodel';
var $fields = array (
'id' => array('type'=>'integer', 'key'=>'primary',
// todos os campos do model
// Você pode utilizar a geração automágica do
//CakePHP através do comando Shell Schema.
);
var $records = array(
array('id'=>1,'campo_1'=>'Olá'),
array('id'=>2,'campo_1'=>'Hi')
);
}

A definição é bastante intuitiva, a variável $fields corresponde à estrutura do banco; nela são definidas as características da tabela e seus respectivos campos. E os $records são as linhas da tabela, correspondem aos dados que serão inseridos. Nesta variável há a possibilidade de se inserir quantos registros forem necessários.

No seu CakeTestCase basta inserir uma variável $fixtures contendo uma array com todos os fixtures que você deseja utilizar. Concatene um “app.” para especificar que estamos tratando de um fixture de nossa aplicação. Para exemplificar:

class NomemodelTestCase extends CakeTestCase {
    var $fixtures = array ('app.nomemodel');
}

Bem, pessoal, o básico de fixture é isso. Portanto, quando forem cozinhar seus testes, lembrem-se de sempre limpar sua cozinha e preparar seus ingredientes!