SlideShare una empresa de Scribd logo
1 de 56
Descargar para leer sin conexión
Clean Code para Testers 
Globalcode – Open4education 
Stefan Teixeira 
stefanfk@gmail.com / stefanteixeira.com.br
Sobre o palestrante 
Stefan Teixeira! 
• QA Engineer! 
• Bacharel em Ciência da Computação pela UFRJ! 
• Finalizando MBA em Garantia de Qualidade de Software pela Escola 
Politécnica da UFRJ! 
• Mantém um blog técnico sobre testes: stefanteixeira.com.br! 
• Certificado CTAL-TM / TA pelo ISQTB e CPRE-FL pelo IREB! 
Contatos:! 
• E-mail: stefanfk@gmail.com! 
• Twitter: twitter.com/stefan_teixeira! 
• Facebook: facebook.com/stefan.teixeira! 
• LinkedIn: linkedin.com/in/stefanteixeira! 
• GitHub: github.com/stefanteixeira! 
• SlideShare: slideshare.net/stefanteixeira
Clean Code
Quando comecei a ler o livro
Mas depois…
Por que Clean Code?
O custo de código ruim
O que é Clean Code?
! 
! 
! 
! 
“I like my code to be elegant and 
efficient. Clean code does one thing 
well.”! 
Bjarne Stroustrup, criador do C++
! 
! 
! 
! 
“Clean code always looks like it was 
written by someone who cares.”! 
Michael Feathers, criador do livro “Working 
Effectively with Legacy Code"
! 
! 
! 
! 
“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
The Boy Scout Rule! 
“Leave the campground cleaner than you 
found it."
6 pontos sobre Clean 
Code importantes para um 
tester
#1: Nomes Significativos
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;
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() );
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
#2: Classes
Não crie classes Megazord!!
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.”! 
!
SRP (Single Responsibility 
Principle)! 
! 
! 
“Uma classe ou módulo deve ter um, e 
apenas um, motivo para mudar."! 
!
#3: Funções
Cuidado com os Zords…!
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.”!
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() 
!
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 teste! 
2) Caso seja, inclui setups e teardowns! 
3) Renderiza a página em HTML!
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.
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."
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; 
}
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(); 
}
#4: Comentários
! 
! 
“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.”! 
! 
!
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
Comentários BONS! 
• Aviso sobre consequências! 
!
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(); 
}
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(); 
}
Comentários RUINS! 
• Noise comments (reafirmam o óbvio)! 
/** 
* Retorna o nome 
* @return o nome 
*/ 
public String getNome() { 
return nome; 
}
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. :)
Comentários RUINS! 
• Comentários em HTML
Comentários RUINS! 
• Comentários extensos
#5: Formatação
• 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.
• 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!
• Indentação! 
‣"Without indentation, programs would be virtually 
unreadable by humans”
#6: Testes
Era uma vez uma 
equipe…
… que não se importava com a 
qualidade do código de testes.
Com o passar das releases, o 
custo de manter a suite só 
aumentava…
… até que tiveram que descartar a 
suite inteira.
Moral da História! 
! 
! 
! 
Código de teste é tão importante 
quanto código de produção!
“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!
Conclusão
“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
Globalcode – Open4education 
! 
Obrigado!! 
! 
! 
Stefan Teixeira! 
stefanfk@gmail.com! 
stefanteixeira.com.br! 
@stefan_teixeira

Más contenido relacionado

La actualidad más candente

Componentes Transformers: Combinando o melhor de cada framework
Componentes Transformers: Combinando o melhor de cada frameworkComponentes Transformers: Combinando o melhor de cada framework
Componentes Transformers: Combinando o melhor de cada frameworkFlávio Lisboa
 
TDD em JavaScript, rola?
TDD em JavaScript, rola?TDD em JavaScript, rola?
TDD em JavaScript, rola?Renan Siravegna
 
Técnicas de frontend para aplicações django - PythonBrasil[9]
Técnicas de frontend para aplicações django  - PythonBrasil[9]Técnicas de frontend para aplicações django  - PythonBrasil[9]
Técnicas de frontend para aplicações django - PythonBrasil[9]Rael Max
 
JavaScript: Introdução e Operadores (aula 1)
JavaScript: Introdução e Operadores (aula 1)JavaScript: Introdução e Operadores (aula 1)
JavaScript: Introdução e Operadores (aula 1)Gustavo Zimmermann
 
Automatizando seus testes com robot framework
Automatizando seus testes com robot frameworkAutomatizando seus testes com robot framework
Automatizando seus testes com robot frameworkClaudenir Freitas
 
Testes Unitários: Começando a escrever testes no seu dia-a-dia
Testes Unitários: Começando a escrever testes no seu dia-a-diaTestes Unitários: Começando a escrever testes no seu dia-a-dia
Testes Unitários: Começando a escrever testes no seu dia-a-diaAlex Tercete
 

La actualidad más candente (11)

Componentes Transformers: Combinando o melhor de cada framework
Componentes Transformers: Combinando o melhor de cada frameworkComponentes Transformers: Combinando o melhor de cada framework
Componentes Transformers: Combinando o melhor de cada framework
 
TDD em JavaScript, rola?
TDD em JavaScript, rola?TDD em JavaScript, rola?
TDD em JavaScript, rola?
 
Técnicas de frontend para aplicações django - PythonBrasil[9]
Técnicas de frontend para aplicações django  - PythonBrasil[9]Técnicas de frontend para aplicações django  - PythonBrasil[9]
Técnicas de frontend para aplicações django - PythonBrasil[9]
 
Pensando Lean
Pensando LeanPensando Lean
Pensando Lean
 
JavaScript: Introdução e Operadores (aula 1)
JavaScript: Introdução e Operadores (aula 1)JavaScript: Introdução e Operadores (aula 1)
JavaScript: Introdução e Operadores (aula 1)
 
#Moving br workshop
#Moving br workshop#Moving br workshop
#Moving br workshop
 
Automatizando seus testes com robot framework
Automatizando seus testes com robot frameworkAutomatizando seus testes com robot framework
Automatizando seus testes com robot framework
 
Testes Unitários: Começando a escrever testes no seu dia-a-dia
Testes Unitários: Começando a escrever testes no seu dia-a-diaTestes Unitários: Começando a escrever testes no seu dia-a-dia
Testes Unitários: Começando a escrever testes no seu dia-a-dia
 
Mantendo o código saudável
Mantendo o código saudávelMantendo o código saudável
Mantendo o código saudável
 
Be React. Do Tests!
Be React. Do Tests!Be React. Do Tests!
Be React. Do Tests!
 
BDD-NamoroOn
BDD-NamoroOnBDD-NamoroOn
BDD-NamoroOn
 

Similar a TDC 2014 POA - Clean Code para Testers

Scrum Gathering Rio 2014 - Melhorando sua Estratégia de Testes Automatizados
Scrum Gathering Rio 2014 - Melhorando sua Estratégia de Testes AutomatizadosScrum Gathering Rio 2014 - Melhorando sua Estratégia de Testes Automatizados
Scrum Gathering Rio 2014 - Melhorando sua Estratégia de Testes AutomatizadosStefan Teixeira
 
Samanta Cicilia - MTC - Importância de Testes Automatizados para Continuous D...
Samanta Cicilia - MTC - Importância de Testes Automatizados para Continuous D...Samanta Cicilia - MTC - Importância de Testes Automatizados para Continuous D...
Samanta Cicilia - MTC - Importância de Testes Automatizados para Continuous D...minastestingconference
 
Importância de Testes Automatizados para Continuous Delivery & DevOps
Importância de Testes Automatizados para Continuous Delivery & DevOpsImportância de Testes Automatizados para Continuous Delivery & DevOps
Importância de Testes Automatizados para Continuous Delivery & DevOpsSamanta Cicilia
 
TDC 2015 São Paulo - Clean Code para Testers
TDC 2015 São Paulo - Clean Code para TestersTDC 2015 São Paulo - Clean Code para Testers
TDC 2015 São Paulo - Clean Code para TestersStefan Teixeira
 
QConRio 2014 - Uso de Headless Browsers em Testes Automatizados
QConRio 2014 - Uso de Headless Browsers em Testes AutomatizadosQConRio 2014 - Uso de Headless Browsers em Testes Automatizados
QConRio 2014 - Uso de Headless Browsers em Testes AutomatizadosStefan Teixeira
 
[DevOps Carioca] Testes Automatizados
[DevOps Carioca] Testes Automatizados[DevOps Carioca] Testes Automatizados
[DevOps Carioca] Testes AutomatizadosSamanta Cicilia
 
Testando Aplicações Django: Quando, Como e Onde?
Testando Aplicações Django: Quando, Como e Onde?Testando Aplicações Django: Quando, Como e Onde?
Testando Aplicações Django: Quando, Como e Onde?Bernardo Fontes
 
WTF Javascript - FrontInRio 2011
WTF Javascript - FrontInRio 2011WTF Javascript - FrontInRio 2011
WTF Javascript - FrontInRio 2011Leonardo Balter
 
Testes Automatizados e o iOS
Testes Automatizados e o iOSTestes Automatizados e o iOS
Testes Automatizados e o iOSRicardo Valeriano
 
Projeto de API, por Gilmar P.S
Projeto de API, por Gilmar P.SProjeto de API, por Gilmar P.S
Projeto de API, por Gilmar P.SThoughtworks
 
Projeto de API - TDC 2014 - Floripa - Trilha Arquitetura - 18/05/2014
Projeto de API - TDC 2014 - Floripa - Trilha Arquitetura - 18/05/2014Projeto de API - TDC 2014 - Floripa - Trilha Arquitetura - 18/05/2014
Projeto de API - TDC 2014 - Floripa - Trilha Arquitetura - 18/05/2014Gilmar PSL
 
Aplicações de Alto Desempenho com JHipster Full Stack
Aplicações de Alto Desempenho com JHipster Full StackAplicações de Alto Desempenho com JHipster Full Stack
Aplicações de Alto Desempenho com JHipster Full StackJoão Gabriel Lima
 
Django - Desenvolvimento web ágil com Python
Django - Desenvolvimento web ágil com PythonDjango - Desenvolvimento web ágil com Python
Django - Desenvolvimento web ágil com PythonIgor Sobreira
 
TypeScript - Campus party 2013
TypeScript - Campus party 2013TypeScript - Campus party 2013
TypeScript - Campus party 2013Giovanni Bassi
 
Palestra TDD - TDC - 2016
Palestra TDD - TDC - 2016Palestra TDD - TDC - 2016
Palestra TDD - TDC - 2016Bruno Maomeh
 

Similar a TDC 2014 POA - Clean Code para Testers (20)

Scrum Gathering Rio 2014 - Melhorando sua Estratégia de Testes Automatizados
Scrum Gathering Rio 2014 - Melhorando sua Estratégia de Testes AutomatizadosScrum Gathering Rio 2014 - Melhorando sua Estratégia de Testes Automatizados
Scrum Gathering Rio 2014 - Melhorando sua Estratégia de Testes Automatizados
 
Samanta Cicilia - MTC - Importância de Testes Automatizados para Continuous D...
Samanta Cicilia - MTC - Importância de Testes Automatizados para Continuous D...Samanta Cicilia - MTC - Importância de Testes Automatizados para Continuous D...
Samanta Cicilia - MTC - Importância de Testes Automatizados para Continuous D...
 
Importância de Testes Automatizados para Continuous Delivery & DevOps
Importância de Testes Automatizados para Continuous Delivery & DevOpsImportância de Testes Automatizados para Continuous Delivery & DevOps
Importância de Testes Automatizados para Continuous Delivery & DevOps
 
TDC 2015 São Paulo - Clean Code para Testers
TDC 2015 São Paulo - Clean Code para TestersTDC 2015 São Paulo - Clean Code para Testers
TDC 2015 São Paulo - Clean Code para Testers
 
Clean code
Clean codeClean code
Clean code
 
QConRio 2014 - Uso de Headless Browsers em Testes Automatizados
QConRio 2014 - Uso de Headless Browsers em Testes AutomatizadosQConRio 2014 - Uso de Headless Browsers em Testes Automatizados
QConRio 2014 - Uso de Headless Browsers em Testes Automatizados
 
[DevOps Carioca] Testes Automatizados
[DevOps Carioca] Testes Automatizados[DevOps Carioca] Testes Automatizados
[DevOps Carioca] Testes Automatizados
 
Testando Aplicações Django: Quando, Como e Onde?
Testando Aplicações Django: Quando, Como e Onde?Testando Aplicações Django: Quando, Como e Onde?
Testando Aplicações Django: Quando, Como e Onde?
 
Testing sucks
Testing sucksTesting sucks
Testing sucks
 
WTF Javascript - FrontInRio 2011
WTF Javascript - FrontInRio 2011WTF Javascript - FrontInRio 2011
WTF Javascript - FrontInRio 2011
 
Testes Automatizados e o iOS
Testes Automatizados e o iOSTestes Automatizados e o iOS
Testes Automatizados e o iOS
 
Projeto de API, por Gilmar P.S
Projeto de API, por Gilmar P.SProjeto de API, por Gilmar P.S
Projeto de API, por Gilmar P.S
 
Projeto de API - TDC 2014 - Floripa - Trilha Arquitetura - 18/05/2014
Projeto de API - TDC 2014 - Floripa - Trilha Arquitetura - 18/05/2014Projeto de API - TDC 2014 - Floripa - Trilha Arquitetura - 18/05/2014
Projeto de API - TDC 2014 - Floripa - Trilha Arquitetura - 18/05/2014
 
Aplicações de Alto Desempenho com JHipster Full Stack
Aplicações de Alto Desempenho com JHipster Full StackAplicações de Alto Desempenho com JHipster Full Stack
Aplicações de Alto Desempenho com JHipster Full Stack
 
Testes de Sofware
Testes de SofwareTestes de Sofware
Testes de Sofware
 
Vivendo de hacking
Vivendo de hackingVivendo de hacking
Vivendo de hacking
 
Django - Desenvolvimento web ágil com Python
Django - Desenvolvimento web ágil com PythonDjango - Desenvolvimento web ágil com Python
Django - Desenvolvimento web ágil com Python
 
Palestra TDD Javou! #08 2016
Palestra TDD Javou! #08 2016Palestra TDD Javou! #08 2016
Palestra TDD Javou! #08 2016
 
TypeScript - Campus party 2013
TypeScript - Campus party 2013TypeScript - Campus party 2013
TypeScript - Campus party 2013
 
Palestra TDD - TDC - 2016
Palestra TDD - TDC - 2016Palestra TDD - TDC - 2016
Palestra TDD - TDC - 2016
 

Más de Stefan Teixeira

Scrum Gathering Portugal 2016 - Containerizing Tests with Docker
Scrum Gathering Portugal 2016 - Containerizing Tests with DockerScrum Gathering Portugal 2016 - Containerizing Tests with Docker
Scrum Gathering Portugal 2016 - Containerizing Tests with DockerStefan Teixeira
 
Agile Brazil 2016 - 5 fundamentos essenciais de padrões xUnit
Agile Brazil 2016 - 5 fundamentos essenciais de padrões xUnitAgile Brazil 2016 - 5 fundamentos essenciais de padrões xUnit
Agile Brazil 2016 - 5 fundamentos essenciais de padrões xUnitStefan Teixeira
 
Latinoware 2016 - Continuous Delivery com ferramentas open source
Latinoware 2016 - Continuous Delivery com ferramentas open sourceLatinoware 2016 - Continuous Delivery com ferramentas open source
Latinoware 2016 - Continuous Delivery com ferramentas open sourceStefan Teixeira
 
Ágiles 2016 - Using open source tools to support Continuous Delivery
Ágiles 2016 - Using open source tools to support Continuous DeliveryÁgiles 2016 - Using open source tools to support Continuous Delivery
Ágiles 2016 - Using open source tools to support Continuous DeliveryStefan Teixeira
 
6º Encontro do Grupo de Testes Carioca - Testes em um contexto de Continuous ...
6º Encontro do Grupo de Testes Carioca - Testes em um contexto de Continuous ...6º Encontro do Grupo de Testes Carioca - Testes em um contexto de Continuous ...
6º Encontro do Grupo de Testes Carioca - Testes em um contexto de Continuous ...Stefan Teixeira
 
TDC 2016 SP - Desmistificando cobertura de código como métrica de qualidade
TDC 2016 SP - Desmistificando cobertura de código como métrica de qualidadeTDC 2016 SP - Desmistificando cobertura de código como métrica de qualidade
TDC 2016 SP - Desmistificando cobertura de código como métrica de qualidadeStefan Teixeira
 
TDC 2016 SP - Continuous Delivery para aplicações Java com ferramentas open-s...
TDC 2016 SP - Continuous Delivery para aplicações Java com ferramentas open-s...TDC 2016 SP - Continuous Delivery para aplicações Java com ferramentas open-s...
TDC 2016 SP - Continuous Delivery para aplicações Java com ferramentas open-s...Stefan Teixeira
 
TDC 2016 SP - 5 libs de teste JavaScript que você deveria conhecer
TDC 2016 SP - 5 libs de teste JavaScript que você deveria conhecerTDC 2016 SP - 5 libs de teste JavaScript que você deveria conhecer
TDC 2016 SP - 5 libs de teste JavaScript que você deveria conhecerStefan Teixeira
 
TDC 2016 SP - Cobertura de código de procedures T-SQL com SQLCC
TDC 2016 SP - Cobertura de código de procedures T-SQL com SQLCCTDC 2016 SP - Cobertura de código de procedures T-SQL com SQLCC
TDC 2016 SP - Cobertura de código de procedures T-SQL com SQLCCStefan Teixeira
 
Scrum Gathering Rio 2016 - Conteinerizando Testes com Docker Compose
Scrum Gathering Rio 2016 - Conteinerizando Testes com Docker ComposeScrum Gathering Rio 2016 - Conteinerizando Testes com Docker Compose
Scrum Gathering Rio 2016 - Conteinerizando Testes com Docker ComposeStefan Teixeira
 
Minas Testing Conference 2016 - Testes de Carga com Locust
Minas Testing Conference 2016 - Testes de Carga com LocustMinas Testing Conference 2016 - Testes de Carga com Locust
Minas Testing Conference 2016 - Testes de Carga com LocustStefan Teixeira
 
4º Encontro do Grupo de Testes Carioca - Testes de Carga com Locust
4º Encontro do Grupo de Testes Carioca - Testes de Carga com Locust4º Encontro do Grupo de Testes Carioca - Testes de Carga com Locust
4º Encontro do Grupo de Testes Carioca - Testes de Carga com LocustStefan Teixeira
 
Meetup DevOps Carioca - Testes de Carga com Locust
Meetup DevOps Carioca - Testes de Carga com LocustMeetup DevOps Carioca - Testes de Carga com Locust
Meetup DevOps Carioca - Testes de Carga com LocustStefan Teixeira
 
TDC 2016 Floripa - Criando APIs REST em minutos com Spark + Java 8
TDC 2016 Floripa - Criando APIs REST em minutos com Spark + Java 8TDC 2016 Floripa - Criando APIs REST em minutos com Spark + Java 8
TDC 2016 Floripa - Criando APIs REST em minutos com Spark + Java 8Stefan Teixeira
 
TDC 2016 Floripa - Aprendendo Docker sem bruxaria
TDC 2016 Floripa - Aprendendo Docker sem bruxariaTDC 2016 Floripa - Aprendendo Docker sem bruxaria
TDC 2016 Floripa - Aprendendo Docker sem bruxariaStefan Teixeira
 
TDC 2016 Floripa - Testando APIs REST com Supertest e Promises
TDC 2016 Floripa - Testando APIs REST com Supertest e PromisesTDC 2016 Floripa - Testando APIs REST com Supertest e Promises
TDC 2016 Floripa - Testando APIs REST com Supertest e PromisesStefan Teixeira
 
Agile Testers Conference 2016 - GoCD + Docker + Docker Compose: uma história ...
Agile Testers Conference 2016 - GoCD + Docker + Docker Compose: uma história ...Agile Testers Conference 2016 - GoCD + Docker + Docker Compose: uma história ...
Agile Testers Conference 2016 - GoCD + Docker + Docker Compose: uma história ...Stefan Teixeira
 
VR Dev Summit 2016 - Primeiros Passos em Automação de Testes
VR Dev Summit 2016 - Primeiros Passos em Automação de TestesVR Dev Summit 2016 - Primeiros Passos em Automação de Testes
VR Dev Summit 2016 - Primeiros Passos em Automação de TestesStefan Teixeira
 
Meetup DevOps Carioca - GoCD + Docker + Docker Compose: uma história de amor
Meetup DevOps Carioca - GoCD + Docker + Docker Compose: uma história de amorMeetup DevOps Carioca - GoCD + Docker + Docker Compose: uma história de amor
Meetup DevOps Carioca - GoCD + Docker + Docker Compose: uma história de amorStefan Teixeira
 
Meetup AngularJS Rio - Testes e2e para apps AngularJS com Protractor
Meetup AngularJS Rio - Testes e2e para apps AngularJS com ProtractorMeetup AngularJS Rio - Testes e2e para apps AngularJS com Protractor
Meetup AngularJS Rio - Testes e2e para apps AngularJS com ProtractorStefan Teixeira
 

Más de Stefan Teixeira (20)

Scrum Gathering Portugal 2016 - Containerizing Tests with Docker
Scrum Gathering Portugal 2016 - Containerizing Tests with DockerScrum Gathering Portugal 2016 - Containerizing Tests with Docker
Scrum Gathering Portugal 2016 - Containerizing Tests with Docker
 
Agile Brazil 2016 - 5 fundamentos essenciais de padrões xUnit
Agile Brazil 2016 - 5 fundamentos essenciais de padrões xUnitAgile Brazil 2016 - 5 fundamentos essenciais de padrões xUnit
Agile Brazil 2016 - 5 fundamentos essenciais de padrões xUnit
 
Latinoware 2016 - Continuous Delivery com ferramentas open source
Latinoware 2016 - Continuous Delivery com ferramentas open sourceLatinoware 2016 - Continuous Delivery com ferramentas open source
Latinoware 2016 - Continuous Delivery com ferramentas open source
 
Ágiles 2016 - Using open source tools to support Continuous Delivery
Ágiles 2016 - Using open source tools to support Continuous DeliveryÁgiles 2016 - Using open source tools to support Continuous Delivery
Ágiles 2016 - Using open source tools to support Continuous Delivery
 
6º Encontro do Grupo de Testes Carioca - Testes em um contexto de Continuous ...
6º Encontro do Grupo de Testes Carioca - Testes em um contexto de Continuous ...6º Encontro do Grupo de Testes Carioca - Testes em um contexto de Continuous ...
6º Encontro do Grupo de Testes Carioca - Testes em um contexto de Continuous ...
 
TDC 2016 SP - Desmistificando cobertura de código como métrica de qualidade
TDC 2016 SP - Desmistificando cobertura de código como métrica de qualidadeTDC 2016 SP - Desmistificando cobertura de código como métrica de qualidade
TDC 2016 SP - Desmistificando cobertura de código como métrica de qualidade
 
TDC 2016 SP - Continuous Delivery para aplicações Java com ferramentas open-s...
TDC 2016 SP - Continuous Delivery para aplicações Java com ferramentas open-s...TDC 2016 SP - Continuous Delivery para aplicações Java com ferramentas open-s...
TDC 2016 SP - Continuous Delivery para aplicações Java com ferramentas open-s...
 
TDC 2016 SP - 5 libs de teste JavaScript que você deveria conhecer
TDC 2016 SP - 5 libs de teste JavaScript que você deveria conhecerTDC 2016 SP - 5 libs de teste JavaScript que você deveria conhecer
TDC 2016 SP - 5 libs de teste JavaScript que você deveria conhecer
 
TDC 2016 SP - Cobertura de código de procedures T-SQL com SQLCC
TDC 2016 SP - Cobertura de código de procedures T-SQL com SQLCCTDC 2016 SP - Cobertura de código de procedures T-SQL com SQLCC
TDC 2016 SP - Cobertura de código de procedures T-SQL com SQLCC
 
Scrum Gathering Rio 2016 - Conteinerizando Testes com Docker Compose
Scrum Gathering Rio 2016 - Conteinerizando Testes com Docker ComposeScrum Gathering Rio 2016 - Conteinerizando Testes com Docker Compose
Scrum Gathering Rio 2016 - Conteinerizando Testes com Docker Compose
 
Minas Testing Conference 2016 - Testes de Carga com Locust
Minas Testing Conference 2016 - Testes de Carga com LocustMinas Testing Conference 2016 - Testes de Carga com Locust
Minas Testing Conference 2016 - Testes de Carga com Locust
 
4º Encontro do Grupo de Testes Carioca - Testes de Carga com Locust
4º Encontro do Grupo de Testes Carioca - Testes de Carga com Locust4º Encontro do Grupo de Testes Carioca - Testes de Carga com Locust
4º Encontro do Grupo de Testes Carioca - Testes de Carga com Locust
 
Meetup DevOps Carioca - Testes de Carga com Locust
Meetup DevOps Carioca - Testes de Carga com LocustMeetup DevOps Carioca - Testes de Carga com Locust
Meetup DevOps Carioca - Testes de Carga com Locust
 
TDC 2016 Floripa - Criando APIs REST em minutos com Spark + Java 8
TDC 2016 Floripa - Criando APIs REST em minutos com Spark + Java 8TDC 2016 Floripa - Criando APIs REST em minutos com Spark + Java 8
TDC 2016 Floripa - Criando APIs REST em minutos com Spark + Java 8
 
TDC 2016 Floripa - Aprendendo Docker sem bruxaria
TDC 2016 Floripa - Aprendendo Docker sem bruxariaTDC 2016 Floripa - Aprendendo Docker sem bruxaria
TDC 2016 Floripa - Aprendendo Docker sem bruxaria
 
TDC 2016 Floripa - Testando APIs REST com Supertest e Promises
TDC 2016 Floripa - Testando APIs REST com Supertest e PromisesTDC 2016 Floripa - Testando APIs REST com Supertest e Promises
TDC 2016 Floripa - Testando APIs REST com Supertest e Promises
 
Agile Testers Conference 2016 - GoCD + Docker + Docker Compose: uma história ...
Agile Testers Conference 2016 - GoCD + Docker + Docker Compose: uma história ...Agile Testers Conference 2016 - GoCD + Docker + Docker Compose: uma história ...
Agile Testers Conference 2016 - GoCD + Docker + Docker Compose: uma história ...
 
VR Dev Summit 2016 - Primeiros Passos em Automação de Testes
VR Dev Summit 2016 - Primeiros Passos em Automação de TestesVR Dev Summit 2016 - Primeiros Passos em Automação de Testes
VR Dev Summit 2016 - Primeiros Passos em Automação de Testes
 
Meetup DevOps Carioca - GoCD + Docker + Docker Compose: uma história de amor
Meetup DevOps Carioca - GoCD + Docker + Docker Compose: uma história de amorMeetup DevOps Carioca - GoCD + Docker + Docker Compose: uma história de amor
Meetup DevOps Carioca - GoCD + Docker + Docker Compose: uma história de amor
 
Meetup AngularJS Rio - Testes e2e para apps AngularJS com Protractor
Meetup AngularJS Rio - Testes e2e para apps AngularJS com ProtractorMeetup AngularJS Rio - Testes e2e para apps AngularJS com Protractor
Meetup AngularJS Rio - Testes e2e para apps AngularJS com Protractor
 

Último

ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx2m Assessoria
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx2m Assessoria
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx2m Assessoria
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploDanilo Pinotti
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx2m Assessoria
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsDanilo Pinotti
 

Último (6)

ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 

TDC 2014 POA - Clean Code para Testers

  • 1. Clean Code para Testers Globalcode – Open4education Stefan Teixeira stefanfk@gmail.com / stefanteixeira.com.br
  • 2. Sobre o palestrante Stefan Teixeira! • QA Engineer! • Bacharel em Ciência da Computação pela UFRJ! • Finalizando MBA em Garantia de Qualidade de Software pela Escola Politécnica da UFRJ! • Mantém um blog técnico sobre testes: stefanteixeira.com.br! • Certificado CTAL-TM / TA pelo ISQTB e CPRE-FL pelo IREB! Contatos:! • E-mail: stefanfk@gmail.com! • Twitter: twitter.com/stefan_teixeira! • Facebook: facebook.com/stefan.teixeira! • LinkedIn: linkedin.com/in/stefanteixeira! • GitHub: github.com/stefanteixeira! • SlideShare: slideshare.net/stefanteixeira
  • 4.
  • 5. Quando comecei a ler o livro
  • 8.
  • 9. O custo de código ruim
  • 10. O que é Clean Code?
  • 11. ! ! ! ! “I like my code to be elegant and efficient. Clean code does one thing well.”! Bjarne Stroustrup, criador do C++
  • 12. ! ! ! ! “Clean code always looks like it was written by someone who cares.”! Michael Feathers, criador do livro “Working Effectively with Legacy Code"
  • 13. ! ! ! ! “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
  • 14. The Boy Scout Rule! “Leave the campground cleaner than you found it."
  • 15. 6 pontos sobre Clean Code importantes para um tester
  • 17. 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;
  • 18. 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() );
  • 19. 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
  • 21. Não crie classes Megazord!!
  • 22. 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.”! !
  • 23. SRP (Single Responsibility Principle)! ! ! “Uma classe ou módulo deve ter um, e apenas um, motivo para mudar."! !
  • 25. Cuidado com os Zords…!
  • 26. 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.”!
  • 27. 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() !
  • 28. 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 teste! 2) Caso seja, inclui setups e teardowns! 3) Renderiza a página em HTML!
  • 29. 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.
  • 30. 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."
  • 31. 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; }
  • 32. 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(); }
  • 34. ! ! “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.”! ! !
  • 35. 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
  • 36. Comentários BONS! • Aviso sobre consequências! !
  • 37. 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(); }
  • 38. 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(); }
  • 39. Comentários RUINS! • Noise comments (reafirmam o óbvio)! /** * Retorna o nome * @return o nome */ public String getNome() { return nome; }
  • 40. 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. :)
  • 41. Comentários RUINS! • Comentários em HTML
  • 42. Comentários RUINS! • Comentários extensos
  • 44. • 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.
  • 45. • 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!
  • 46. • Indentação! ‣"Without indentation, programs would be virtually unreadable by humans”
  • 48. Era uma vez uma equipe…
  • 49. … que não se importava com a qualidade do código de testes.
  • 50. Com o passar das releases, o custo de manter a suite só aumentava…
  • 51. … até que tiveram que descartar a suite inteira.
  • 52. Moral da História! ! ! ! Código de teste é tão importante quanto código de produção!
  • 53. “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!
  • 55. “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
  • 56. Globalcode – Open4education ! Obrigado!! ! ! Stefan Teixeira! stefanfk@gmail.com! stefanteixeira.com.br! @stefan_teixeira