KISS - Keep it simple, stupid!

Fixtures, preparando os ingredientes

postado por João José Pedrini em 19/09/2008 10:52:38

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: , ,

Trackback

Faça o seu

Comentários (4)

  • 001

    Dizus

    em 08/10/2008 01:10:12

    ola,

    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:53

    Fala 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:47

    Que 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:58

    Temos 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.

  • Faça seu comentário

Topo

4 Comentários

Creative Commons License
Sou Ágil: KISS em http://kiss.souagil.com.br está licenciado sobre
Creative Commons Attribution-Share Alike 2.5 Brazil License.

souÁgil