Mock Objects no SimpleTest

4 de dezembro de 2009 by Léo Hackin 16 comentários

Olá pessoal,

Continuando nossa sequência de artigos sobre o SimpleTest, já aprendemos como fazer testes unitários e agrupa-los para facilitar a execução em lote: agora vamos falar um pouco sobre mock objects.

Até agora, nossos testes unitários se resumiram a testar métodos e funcionalidades que envolviam apenas uma classe como nossa calculadora: tínhamos um método chamado “somar” que fazia parte da própria classe e recebia como parametro de entrada apenas dois inteiros.

A idéia do teste unitário (ou de unidade), como o próprio nome diz, é isolar e testar apenas aquele ponto e funcionalidade do software: então é imprescindível que possamos isolar da melhor maneira apenas a classe/métodos que desejamos testar para que, caso apresente falha, possamos identificar exatamente onde a falha ocorreu.

Mas e quando nossa classe depende de outra(s) classe(s) para fazer um método funcionar ?

» Leia o restante do post Mock Objects no SimpleTest

Giran no 4º QUARTA WEB

1 de dezembro de 2009 by Léo Hackin 1 comentário

Aloha people!

Nesta quarta-feira, dia 02/12, rola no Canto da Roça da Praia do Canto o 4º Quarta Web, um evento que reúne vários profissionais da internet capixaba todo mês e vem se tornando uma referência no estado. Geralmente o evento ocorre sempre na última quarta do mês, mas excepcionalmente dessa vez será feito na primeira quarta-feira do mês. :)

O evento é um evento da comunidade WebCapixaba, organizado pelo André Fiorini @castiglioni, Celso Hora @cchcreative, Filipe Giacomin @filipegb e Paulo Henrique “PH” @ph_etc_br. O WebCapixaba é uma comunidade online de profissionais da internet capixaba bem bacana: se não conhece acessa agora rapá!

O assunto dessa vez será “O que esperar do mercado web em 2010″ e terá um formato de mesa redonda, onde irão participar pessoas de grandes agências envolvidas diretamente com web, como o Gilber Machado (E-brand) e o Rodrigo Quintão (4Ps), respectivamente sócios-diretores das empresas em questão.

Tive a honra de ser convidado para participar da mesa redonda também, afim de representar a Giran e também tentar contribuir um pouco com a vivência de internet que tenho. Acredito que vá ser uma oportunidade legal das pessoas verem diretamente o que grandes agências e empresas novas como a nossa pensam à respeito de carreira, tecnologia, tendências e tudo mais.

O mediador da mesa será o Rafael Silveira, do Gazeta Online, e o papo está previsto para iniciar-se às 19:00.

O evento é freeware: basta inscrever-se no do evento e aparecer lá com idéias, perguntas e tudo o que você achar interessante ser discutido. =) Para mais informações sobre o evento, clique aqui para acessar o tópico sobre o evento.

Nos vemos por lá. ;)

Organizando o dia de trabalho

28 de novembro de 2009 by Léo Hackin 11 comentários

Você é organizado ? Já tentou se organizar pra trabalhar melhor ?
Sua forma de organização lhe permite trabalhar de forma efetiva e com qualidade de vida ?

Me fiz essas reflexões à alguns dias e me considerei uma pessoa moderadamente organizada na vida profissional, mas ainda num caos quando se fala de contas pra pagar e tarefas pessoais. :) Isso era um tanto diferente, mas com sorte hoje estou bem melhor. Ajuda de alguns tarados por organização, como meu sócio Paulo Jeveaux, e algumas ferramentas que hoje me fazem trabalhar menos mas com mais efetividade.

Então, afim de compartilhar experiências e inspirado pelo post de Procrastinação do Jeve, acho que vale relatar o que estou usando hoje para organizar melhor o meu dia de trabalho.

» Leia o restante do post Organizando o dia de trabalho

Cursos Java de Verão na Giran

26 de novembro de 2009 by Léo Hackin 4 comentários

[ Momento jabá ]

Verão é praia, cerveja, sombra, água fresca e … JAVA!

A partir do dia 07/12 vamos iniciar as turmas de verão da Formação Java Profissional, curso da Caelum já famoso no Brasil e agora oferecido no estado pela Giran. Durante esse período ofereceremos a formação mais básica da plataforma, bastante requisitada pelo público local. » Leia o restante do post Cursos Java de Verão na Giran

Problema com IDs alfanuméricos no form->input (select) do CakePHP

25 de novembro de 2009 by Léo Hackin 2 comentários

Para quem já está mexendo com CakePHP a algum tempo, algumas limitações de funcionalidades podem tirar um pouco o sono de quem está muito mal acostumado com a produtividade da framework. Em geral, toda framework tem seus pontos fracos.

A algum tempo, tive um problema curioso: a chave primária de uma tabela teria valores alfanuméricos. Ou seja: valores como “205-A”, “JB02″ e outros bizarros seriam possíveis. Regra de negócio definida, modificação do modelo para o nome de chave fora da convenção e tudo corria bem até que populei um select.
:( Qual não foi minha surpresa em ver que o CakePHP, além de não marcar o valor correto, em certos casos ainda selecionava mais de um valor no select. #fail total.

» Leia o restante do post Problema com IDs alfanuméricos no form->input (select) do CakePHP

Layout novo!

24 de novembro de 2009 by Léo Hackin 2 comentários

Vamo lá pessoal! Layout novo, posts novos!

Estou devendo vários posts sobre o SimpletTest, CakePHP, PHP e blablablabla. Esse lance de twitter realmente me afastou no blogging mas o mundo não para e nem a gente!

Amanhã é nóis! Keep blogging! \\//

IV Encontro de Java do Espírito Santo – IV EJES

14 de outubro de 2009 by Léo Hackin 1 comentário

Olá pessoal,

No próximo sábado (17/10) será realizado em Vila Velha o IV Encontro de Java do Espírito Santo – IV EJES.

O EJES é um evento anual realizado pelo ESJUG (Grupo de Usuários Java do Espírito Santo – esjug.org) e já está em sua quarta edição. Este ano o evento será realizado no Cineteatro da UVV das 08:00h às 18:00h.

Este ano, assim como nas outras edições, o evento foi pensado e organizado de modo a trazer assuntos quentes e atuais, colocados em pauta por palestrantes capixabas e de fora do estado, que são referências na comunidade Java. Esta é, com certeza, uma oportunidade rara para conhecer as novidades do mundo Java e se aprofundar em conceitos e ferramentas já consagradas. E por último mas não menos importante: O Networking! Encontrar pessoas da sua área, rever antigos amigos de trabalho e fazer muitos novos contatos são coisas que só um evento como este podem te proporcionar.

Participe, não fique de fora. A próxima edição agora só em 2010 =)

Mais informações e inscrições: http://ejes.esjug.org

Voltemos!

30 de agosto de 2009 by Léo Hackin 2 comentários

IMG_0006Salve pessoal,

Sumida boa a que rolou, mas foi por bons motivos.

A Giran, empresa minha com meu sócio-irmão Paulo Jeveaux, está em franco crescimento e o último mês foi “frenético”: muitos projetos, pessoas e oportunidades novas e bacanas. Então, tive que pisar no freio com o blog. Agora vamos voltar com os posts semanais.

A novidade agora é que adquiri um Macbook Pro 13″ e um iPhone 3GS: sim, sou tarado na maçã.

Voltando aos artigos técnicos, vamos ter Mock Objects no Simple Test essa semana e provavelmente mais dois que estou rascunhando. =)

Simbora!

A Giran está contratando! :)

13 de agosto de 2009 by Léo Hackin 1 comentário

Copiado do blog do Jeveaux =)

Há pouco tempo pude compartilhar minha enorme felicidade com o lançamento da Giran Soluções e Ensino com todos vocês dois leitores, e desde lá estamos trabalhando duro, literalmente ralando por aqui. Cada dia, cada entrega, cada projeto e contrato conquistado são alegrias enormes e, sempre comemoradas com muito entusiasmo. Agora estamos abrindo nosso primeiro processo de seleção, estamos crescendo!

A Giran é uma empresa nova, jovem, descontraída e muito, muito comprometida com seus objetivos. Trabalhamos de forma ágil, usamos Scrum internamente e nos projetos dos clientes, além de várias práticas de Extreme Programming, inclusive TDD e programação em pares. Aversão à estas práticas não é um bom diferencial :)

Neste processo de seleção nós não estamos procurando especialistas e nem donos da verdade, aqui na Giran nós usamos de tudo um pouco. Cada profissional tem uma especialidade ou ‘sabor preferido’, nós também temos as nossas e sabemos valoriza-las, mas estamos interessados especialmente em profissionais multi-disciplinares, que sejam capazes de desenvolver, analisar, testar e arquitetar com diferentes linguagens e tecnologias, ou que ao menos estejam dispostos a trabalhar desta forma. Como trabalhamos com Internet, conhecimentos em Javascript, CSS, XHTML, mashups com APIs de terceiros, etc, serão um bom diferencial.

É importante que o candidato saiba que prezamos muito pela qualidade do que fazemos, nós estudamos os códigos um dos outros e nos respeitamos por isso, aprendemos muito assim. Nosso principal objetivo é a qualidade máxima, nós não viramos noite trabalhando e mesmo assim entregamos software no prazo, testado e funcionando muito bem, obrigado! Por isso estamos procurando pessoas com esse perfil: comprometidas, organizadas, que saibam trabalhar muito bem em equipe e que prezem pela qualidade do que fazem.

Por último, e talvez mais importante: todos nós somos nerds, geeks, apaixonados por tecnologia e super atualizados com as últimas novidades da Internet e do mercado. Nossa equipe é jovem, irreverente, descontraída e em constante evolução. São pessoas com esse perfil que estamos procurando.

A empresa oferece contratação com salário de mercado (não o do mercado capixaba), plano de benefícios e outros incentivos como cursos e treinamentos (especialmente aulas de inglês), um iMac ou Macbook (sim, gostamos da maçã por aqui) exclusivo para você, e claro vaga garantida nas partidas de xbox360. Estamos localizados em Jardim da Penha, Vitória-ES.

Se você acha que se enquadra, mande um email para mim (contato at giran.com.br) com seu currículo e os nomes dos 3 últimos livros técnicos que você leu. Diga se você sabe quem é o Taurin e qual sua ocupação, afinal de contas você está indo para Giran Castle Town.

Não pense que estamos procurando apenas profissionais experientes e de altíssimo nível: se você é estudante e tem pouca ou nenhuma experiência mas gosta de ler e aprender sobre coisas novas você não está fora! Escreva pra gente.

Agrupando casos de teste no SimpleTest

26 de julho de 2009 by Léo Hackin 2 comentários

Aloha,

Primeiramente, obrigado ao pessoal pelas belas palavras de incentivo e tudo mais: é esse tipo de coisa que nos empolga pra continuar trabalhando e estudando duro.

Em nosso post de iniciação no SimpleTest, criamos um caso de teste completo de uma calculadora. Relembrando nossa telinha bonita do caso de teste…

ishot-1

Agora vejamos … e se por exemplo, tivéssemos não apenas uma calculadora em nossa aplicação, mas também uma agenda de compromissos, uma agenda de contatos, um wiki, um mural de recados e … enfim, se nossa aplicação fosse composta por N classes como faríamos para rodar os casos de teste unitários de TODAS AS CLASSES ?

Na TDD, como vimos antes, escrevemos todos os testes antes de começarmos a implementar nossa aplicação em si: quando pensamos “rodar os testes” isso se aplica à todas as classes e funcionalidades que possam gerar erros em nossa aplicação.

Ai você: “Rapaz, vou ter que acessar teste por teste como fiz com a calculadora? Mamãe, eu tenho 253 casos de uso!!!!”

Imagina só se você executar, URL por URL ou comando por comando, 253 casos de uso. =/

Pensando nisso, a SimpleTest disponibiliza um recurso de agrupamento de casos de teste chamado de Test Suite. Esse recurso permite agrupar vários casos de testes numa só classe, facilitando e permitindo a execução desses testes com uma só chamada.

Seria como um script de checagem, onde cada item seria um caso de teste:

Checagem do carro

  1. Checar Óleo
  2. Checar Rodas
  3. Checar Água Carburador
  4. Checar itens de segurança

A test suite funciona exatamente assim, executando cada caso de teste na ordem que você desejar: o “check list” roda e no final você tem todos as falhas que ocorreram, separadas por caso de test e método. :)

Codando!

Bom, vamos supor que vamos ter uma aplicação composta por 5 classes: ClasseA, ClasseB, ClasseC, ClasseD e ClasseE. Cada uma delas tem suas próprias implementações e vamos ter que fazer casos de testes que testem elas individualmente.

Para ilustrar o funcionamento, vamos escrever um método para todas as classes chamado Dizer: esse método deverá receber a uma string e retornar “Estou dizendo ” concatenado com o que você passou como parâmetro. Exemplificando

1
$obj->Dizer('Muito Bacana'); // Estou Dizendo Muito Bacana

Vamos botar esse método em todas as classes apenas para simularmos as passagens e não passagens de teste delas. hehhehe

Bom, partindo do pressuposto que você esteja com o SimpleTest instalado e com nossa estrutura de arquivos do artigo de iniciação à ele, vamos escrever o caso de teste da ClasseA que será salvo dentro da nossa pasta tests e terá o nome de classe_a_test.php.

1
2
3
4
5
6
7
8
9
10
11
require_once('simpletest/autorun.php');
require_once('../classes/classe_a.php');</code>

class TestOfClasseA extends UnitTestCase {

  function testDizer() {
    $classea = new ClasseA();
    $this->assertIdentical($classea->dizer('Muito Bacana'), 'Estou dizendo Muito Bacana');
  }

}

Relembrando um pouco:

  • Fazemos o include do arquito autorun.php para automatizar nossos testes;
  • Fazemos o include da classe que vai ser testada
  • Implementamos a classe de teste iniciando por “Test” afim de que a SimpleTest execute-a automaticamente;
  • Criamos o método testDizer para testar o método dizer da nossa ClasseA;
  • Fazemos um assertIdentical que executará nosso método dizer passando “Muito Bacana” e esperará como resultado algo IDENTICO à “Estou dizendo Muito Bacana”;

Beleza, agora vamos rodar nosso teste …

Imagem14

Como era esperado (espero) nosso teste deu pau porque não escrevemos nossa ClasseA ainda em arquivo algum. Então, vamos escrevê-la e salva-la dentro da pasta classes com o nome de classe_a.php:

1
2
3
4
5
class ClasseA {
  function dizer($frase) {
    return 'Estou dizendo ' . $frase;
  }
}

Agora, vamos rodar novamente nosso teste:

Imagem15

Massa demais! Fizemos novamente um caso de teste. Até ai nenhuma novidade.

Agora o exercício braçal: crie os casos de teste para a ClasseB. ClasseC, ClasseD e ClasseE lembrando que:

  • Classes da aplicação devem ser salvas dentro da pasta classes
  • Classes dos casos de teste dentro da pasta tests

Após a criação delas, faça os testes (jura?) e veja se está tudo ok.

Criando nossa suite de testes

Agora que executamos todos os testes de forma separada, vamos junta-los em nossa suite para faze-los todos de uma vez só.

Vamos criar nossa suite de testes no arquivo all_tests.php e salva-lo na pasta tests junto com todos os nosses casos de uso.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
require_once('simpletest/autorun.php');
require_once('classe_a_test.php');
require_once('classe_b_test.php');
require_once('classe_c_test.php');
require_once('classe_d_test.php');
require_once('classe_e_test.php');

class AllTests extends TestSuite {
  function AllTests() {
    $this->TestSuite('All tests');
    $this->addTestCase(new TestOfClasseA());
    $this->addTestCase(new TestOfClasseB());
    $this->addTestCase(new TestOfClasseC());
    $this->addTestCase(new TestOfClasseD());
    $this->addTestCase(new TestOfClasseE());
  }
}

Explicando nosso script:

  • fazemos o include de simpletest/autorun.php para fazer rodar nossos testes
  • fazemos os includes de todas os casos de testes que usaremos na suite
  • criamos uma classe AllTests que extende TestSuite, que por sua vez é a classe que será responsável pelo agrupamento e execução de todos os testes
  • criamos um método AllTests que fará a execução dos casos de teste
  • Nomeamos a suite de testes com o nome All tests com o método $this->TestSuite;
  • Adicionamos então todos os nossos casos de teste com o método $this->addTestCase, instanciando o objeto de cada classe de teste

Agora, basta rodar:

Imagem2

Pronto! Nossa suite agrupou nossos testes (que eram cinco ao todo, cada um com um método de teste) e executou todos de uma vez. A lógica da suíte é você inserir os testes conforme seu contexto e sua necessidade de agrupamento de testes. Para incluir, basta repetir o procedimento já feito no arquivo da suíte:

  • faça o require_once do arquivo php do caso de teste
  • inclua o caso de teste com $this->addTestCase

E se algum teste falha-se ? Vamos fazer o teste da ClasseB falhar. Para isso altere a classe B para para retornar algo que não seja “Estou dizendo ” mas sim “Eu vou dizer “: com isso, nosso teste vai falhar. Após alterar a classeB, rode a suite de testes novamente:

Imagem3

Como pode ser visto, nossa suite de testes dá o erro exetamente onde ele aconteceu: no nosso caso, a suite de testes que chamamos de All tests reportou o erro do caso de teste TestOfClasseB no método testDizer. Maneirasso não ?

Nossa suite mostra todas as falhas por caso de teste. Simples e rápido.

E vamos às considerações

A forma que fizemos a construção da nossa suite de testes está diferente da forma em que o próprio site da SimpleTest (http://www.simpletest.org/en/start-testing.html) mostra em sua página inicial no Quick Start dele, que está diferente do link que deveria ser a mesma explicação mais detalhada, mas não é. Se olharmos o script de test suite do quick start teremos, aplicando ao nosso exemplo, teríamos:

1
2
3
4
5
6
7
8
9
require_once('simpletest/autorun.php');

class AllTests extends TestSuite {
  function AllTests() {
    $this->TestSuite('All tests');
    $this->addFile('classe_a_test.php');
    //... outros casos de teste ...
  }
}

Concerteza é um jeito mais prático: ao invés de fazer-mos os includes dos casos de testes e fazermos os instanciamentos dos mesmos no addTestCase, requerendo mais programação, simplesmente podemos incluir o teste com um addFile. E isso realmente funciona. :) Mas infelizmente não sem algumas adaptações no código.

Se quiser re-escrever sua suite de testes nesse formato, se atente ao fato que o SimpleTest aparentemente trabalha com a suite de testes acessando os caminhos absolutos dos arquivos e se perde quando referenciamos nossos arquivos, mesmo que eles estejam na mesma pasta tests. Para contornar isso, coloque a inclusão do arquivo de classe no caso de testes e a referência ao arquivo do caso de teste na suite com seus caminhos absolutos. Vamos isso na classeA por exemplo:

Na classe_a_test.php teríamos:

1
require_once($_SERVER['DOCUMENT_ROOT'] . '/app_tdd/classes/classe_a.php');

E na nossa suite all_tests.php seria re-escrita como:

1
2
3
4
5
6
7
8
require_once('simpletest/autorun.php');

class AllTests extends TestSuite {
  function AllTests() {
    $this->TestSuite('All tests');
    $this->addFile($_SERVER['DOCUMENT_ROOT'] . '/app_tdd/tests/classe_a_test.php');
  }
}

Espero que tenham gostado e no próximo post falaremos um pouco sobre MockObjetcs. ;)

Até lá.

Get Adobe Flash playerPlugin by wpburn.com wordpress themes