Fixtures, preparando os ingredientes
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 vai 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. É ai 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 inicio 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 é definida as características da tabela e seus respectivos campos. E os $records são as linhas da tabela, corresponde 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.
Tags: cakephp, fixtures, testingComentários (4)
-
001
Dizus
em 08/10/2008 01:10:12ola,
muito bom o post, mas ainda estou com um problemenha aqui…
segui os passos do post, mas mesmo assim quando executo os dases dos testes de uma aplicação o cake continua a utilizar o banco de dados de produção.
o estranho é que o cake carrega os dados dos fixtures normalmente, mas quando tento fazer alguma inserção, ele usa o bd de produção…
-
002
joaojose
em 08/10/2008 09:28:53Fala Dizus,
Este problema, no Cake 1.2, pode ser resolvido utilizando a função estática ClassRegistry::init(‘Model’);
Você pode ver a explicação completa através deste link aqui: http://debuggable.com/posts/testing-models-in-cakephp—now-let%27s-get-rid-of-the-unnecessary-modeltest-classes-!:4890ed55-be28-4d4a-ba4c-7fd64834cda3
Ok? Qualquer dúvida é só falar!
-
003
Dirceu Jr.
em 23/11/2008 15:45:47Que legal que mesmo a galera do PHP está se preocupando com testes. Creio que deve ser menos gente do que na comunidade Ruby, mas legal :)
-
004
joaojose
em 24/11/2008 09:21:58Temos que nos preocupar né! Não acredito em um desenvolvimento “saudável” sem a utilização de testes.
Não vejo muito o pessoal utilizando, mas é interessante ver os frameworks já baseando seu desenvolvimento em testes.




