KISS - Keep it simple, stupid!

Programador, nem sempre é você que está errado!

postado por Fabrício Ferracioli em 19/11/2009 14:51:11

Pois é amigos, quando estamos falando de programação nem sempre você é o cara errado da história.

Digo isso pois acabo de passar por uma situação em que estava certo, mas por não acreditar muito nisso acabei perdendo algum tempo procurando erros inexistentes.

Estava testando uma aplicação e apenas um caso de teste falhava.
Ao verificar o código aparentemente não havia nada errado, e poucos dias atrás o mesmo trecho não apresentava problemas. O que estaria acontecendo?

Teste com 1 falha

Fiquei um bom tempo tentando encontrar algum erro bobo de lógica em um código que eu havia acabado de inserir, mas não encontrava nada. Além disso, o trecho de código que falhava nos testes não tinha relação nenhuma com as alterações que havia feito.

Então pensei que poderia ser uma alteração do CakePHP 1.2.5 que não havia passado para o meu código. Também procurei por isso em vão. Então percebi que o problema estava com uma função que utiliza transações, o que já foi uma fonte de problemas nesse projeto, ou seja, um problema recorrente.

    if($init_transaction){
        $db =& ConnectionManager::getDataSource($this->useDbConfig);
        $db->begin($this);
    }
    foreach( $balloonContents['BalloonContent'] as $index => $content ) {
        $content['balloon_id'] = $balloon_id;
        $this->create($content);
        $save = $this->save();
        $status = $status && $save;
    }
 
    if(!$init_transaction){
        return $status;
    }
    elseif ($status && $db->commit($this)) {
        return true;
    }
    else {
        $db->rollback($this);
        return false;
    }

É um código simples, e não existe nenhum problema com ele. Como eu acabei de instalar o openSuse 11.2, que agora está com o MySQL 5.1 nativo, me lembrei que ele poderia não estar configurado corretamente para usar a storage engine InnoDB. E era exatamente isso! Como o MyISAM fica habilitado por padrão, e essa storage engine não tem suporte total a transações, se você deseja utilizar esse recurso deve dizer ao banco de dados.
Ou seja, meu ambiente estava configurado de modo inconsistente com as necessidades da aplicação. Alterei o arquivo de configuração do MySQL, o my.cnf, adicionando a seguinte opção:

default-storage-engine=InnoDB

Depois disso o teste passou e tudo voltou ao normal.

Testes passando após trocar a storage engine

Portanto rapaziada, em alguns casos não adianta procurar pelos seus erros. Procure se lembrar que qualquer tarefa necessita de subsídios, e no caso de nós programadores, um ambiente bem configurado faz toda diferença.

Alguém já passou por situação semelhante?

Tags: , , , ,
Topo

Sem comentários

Ajudando a melhorar a qualidade do PHP

postado por Fabrício Ferracioli em 17/06/2009 09:23:41
Tags: ,

Vocês já devem ter percebido através dos posts do blog que damos grande importância para os testes de software. As razões para isso são diversas, mas certamente a principal está relacionada a confiabilidade.

Nossa linguagem de programação preferida, o PHP, sempre sofreu diversos ataques com relação a esse aspecto, normalmente comparado a outras linguagens de programação como Java, Python, Ruby e até C++. Não que ele seja uma linguagem imaculada, mas não é limitado ou ruim como muitos dizem por ai.
Se vocês acompanham o desenvolvimento da linguagem, devem saber que a versão 5.3 está quase saindo do forno, e vem com várias promessas bastante promissoras.

Uma delas, que acredito que seja uma das melhores iniciativas desse release, é o PHP Quality Assurance. O PHP QA é uma iniciativa de um grupo de desenvolvedores que deseja ajudar o grupo principal de desenvolvimento do PHP, melhorando a qualidade da linguagem. Entre as estratégias e objetivos, temos diversas iniciativas associadas a testes automatizados, análise e reporting de bugs.

Só que uma das partes mais interessantes ainda não foi mencionada. Se você se preocupa com a qualidade da sua linguagem de programação preferida e gostaria de ajudar ela a melhorar, agora você tem mais uma maneira de fazer isso! Você quer saber como?
Agora você pode escrever testes para o PHP!
E não é só isso! Agora você também pode acompanhar o andamento dos testes existentes e o code coverage para cada versão. Outro modo de ajudar é testanto a compilação dos Release Candidates atuais.

Não conheço nenhuma iniciativa semelhante por parte de outras linguagens de programação, alguém sabe de alguma?
Essa talvez seja uma das grandes vantagens do PHP com relação a outras linguagens de programação, o tamanho da comunidade e a abertura dada para que ela possa contribuir.
Agora ninguém tem desculpa pra não ajudar o PHP a se tornar uma linguagem de programação cada vez melhor. E quando vocês ouvirem que ele é uma linguagem não confiável, já sabem aonde recorrer para provarem o contrário.
Good coding!

Tags: ,
Topo

2 Comentários

CakePHP AutoTest – Testes Contínuos

postado por João José Pedrini em 12/02/2009 20:24:10

Certo dia, lá no canal do IRC fiquei sabendo de um projeto muito interessante, o CakeAutoTest do Rodrigo. Se trata de um plugin de CakePHP para realizar Auto-Testes. Não sei se comentei aqui no blog mas sempre acreditei que teste automatizado é a melhor ferramenta de feedback que podemos ter num projeto, ele nos dá confiança para prosseguirmos, coragem para refatorar nossos códigos, simplicidade e motivação para não pararmos de programar. E se feedback é tão bom, por que não termos esse feedback a todo momento!? É esta a idéia do AutoTest.

CakeAutoTest em Ação!

CakeAutoTest em Ação!

Depois que soube que ele tinha iniciado este projeto, fiquei muito empolgado para poder utilizar. Infelizmente acabei tendo alguns problemas e não tive muito tempo para explorar o plugin. Bem, a espera terminou, fiz um fork no projeto e arregacei as mangas para solucionar alguns dos problemas que estava enfrentando, de quebra, acabei fazendo um pouco mais e adicionei suporte a uma ferramenta de notificação para o Linux (libnotify).  As minhas modificações já foram adicionadas no repositório principal do Rodrigo. Para instalar o Libnotify no Linux é fácil, com o ’slapt-get’ do Slackware é só fazer o download dos pacotes libnotify-0.4.*as e notification-daemon-0.4.*as (em outras distros eu não faço idéia como instalar).

Após fazerem clone no projeto do Rodrigo ou no meu na pasta de plugins vocês devem configurar o arquivo .autotest do seu projeto (crie um arquivo .autotest na raiz da pasta /app). Neste arquivo a idéia é armazenar as informações singulares de cada projeto, como as pastas que serão ignoradas e/ou o sistema de notificação que irá utilizar. Para vocês terem uma idéia, este arquivo será carregado dentro do __construct() do AutoTestShell, portanto vocês poderão setar/utilizar qualquer variável da classe. Como exemplo, vocês podem olhar o .autotest que utilizo:

<?php 
$this->ignore_files[] = '/autotest/';
// Adicionando a notificação do LibNotify
include( $this->paths['libs'].'libnotify.php');
?>

Para executar é simples, chame a Task autotest no Shell do CakePHP e deixa rolar. A cada modificação em qualquer arquivo do projeto, o plugin irá rodar os testes. Se você quebrou ou concertou algum teste, ele avisará. Simples e super útil! Agora, tudo que você fizer no projeto você terá o feedback se está melhorando ou estragando tudo!

Está ai a apresentação desta nova ferramenta para CakePHP, parabéns ao Rodrigo e qualquer dúvida que vocês tiverem é só comentar no post que terei o prazer de ajudar!

Tags: , , , , ,
Topo

Sem comentários

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