Olá povo!
Conforme havia prometido, estou compatilhando a apresentação que eu fiz sobre o livro Agile Testing.
É um resumão dos principais itens que me chamaram atenção.
O que eu achei do livro? É um livro bem interessante, ainda mais se você está começando a trabalhar com metodologias ageis, ou se está pensando em abandonar o método tradional.
Destaques: Achei bem interssante a abordagem de como podemos auxiliar o nosso time a ter qualidade. Muitas vezes o QA está tão focado em fazer seus testes e garantir que haja uma barreira de segurança através dele que esquece que no método ágil todos somos resposáveis pela qualidade. Se os demais integrantes do seu time não estão comprometidos, é seu papel como QA de tentar auxiliá-los a encontrar um caminho. Afinal todos ganham com isso.
O livro também fala de diversas ferramentas de automatização como: selenium, junit, FitNesse, etc., embora esse não seja o seu foco, deixa claro que sem automatização nenhum time ágil resiste(sorry!).
Recomendo a leitura!
segunda-feira, 25 de fevereiro de 2013
quinta-feira, 7 de fevereiro de 2013
Continuação Dojo
Em continuação ao último post, hoje pretendo explicar o código de teste funcional que criei e se adequava ao desafio.
Em primeiro lugar se você pensa em escrever um código de teste legal aprenda o conceito de page objects. Isso ajudará você a economizar muitas linhas de código e facilitará a manutenção dos mesmos.
Iniciei a codificação mapeando os elementos da minha página em um objeto e criando métodos para que a minha classe de teste pudesse acessa-los. Os primeiros objetos mapeados, foram todos os campos do formulário como combos, inputs, buttons, etc. Feito isso já tinha o básico para iniciar a classe de testes.
public class PaginaFormularioCadastro {
private WebDriver driver;
public PaginaFormularioCadastro(WebDriver driver) {
super();
this.driver = driver;
}
public void selecionaPessoaFisica(){
driver.findElement(By.id("legalEntity.F")).click();
}
public void selecionaPessoaJuridica(){
driver.findElement(By.id("legalEntity.J")).click();
}
public void escreveNome(String nome){
driver.findElement(By.id("firstName")).sendKeys(nome);
}
public void escreveUsuario(String usuario){
driver.findElement(By.id("userName")).sendKeys(usuario);
}
public void escreveSenha(String senha){
driver.findElement(By.id("password")).sendKeys(senha);
}
public void reEscreveSenha(String senha){
driver.findElement(By.id("password2")).sendKeys(senha);
}
public void escreveEmail(String email){
driver.findElement(By.id("email")).sendKeys(email);
}
public void queroInfoGrupo(){
driver.findElement(By.id("complement.rbsEmail")).click();
}
public void queroInfoParceirosGrupo(){
driver.findElement(By.id("complement.otherEmail")).click();
}
public void aceitaTermo(){
driver.findElement(By.id("acceptTerms")).click();
}
public void cadastrar(){
driver.findElement(By.cssSelector("input[type=\"submit\"]")).click();
}
}
Antes disso preparei uma classe que conteria as assinaturas @before e @after, que poderão serem usadas por outras classes de teste. Iniciei a classe de teste estendendo a classe que cotei acima.
public class Teste {
protected WebDriver driver;
protected String baseUrl;
private StringBuffer verificationErrors = new StringBuffer();
@Before
public void setUp() throws Exception {
driver = new FirefoxDriver();
baseUrl = "http://zerohora.clicrbs.com.br/wrs/action/update/newUser;jsessionid=ac19071f30d825732ff18c3a4149b3cfc47cf2a125ef.e34RbNaLchqQay0NbhmTc40.22?site=4446";
driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
driver.get(baseUrl);
}
@After
public void tearDown() throws Exception {
driver.quit();
String verificationErrorString = verificationErrors.toString();
if (!"".equals(verificationErrorString)) {
fail(verificationErrorString);
}
}
}
Comecei a chamar os métodos criados no objeto para fazer as simulações. Assim que essa etapa estava concluída e funcionando, precisava das assertivas para garantir que o teste passou, então implementei no objeto, métodos que faziam essas verificações.
Acabei os cenários de teste na minha classe e parti para verificar o funcionamentos. De cara eu sabia que teria problemas para atender aos critérios de aceite do teste devido a estar usando sempre o mesmo nome de usuário para cadastrar, mesmo assim executei o teste apenas modificando esse parâmetro e vi que o teste estava funcionando. Para resolver esse problema criei um objeto chamado usuário com o atributo username.
public class Usuario {
protected String username;
public Usuario(String username) {
super();
this.username = username.replaceAll("[ :]", "");
}
protected String getUsername() {
return username;
}
protected void setUsername(String username) {
this.username = username.replaceAll("[ :]", "");
}
}
O construtor desse atributo pegava a hora e data do sistema, retirava espaços em branco e barras e convertia para string. Cada vez que eu executava o teste ele pegava um timestamp diferente. Resolvido isso meu teste ficou pronto para ser executado várias vezes sem precisar de ajuste a cada execução.
Done? Done!
Em primeiro lugar se você pensa em escrever um código de teste legal aprenda o conceito de page objects. Isso ajudará você a economizar muitas linhas de código e facilitará a manutenção dos mesmos.
Iniciei a codificação mapeando os elementos da minha página em um objeto e criando métodos para que a minha classe de teste pudesse acessa-los. Os primeiros objetos mapeados, foram todos os campos do formulário como combos, inputs, buttons, etc. Feito isso já tinha o básico para iniciar a classe de testes.
public class PaginaFormularioCadastro {
private WebDriver driver;
public PaginaFormularioCadastro(WebDriver driver) {
super();
this.driver = driver;
}
public void selecionaPessoaFisica(){
driver.findElement(By.id("legalEntity.F")).click();
}
public void selecionaPessoaJuridica(){
driver.findElement(By.id("legalEntity.J")).click();
}
public void escreveNome(String nome){
driver.findElement(By.id("firstName")).sendKeys(nome);
}
public void escreveUsuario(String usuario){
driver.findElement(By.id("userName")).sendKeys(usuario);
}
public void escreveSenha(String senha){
driver.findElement(By.id("password")).sendKeys(senha);
}
public void reEscreveSenha(String senha){
driver.findElement(By.id("password2")).sendKeys(senha);
}
public void escreveEmail(String email){
driver.findElement(By.id("email")).sendKeys(email);
}
public void queroInfoGrupo(){
driver.findElement(By.id("complement.rbsEmail")).click();
}
public void queroInfoParceirosGrupo(){
driver.findElement(By.id("complement.otherEmail")).click();
}
public void aceitaTermo(){
driver.findElement(By.id("acceptTerms")).click();
}
public void cadastrar(){
driver.findElement(By.cssSelector("input[type=\"submit\"]")).click();
}
}
public class Teste {
protected WebDriver driver;
protected String baseUrl;
private StringBuffer verificationErrors = new StringBuffer();
@Before
public void setUp() throws Exception {
driver = new FirefoxDriver();
baseUrl = "http://zerohora.clicrbs.com.br/wrs/action/update/newUser;jsessionid=ac19071f30d825732ff18c3a4149b3cfc47cf2a125ef.e34RbNaLchqQay0NbhmTc40.22?site=4446";
driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
driver.get(baseUrl);
}
@After
public void tearDown() throws Exception {
driver.quit();
String verificationErrorString = verificationErrors.toString();
if (!"".equals(verificationErrorString)) {
fail(verificationErrorString);
}
}
}
Comecei a chamar os métodos criados no objeto para fazer as simulações. Assim que essa etapa estava concluída e funcionando, precisava das assertivas para garantir que o teste passou, então implementei no objeto, métodos que faziam essas verificações.
Acabei os cenários de teste na minha classe e parti para verificar o funcionamentos. De cara eu sabia que teria problemas para atender aos critérios de aceite do teste devido a estar usando sempre o mesmo nome de usuário para cadastrar, mesmo assim executei o teste apenas modificando esse parâmetro e vi que o teste estava funcionando. Para resolver esse problema criei um objeto chamado usuário com o atributo username.
public class Usuario {
protected String username;
public Usuario(String username) {
super();
this.username = username.replaceAll("[ :]", "");
}
protected String getUsername() {
return username;
}
protected void setUsername(String username) {
this.username = username.replaceAll("[ :]", "");
}
}
O construtor desse atributo pegava a hora e data do sistema, retirava espaços em branco e barras e convertia para string. Cada vez que eu executava o teste ele pegava um timestamp diferente. Resolvido isso meu teste ficou pronto para ser executado várias vezes sem precisar de ajuste a cada execução.
Done? Done!
Assinar:
Postagens (Atom)