tdc 2015 são paulo - clean code para testers
TRANSCRIPT
![Page 1: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/1.jpg)
Globalcode – Open4education
Clean Code para TestersStefan Teixeira
[email protected] / stefanteixeira.com.br
![Page 2: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/2.jpg)
Sobre o palestranteStefan Teixeira
• QA Engineer @ M4U
• 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
![Page 3: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/3.jpg)
Clean Code
![Page 4: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/4.jpg)
![Page 5: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/5.jpg)
Como me senti quando comecei a ler o livro…
![Page 6: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/6.jpg)
Mas depois…
![Page 7: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/7.jpg)
Por que Clean Code?
![Page 8: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/8.jpg)
![Page 9: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/9.jpg)
O custo de código ruim
![Page 10: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/10.jpg)
O que é Clean Code?
![Page 11: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/11.jpg)
“I like my code to be elegant and efficient. Clean code does one thing well.”Bjarne Stroustrup, criador do C++
![Page 12: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/12.jpg)
“Clean code always looks like it was written by someone who cares.”Michael Feathers, criador do livro “Working Effectively with Legacy Code"
![Page 13: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/13.jpg)
“You know you are working on clean code when each 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
![Page 14: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/14.jpg)
The Boy Scout Rule“Leave the campground cleaner than you found it."
![Page 15: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/15.jpg)
6 pontos sobre Clean Code importantes para um
tester
![Page 16: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/16.jpg)
#1: Nomes Significativos
![Page 17: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/17.jpg)
Use nomes que revelem a intenção!“Se um nome requer 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;
![Page 18: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/18.jpg)
Use nomes buscáveis!• Evite usar variáveis com apenas uma 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() );
![Page 19: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/19.jpg)
Nomes de classes e métodos
Classes:
• Devem conter substantivos ou frases nominais• Ex: LoginPage, Usuario, ConnectionFactory, Conta…
Métodos:• Devem conter verbos ou frases verbais• Ex: deletarPagina, salvar, incluirUsuario, removerConta
![Page 20: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/20.jpg)
#2: Classes
![Page 21: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/21.jpg)
Não crie classes Megazord!
![Page 22: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/22.jpg)
Classes devem ser pequenas!
“The first rule of classes is 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.”
![Page 23: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/23.jpg)
SRP (Single Responsibility Principle)
“Uma classe ou módulo deve ter um, e apenas um, motivo para mudar."
![Page 24: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/24.jpg)
#3: Funções
![Page 25: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/25.jpg)
Cuidado com os Zords…
![Page 26: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/26.jpg)
Funções devem ser pequenas!
“The first rule of functions is that they should be small. The second rule is that they should be smaller than that.”
![Page 27: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/27.jpg)
Use nomes descritivos!“Não tenha medo de dar um nome 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()
![Page 28: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/28.jpg)
Faça apenas uma coisa!public static String renderizarPaginaComSetupsETeardowns(PageData pageData, boolean 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 teste2) Caso seja, inclui setups e teardowns3) Renderiza a página em HTML
![Page 29: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/29.jpg)
Faça apenas uma coisa!
• Parágrafo PARA:
PARA renderizarPaginaComSetupsETeardowns, verificamos 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.
![Page 30: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/30.jpg)
E esse método?public static String renderizarPaginaComSetupsETeardowns(PageData pageData, boolean isSuite) throws Exception {
if( isTestPage(pageData) ) { WikiPage testPage = pageData.getWikiPage();
StringBuffer newPageContent = new StringBuffer(); includeSetupPages(testPage, newPageContent, isSuite); newPageContent.append(pageData.getContent()); includeTeardownPages(testPage, newPageContent, isSuite); pageData.setContent(newPageContent.toString());
}
return pageData.getHtml(); }
Como ficaria o parágrafo PARA nesse caso?
![Page 31: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/31.jpg)
Como saber se a função faz apenas uma coisa?
• 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."
![Page 32: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/32.jpg)
DRY (Don’t Repeat Yourself)LoginPage.java public HomePage login(String _usuario, String _senha) {
usuario.sendKeys(_usuario); senha.sendKeys(_senha); loginForm.submit();
return new HomePage(driver);
}
public LoginPage loginSemSucesso(String _usuario, String_senha) {
usuario.sendKeys(_usuario); senha.sendKeys(_senha); loginForm.submit();
wait.until(ExpectedConditions.visibilityOf( mensagemErro ));
return this;
}
![Page 33: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/33.jpg)
DRY (Don’t Repeat Yourself)LoginPage.java public HomePage login(String _usuario, String _senha) {
preencherESubmeterForm(_usuario, _senha);
return new HomePage(driver);
}
public LoginPage loginSemSucesso(String _usuario, String _senha) {
preencherESubmeterForm(_usuario, _senha);
wait.until(ExpectedConditions.visibilityOf( mensagemErro ));
return this;
}
private void preencherESubmeterForm(String _usuario, String _senha) { usuario.sendKeys(_usuario); senha.sendKeys(_senha); loginForm.submit(); }
![Page 34: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/34.jpg)
#4: Comentários
![Page 35: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/35.jpg)
“Don’t comment bad code - rewrite it.”
“The proper use 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.”
![Page 36: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/36.jpg)
Comentários BONS
• Comentários legais (copyright)
• TODOs‣ Cuidado para não encher o código com TODOs
• Amplificar importância‣ Dar ênfase em algo importante que possa passar despercebido
![Page 37: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/37.jpg)
Comentários BONS
• Aviso sobre consequências
![Page 38: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/38.jpg)
Comentários RUINS
• Redundância//Método usado para preencher o form 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();
}
![Page 39: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/39.jpg)
Comentários RUINS
• Comentários obrigatórios
/**
* @param _usuario Nome do usuario
* @param _senha Senha do usuario
*/
public void preencherESubmeterForm(String _usuario, String _senha) {
usuario.sendKeys(_usuario);
senha.sendKeys(_senha);
loginForm.submit();
}
![Page 40: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/40.jpg)
Comentários RUINS
• Noise comments (reafirmam o óbvio)
/**
* Retorna o nome
* @return o nome
*/
public String getNome() {
return nome;
}
![Page 41: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/41.jpg)
Comentários RUINS
• Código comentado
‣ Quem encontrar um trecho 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. :)
![Page 42: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/42.jpg)
Comentários RUINS
• Comentários em HTML
![Page 43: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/43.jpg)
Comentários RUINS
• Comentários extensos
![Page 44: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/44.jpg)
#5: Formatação
![Page 45: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/45.jpg)
• Funções Dependentes‣Se uma função chama outra, elas 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.
![Page 46: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/46.jpg)
• Formatação Vertical‣Projetos Java complexos (JUnit, TestNG, Ant, Tomcat) não possuem arquivos com mais de 500 linhas
• Formatação Horizontal‣Cuidado com scroll horizontal!
![Page 47: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/47.jpg)
• Indentação‣ "Without indentation, programs would be virtually unreadable by humans”
![Page 48: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/48.jpg)
#6: Testes
![Page 49: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/49.jpg)
Era uma vez uma equipe…
![Page 50: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/50.jpg)
… que não se importava com a qualidade do código de testes.
![Page 51: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/51.jpg)
Com o passar das releases, o custo de manter a suite só aumentava…
![Page 52: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/52.jpg)
… até que tiveram que descartar a suite inteira.
![Page 53: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/53.jpg)
Moral da História
Código de teste é tão importante quanto código
de produção!
![Page 54: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/54.jpg)
“Having dirty tests is equivalent to, if not worse than, having no tests.”
“What makes a clean test? Three things. Readability, readability, and readability.”
Mantenha seus testes limpos!
![Page 55: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/55.jpg)
Conclusão
![Page 56: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/56.jpg)
“Any fool can write code that a computer can understand. 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
![Page 57: TDC 2015 São Paulo - Clean Code para Testers](https://reader033.vdocuments.site/reader033/viewer/2022042716/55cbcd41bb61ebaf7d8b4645/html5/thumbnails/57.jpg)
Outros livros recomendados