• Bacharel em Ciência da Computação pela UFRJ • MBA em Garantia de Qualidade de Software pela Escola Politécnica da UFRJ • Mantém um blog técnico sobre testes: stefanteixeira.com.br • Entusiasta de Testes Automatizados, Agile Testing e da cultura DevOps Contatos: • E-mail: [email protected] • Twitter: twitter.com/stefan_teixeira • Facebook: facebook.com/stefan.teixeira • LinkedIn: linkedin.com/in/stefanteixeira • GitHub: github.com/stefanteixeira • SlideShare: slideshare.net/stefanteixeira
routine you read turns out to be pretty much what you expected” Ward Cunningham, criador do Wiki, do Fit e um dos signatários originais do Manifesto Ágil
um comentário, então ele não revela sua intenção." int v1; //valor do produto à vista int v2; //valor total do produto a prazo int v3 = v2 - v1; //diferença entre valores à vista e a prazo int valorAVista; int valorAPrazo; int diferencaEntreValoresAVistaAPrazo;
letra ‣ Usar apenas como variáveis de controle (em um “for”, por exemplo) • Evite usar valores “hardcoded" (constantes, strings, etc.) assertEquals(“Cadastrado com sucesso”, cadastroPage.getMensagem()); public static final String MSG_SUCESSO = “Cadastrado com sucesso”; assertEquals( MSG_SUCESSO, cadastroPage.getMessage() );
that they should be small. The second rule is that they should be smaller than that.” “Se a gente não consegue dar um nome sucinto a uma classe, então provavelmente a classe é grande demais.”
longo a uma função. Um nome longo e descritivo é melhor do que um curto e enigmático. Um nome longo e descritivo é melhor do que um comentário.” //Testa a inclusão de um usuário informando CPF inválido testeIncluirFalha() testeIncluirUsuarioComCPFInvalidoSemSucesso()
isSuite) throws Exception { if( isTestPage(pageData) ) { incluiSetupsETeardowns(pageData, isSuite); } return pageData.getHtml(); } O método faz apenas uma coisa? 1) Determina se a página é uma página de teste 2) Caso seja, inclui setups e teardowns 3) Renderiza a página em HTML
se a página é uma página de teste e, caso seja, incluímos os setups e teardowns. Em ambos os casos, renderizamos a página em HTML. Observe que todos os passos da função do exemplo estão a um nível de abstração abaixo do seu nome.
Veja se é possível extrair outra função com um nome que não seja uma reafirmação da implementação inicial. “Se uma função executa passos que estão a apenas um nível de abstração abaixo do seu nome, então a função faz apenas uma coisa.” “Funções que fazem apenas uma coisa não podem ser divididas em seções."
of comments is to compensate for our failure to express ourself in code.” “Innacurate comments are far worse than no comments at all. Truth can only be found in one place: the code.”
de login, passando usuário e senha como parâmetros e submetendo o form em seguida private void preencherESubmeterForm(String _usuario, String _senha) { usuario.sendKeys(_usuario); senha.sendKeys(_senha); loginForm.submit(); }
de código comentado não vai ter coragem de deletá- lo. Podem pensar que é algo importante. ‣ Pratique o desapego. Temos ferramentas de controle de versão para isso. :)
devem estar próximas verticalmente, e a função que chama deve estar acima da que é chamada, se possível. ‣ Isso dá a seu código um fluxo natural. • Afinidade Conceitual ‣Quanto maior for a afinidade entre conceitos de funções, menor deve ser a distância vertical entre elas.
Good programmers write code that humans can understand.” - Martin Fowler “Refactoring is an iterative process full of trial and error, inevitably converging on something we feel is worthy of a professional." - "Uncle Bob" Martin