Category: Desenvolvimento Ágil

Test Driven Development em uma tirinha

Somos o TDD - Test Driven Development

O TDD (Test Driven Development) é basicamente a execução de pequenos ciclos compostos por esses passos:

“Crie e execute o teste”
Escolha um pequeno cenário para codificar. O primeiro passo é implementar seu teste e executá-lo. Como o código de produção não foi implementado ainda, o teste irá falhar.

“Codifique para passar no teste”
Codifique somente o mínimo necessário para que o teste execute com sucesso.

“Refatore!”
Por último, mas não menos importante é o passo da refatoração. Refatorar garante que o código ficará limpo, claro e sem repetições.

Agora é só repetir tudo até que todos os cenários estejam codificados e com os testes passando. Se quiser saber mais, assista essa minha palestra sobre o assunto.

ps.: Não lembra dos “gordinhos da Embratel”? Então dá uma olhada nesse vídeo. :)

Mock de métodos estáticos em Java

Logo PowerMock

A utilização de métodos estáticos, na maioria dos casos, deve ser evitada por dificultar os testes unitários e criar um alto acoplamento. Mas se você se deparar com um método estático e tiver que sobrescrever seu comportamento para implementar testes unitários utilizando a técnica Mock Objects, indico a ferramenta PowerMock.

Esse framework permite a criação de mocks de métodos marcados com static ou até mesmo final. O PowerMock é utilizado como uma extensão de outras ferramentas de mock, como o EasyMock e o Mockito.

Exemplo

O trecho de código abaixo retirado deste exemplo, demonstra como utilizar o PowerMock com o EasyMock:

import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.powermock.reflect.Whitebox;
import samples.singleton.StaticService;

import static org.easymock.EasyMock.expect;
import static org.junit.Assert.*;
import static org.powermock.api.easymock.PowerMock.*;

@RunWith(PowerMockRunner.class)
@PrepareForTest( { StaticService.class })
public class MockStaticTest {

 @Test
 public void testMockStatic() throws Exception {
  mockStatic(StaticService.class);
  String expected = "Hello altered World";
  expect(StaticService.say("hello")).andReturn("Hello altered World");
  replay(StaticService.class);

  String actual = StaticService.say("hello");

  verify(StaticService.class);
  assertEquals("Expected and actual did not match", expected, actual);
 }
}

O método estático a ser “mockado” é o say da classe StaticService. Suponha que a implementação deste método retorna “Hello World”. O objetivo deste código de exemplo é sobrescrever o comportamento de say para retornar “Hello altered World” quando recebe “hello” como parâmetro.

A linha 12 define o runner do PowerMock para o JUnit 4 e a linha 13 informa quais as classes que devem ser preparadas para o teste. Entre as linhas 18 e 21 é definido o comportamento esperado para o metodo say, que é retornar “Hello altered World” quando receber “hello” como parâmetro. O método say é chamado na linha 23 e retornará o valor definido, o que é verificado nas linhas 25 e 26.

A utilização do PowerMock é praticamente igual à do EasyMock padrão, com excessão do runner, da annotation @PrepareForTest e da chamada do método mockStatic.

Por que eu preciso disso?

Um caso em que o PowerMock ajuda muito é quando foi utilizado o design pattern Singleton ou um Factory Method estático. Por exemplo, no código a seguir é chamado o método getInstance de ServicoAutenticacao.

public class LoginController {

 public void realizarLogin(String login, String senha) throws LoginInvalidoException {
  ServicoAutenticacao servicoAutenticacao = ServicoAutenticacao.getInstance();

  //faz algo...
 }
}

O problema é que para realizar os testes unitários você não deve utilizar a implementação real deste serviço, já que ele pode depender de recursos (banco de dados, LDAP, etc.) e é necessário sobrescrever seu comportamento para os testes. Com o PowerMock você sobrescreve o método estático para retornar uma implementação fake do serviço ou um mock object.

O ideal neste caso seria substituir o método estático por uma Injeção de Dependência, porém isso não é possível se você estiver utilizando uma API ou framework que tenha uma chamada desse tipo.

Instalação

A página Getting Started da wiki do projeto explica como adicionar a biblioteca em seu projeto, utilizando o Maven ou não.

Referências

BDD em aplicações web – JM 98

Capa Java Magazine 98Foi publicado na Java Magazine 98 meu artigo BDD em aplicações web na seção Engenharia de Software. Neste artigo escrevo sobre a utilização da metodologia BDD (Behavior Driven Development) para o desenvolvimento de aplicações web com as ferramentas JBehave e Selenium.

Para quem não conhece, o BDD descreve os comportamentos do sistema em uma linguagem compreendida por todos os envolvidos do projeto (cliente, desenvolvedores, equipe de QA, etc.) e possibilita automatizar os testes de aceitação em aplicações web. Considerada por muitos a evolução do TDD (Test Driven Development), essa metologia é útil para equipes que utilizam metodologias ágeis no desenvolvimento de aplicações web.

Se você ainda não conhece essa metodologia ou ainda não aplicou ela integrada com o Selenium, dê uma conferida no meu artigo. Aguardo seu feedback :)

Leia o artigo na versão digital da revista

Agradeço ao Eduardo Spínola pelo convite para escrever na Java Magazine.

 

Assista as gravações das palestras da #soudevcon

Gravações palestras #soudevcon Para quem perdeu o evento ou quer assistir de novo, as gravações das palestras que rolaram na primeira edição da #soudevcon já estão disponíveis.

A conferência aconteceu no último sábado (15/10/11) e contou com palestras muito interessantes sobre Android, Flex, .NET, Desenvolvimento de Jogos, HTML5, jQuery e também minha palestra sobre TDD.

Assista as gravações e compartilhe para que a próxima edição da #soudevcon seja ainda melhor e com mais participantes.

Abaixo os links das gravações:

A descrição de cada palestra você pode conferir no site oficial do evento.

Desenvolvedor no controle utilizando TDD #soudevcon

Palestrei na primeira edição da #soudevcon falando sobre TDD. Para quem quiser dar uma olhada novamente nos slides e no código-fonte, disponibilizei eles no SlideShare e no github.

Atualizado em 19/10: A gravação da palestra agora também está disponível.

Slides da palestra:

Código-fonte: 
https://github.com/victorserta/exemplostdd/tree/master/controle_estoque_soudevcon

Gravação:
Clique para assistir
Player Adobe Connect

Curtiu a palestra ou tem alguma dúvida? Deixe seu comentário aqui e compartilhe no twitter. :)

Agradeço o feedback do pessoal no twitter após a palestra:

@jandersonfc: “excelente palestra so @victorserta sobre #tdd no #soudevcon #soudev … parabéns brother”

@diogorosanelli: “Palestra do Victor Serta sobre #TDD show de bola no #soudevcon Parabéns ! 8)”

@gilmarpalega: “Nota 10 para a palestra #TDD do @victorserta no #soudevcon #soudev”

@lincolnpomper: “Peguei só o final da palestra sobre #TDD do @victorserta no #soudevcon mas parece que foi ótima como sempre.

Hashtags: #soudev #soudevcon #tdd

#soudevcon em 15/10/11: Conferência online de para desenvolvedores

No próximo sábado (15/10/11) acontecerá o evento #soudevcon, uma conferência online de desenvolvedores para desenvolvedores. Este será o primeito evento online e grátis da comunidade #soudev.

logo #soudevcon

Eu irei palestrar no evento falando sobre TDD. Dê uma conferida na descrição da minha palestra:

Desenvolvedor no controle utilizando TDD

Nessa palestra apresentarei o que é TDD (Test Driven Development) e seus conceitos de forma muito prática. Essa técnica ajuda a produção de softwares com mais qualidade e coloca o desenvolvedor realmente no controle do código. Assim você se livra das longas sessões de debug, códigos incompreensíveis e arquiteturas no estilo “matar uma formiga com um canhão”.

Agenda

Abaixo a grade com os horários de todas palestras que vão rolar no evento:

08:30 – 09:00 – Abertura da Conferência Soudev
09:00 – 10:15 – Desenvolvedor no controle utilizando TDD
10:15 – 11:30 – Git na prática
11:30 – 12:45 – Plataforma Android
14:00 – 15:15 – Aplicações Flex + .NET Plataform + ADO.NET Entity Framework
15:15 – 16:30 – Quero ser um desenvolvedor de Jogos
16:30 – 17:45 – Armazenamento local com WebStorage HTML5
17:45 – 19:00 – jQuery – Essencial

Participe acessando este link e ajude a divulgar pelo twitter com a hashtag #soudevcon.
Para mais informações, acesse o site do evento: http://conference.soudev.com.br.

Evento ITCare-PR em Curitiba 14/05/11

Banner IT Care Paraná

Quer assistir palestras interessantes e ao mesmo tempo ajudar as vítimas das fortes chuvas que atingiram o Paraná? Este é o objetivo do evento IT Care-PR que contará com a presença de Roger Brinkley da Oracle.

Eu participarei do evento com a palestra TDD com Java, onde vou explicar os fundamentos da metodologia Test Driven Development com exemplos na linguagem Java.

Além de Java, o evento também terá palestras sobre .NET, Android, iOS (iPhone) e Scrum.

Quando: 14/05/2011
Onde: Universidade Positivo - Auditório 2 da Escola de Negócios (Bloco Amarelo)
Palestras: Clique aqui
Palestrantes: Clique aqui
Inscrição: Clique aqui
Entrada: Alimentos não-perecíveis, material de limpeza e água mineral