TESTES
AUTOMATIZADOS Manual B sico á
Por Giovano da Cruz Balestra
Sumário
1.INTRODUÇÃO...4
2.O EXT.NET...5
3.HELLO WORLD DO WEBDRIVER SELENIUM...6
4.Colocando a Mão na Massa...7
5.AUTOMAÇÃO USANDO O JENKINS...14
1. INTRODUÇÃO
Esse documento, tem como objetivo, nortear o uso das classes e métodos desenvolvidos pela Equipe 5 e Equipe 6, para realizar testes automatizados usando o webdriver selenium e códigos escritos em C#.
Nesses últimos meses as equipes trabalharam, realizando análises e pesquisas, que motivadas pela busca de excelência no desenvolvimento de software, chegaram aos resultados disponíveis nesse documento. São muitos os métodos e recursos disponíveis pelo Selenium Webdriver+C#, foram realizados vários testes, mas recursos ainda podem ser melhorados, por isso esse documento, pode sofrer alterações com o passar do tempo.
2. 0O EXT.NET
O Ext.net é um dos maiores, problemas encontrados, para realizar testes automatizados no sistema Sigen+, devido ao seu dinamismo, isso mesmo, olhando do lado do programador isso é algo bom, entretanto para o programador de teste, um elemento ter id que muda a cada acesso é uma dor de cabeça enorme, ou ter elementos que ficam escondidos e só aparecem após uma ação de clique ser realizada também, como é o caso das caixas de seleção dentro de células nos grids.
O webdriver selenium, possui uma enorme variedade de funções programadas para varrer os documentos web buscando os elementos solicitados, a forma mais simples e eficaz é realizar a busca através do id, mas existem outras formas, como pelo name, xpath, css, etc.
Algumas vezes a forma convencional não conseguem alcançar os resultados, a solução encontrada foi partir para execução de funções em javascript. Acreditamos ter superado senão todas, a maioria dificuldades com relação ao Ext.net, realizamos testes com componentes que podemos considerar complexos, como por exemplo o componente acordeon, que pode possuir vários grids ou fieldsets, outro bom exemplo são grids que possibilitam o anexo de documentos e fotos conforme demonstrado na imagem e códigos abaixo.
Código usado para inserir as imagens no Grid Fotos da Tela Laudo de Vistoria Final GetController().UploadFile("fuAnexoFoto-file",
System.IO.Directory.GetCurrentDirectory()+"//Anexos//Chrysanthemum.jpg");
Thread.Sleep(2000);
GetController().UploadFile("fuAnexoFoto-file",
System.IO.Directory.GetCurrentDirectory() + "//Anexos//Koala.jpg");
Thread.Sleep(5000);
Figura 1: Grid Fotos da Tela Laudo de Vistoria Final
3. HELLO WORLD DO WEBDRIVER SELENIUM
Nesse capítulo será demonstrado como criar um teste automatizado usando o Selenium Webdriver + C#, o primeiro passo é entender a tela que será testada, um programador de testes tem que saber quais são as funções de cada elemento e o resultado esperado, o webdriver selenium pode testar tanto se o elemento(buttom, input, label, etc.) existe, como também se ele está funcionando normalmente, para isso basta que o teste possua em suas codificações os cliques, verificações e escritas exigidas. Para melhorar a experiência de programação dos testes e que os mesmos estejam o mais próximo do idealizado a equipe sempre gera um plano de testes em paralelo com a criação das telas, conforme imagem abaixo.
Figura 2: Parte de um Plano de teste -Tela Grade de Produtos Fabricados(rotulagem)
4. COLOCANDO A MÃO NA MASSA
Para começar sugerimos uma tela simples onde o usuário precisaria criar, ler, atualizar e deletar determinados registros, o famoso CRUD.
1º Passo – Criar uma pasta com o nome da tela a ser testada
2º Passo – Criar as Classes principais de teste, que para essa tela são três:
CorControler.cs CorTest.cs BVCor.cs
3º Passo – Programar a Classe CorController.cs seguindo os comentários em verde no código.
//Declaração das usings using Sigen.Sigen.Tela;
using Sigen.util;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Sigen.Sigen.Usuario;
using Sigen.Sigen.Cadastro;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Sigen.Base;
using OpenQA.Selenium;
//Criação do namespace namespace Sigen.Inspecao.Cor {
//Criar um classe que herda do CadastroBasico controller class CorController : CadastroBasicoController
{
//Método Construtor
public CorController(Driver.BROWSER browser) : base(browser) {
}
#region CRUD
//Cria um método que testa a criação de um novo registro
public override void Create(BVUsuario usuario, Model.BusinessValue value) {
//Procura um caixa de texto pelo id e insere uma informação dentro dela PutText("nmCodigoDescricao", "Roxa - Teste");
//Clica no botão F10 - Salvar ButtonSave();
//Armazena o numero O id após inserir os registros no bd BVCor cor = (BVCor)value;
int idCor = 0;
if (int.TryParse(GetController().GetValue("idCodigoDescricao"), out idCor)) cor.idCor = idCor;
}
//Cria um método que verifica se os dados salvos retornaram corretamente do banco public override void Read(BVUsuario usuario, Model.BusinessValue value)
{
//Chama o teste para criar um registro Create(usuario, value);
//Chama o teste de pesquisa Search(usuario, value);
//Verifica se o valor Inserido foi o mesmo retornado do Banco
Assert.AreEqual(GetController().GetValue("nmCodigoDescricao"), "Roxa - Teste");
}
//Já esse Método faz a atuliazação da informações salvas anteriormente public override void Update(BVUsuario usuario, Model.BusinessValue value) {
//Chama o teste de pesquisa Search(usuario, value);
//Essa Linha chama o método que procura um caixa de texto pelo id e insere uma informação dentro dela
PutText("nmCodigoDescricao", "Roxa - Teste Alterada");
//Ja essa linha chama a método que clica no botão F10 - Salvar ButtonSave();
}
//No método abaixo realizamos a exclusão do registro após seu cadastro ter sido realizado
public override void Delete(BVUsuario usuario, Model.BusinessValue value) {
//Chama o teste de pesquisa Search(usuario, value);
//Clica no botão delete, aceita a mesagem e verifica se apareceu a mensagem de sucesso da exclusão
ButtonDelete();
} #endregion
//Esse é o metodo que realiza a pesquisa de um registro previamente cadastrado public override void Search(BVUsuario usuario, Model.BusinessValue value) {
//Chama o teste para criar um novo registro Create(usuario, value);
//Busca o id gerado anteriormente BVCor idcor = (BVCor)value;
//Clica do Botão F2 - Pesquisar ButtonSearch();
//insere na caixa de pesquisa por id, a informação PutText("id_codigo_descricao", idcor.idCor.ToString());
//Clica no botão Pesquisar da Windows Pesquisa ButtonSearchWindow();
//Aguarda por 2 segundos, os registros irem pro grid Thread.Sleep(2000);
//Seleciona o último registro cadastrado ExecuteScript(
"var rec = gridSearch.store.getCount();
gridSearch.getSelectionModel().selectRow(rec-1);");
//Clica no botão Selecionar
ButtonSearchWindowSelected();
}
//Usado para definir a URL da tela que irá ser acessada.
public override String Tela() {
return "/DSA.Tabelas/Cor";
}
//Esse metodo não esta sendo utilizado nesse teste
public override void Save(BVUsuario usuario, Model.BusinessValue value) {
} } }
4º Passo – Programar a Classe CorTest.cs
Essa classe é responsável em fazer a comunicação com o programa Vstest.exe, para esse exemplo é preciso do seguinte código.
//Declaração das usings using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Sigen.util;
using OpenQA.Selenium;
using Selenium.login;
using Sigen.Sigen.Tela;
using Sigen.Sigen.Usuario;
using Sigen.Sigen.Cadastro;
using Sigen.Model;
using Sigen.Base;
//Criação do namespace namespace Sigen.Inspecao.Cor
{
//Início da Classe principal de teste [TestClass]
//Recebe por herança as funcionalidades do CodicoDescriçãoTest public class CorTest : CodigoDescricaoTest
{
public CorTest() {
value = new BVCor();
}
//Inicializa o navegador e da o start no teste
protected override BusinessController GetController() {
return new CorController(Driver.BROWSER.CHROME);
}
//Retorna ou envia valores entre os métodos o valor protected override BVTela GetValue()
{
return value;
}}
5º Passo – Programar a Classe BVCor.cs
//Declaração das usings using Sigen.Sigen.Tela;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//Criação do namespace namespace Sigen.Inspecao.Cor {
//Classe herda as funcionalidades do BVTela public class BVCor : BVTela
{
//Métodos de get e set dos elementos a serem armazenados ou consultados na execução dos Testes
public int idCor {get;set;}
} }
6º passo – Executar os Testes
Enquanto o teste é escrito pode ser necessário ir verificando se ele está conseguindo realizar os comandos programados, para isso utilizamos a Windows Test Explorer. A figura abaixo mostra como exibir ou ocultar essa janela.
O resultado com ele estiver aparecendo será a Window exibida na Figura 4.
O funcionamento dessa janela é simples, basta selecionar o teste, clicar no menu Run, teste Figura 3: Acessando a Window Test Explorer
selecionado, ou usar o clique com o botão direito no teste escolher entre o modo Debug ou Run. Pronto após programar e testar seu teste irá ajudá-lo a ter sua aplicação sem precisar repetir os cansativos movimentos de cliques e escrita de textos, uma vez escritos poderá rodar o teste N vezes.
5. AUTOMAÇÃO USANDO O JENKINS
Possuímos, um servidor com o Jenkins instalado, esse sistema serve para agendar serviços e eventos que precisam ser iniciados de forma automática, com um horário pré-agendado. Ele irá servir para realizar a automação de nessa automatização.
Como?
1º Copiara o Trunk diariamente para a base de testes automatizados, via SVN.
2º Realizara o Build dessa cópia.
3º Irá rodar os testes escritos e comitados até o dia anterior.
Quando?
Os teste irão rodar diariamente, as 2:00 hs da manhã, todos os dias da semana.
Esse Ocorrer falhas?
- Caso esses testes apresentem algum problema para ser executados, o próprio jenkins dispara um e-mail para alertar sobre os erros encontrados.
Como tenho acesso?
- Esse sistema já está integrado com o Active Directory, portanto todos poderão ter acesso, usando suas senhas de produção. Pode ser acessado pelo endereço: cnt-gerti-36148:8080.
Figura 4: Tela de Acesso ao Jenkins