Automação de testes desktop em C#

QualidadeBR
Site Admin
MensagensCOLON 8
Registrado emCOLON Dom Dez 10, 2017 12:53 pm

Automação de testes desktop em C#

Mensagem por QualidadeBR » Dom Dez 10, 2017 1:03 pm

[INTRODUÇÃO]
Boa tarde, pessoal.

Há algum tempo atrás, depois de um tempo fora da área de qualidade, devido à outro projeto (e-commerce), resolvi voltar para a área e me surgiu a oportunidade em uma empresa que trabalha com um aplicativo desktop desenvolvido em C#.

Minha experiência na área de automação era restrita à parte Web, utilizando Python e Selenium. Mas topei o desafio.

A empresa não tinha nada automatizado, então no começo "perdi" muito tempo aprendendo sobre o produto, montando o ambiente de teste e estudando sobre qual rumo deveria tomar.

A maior dificuldade que tenho (e ainda tive) foi que encontrei muito, mas muito pouca informação relacionada à testes desktop. Então estou escrevendo para tentar contribuir com o pouco que aprendi nesse tempo e também para podermos debater, afinal sei que ainda tenho muito a aprender também.

No início até tentei algo com o Python mesmo, que já era a linguagem na qual eu estava habituado e cheguei ao PyWinAuto.

Acontece que essa opção não foi tão acertada, pois a sintaxe com o PyWinAuto não seria tão simples como a sintaxe de um Python "puro", ou com o Selenium, propriamente dita. Isso é algo importante de frisar, pois como a empresa não tem nenhum teste automatizado, é fácil de identificar outra dificuldade: os testadores (agora amigos de trabalho), não tem conhecimento/experiência com automação, então o ideal seria simplificar essa parte de automação ao máximo para motivá-los e com isso, amadurecer o processo de qualidade como um todo.

Com isso, voltei à estaca zero e voltei a estudar para tentar achar uma opção às diversas dúvidas que pairavam.

Me deparei com um artigo do Fernando Pimentel (http://agiletesters.com.br/topic/1077/w ... m-selenium), no qual ele dizia passar por situação semelhante e que "seguindo as boas práticas onde o QA deve falar a mesma língua da equipe[...]".

Ao ler isso, somado com a dificuldade encontrada no Python, resolvi migrar para o C#, já que é a linguagem adotada na empresa e com isso, teria o apoio da equipe de desenvolvimento.
[/INTRODUÇÃO]

QualidadeBR
Site Admin
MensagensCOLON 8
Registrado emCOLON Dom Dez 10, 2017 12:53 pm

Re: Automação de testes desktop em C#

Mensagem por QualidadeBR » Dom Dez 10, 2017 1:07 pm

O próprio Visual Studio, possui uma ferramenta própria para criação de testes, um gravador de passos.

Para utilizar o recurso, é necessário que o VS seja instalado com a opção "Teste de IU codificado", disponível na guia "Componentes individuais". Nota: Tomando como referência o Visual Studio Enterprise 2017. Veja a imagem abaixo para exemplificação:
componentes individuais.png
componentes individuais.png (50.67 KiB) Exibido 116 vezes


Para utilizar essa ferramenta, basta iniciar o Visual Studio, criar um novo projeto e escolher conforme mostrado abaixo:

novo projeto.png
novo projeto.png (29.96 KiB) Exibido 116 vezes

Após isso, vá até o gerenciador de soluções e crie um novo teste de interface do usuário codificado:
novo teste.png
novo teste.png (56.35 KiB) Exibido 116 vezes

QualidadeBR
Site Admin
MensagensCOLON 8
Registrado emCOLON Dom Dez 10, 2017 12:53 pm

Re: Automação de testes desktop em C#

Mensagem por QualidadeBR » Dom Dez 10, 2017 1:09 pm

gravar.png
gravar.png (13.32 KiB) Exibido 116 vezes
Se tudo correr bem, aparecerá no canto inferior direito da sua tela, o UIMap, conforme imagem:

uimap.png
uimap.png (2.63 KiB) Exibido 116 vezes

Para usá-lo é bem simples, basta apertar no botão vermelho (Iniciar gravação).
Depois, basta fazer as ações que deseja que sejam reproduzidas e ao terminar, clique novamente no botão, o qual estará azul.

Após isso, clique no último botão, com uma seta e 4 linhas, para que possa gerar um método com as ações gravadas e escolha um nome para o método.

Dentro do arquivo que você criou, haverá uma chamada ao método que acaba de ser criado:
thisuimap.png
thisuimap.png (18.61 KiB) Exibido 116 vezes

Para executar o teste, basta clicar com o botão direito sobre o código do arquivo e escolher a opção "Executar Testes":
executar testes.png
executar testes.png (33.49 KiB) Exibido 116 vezes

No canto esquerdo do Visual Studio aparecerá a janela "Gerenciador de Testes", onde mostrará quais testes já foram executados, divididos pelos que foram aprovados e os que tiveram falha, além dos que ainda não foram executados.
(Caso a janela não apareça, clique em: Testar >> Janelas >> Gerenciador de Testes)

QualidadeBR
Site Admin
MensagensCOLON 8
Registrado emCOLON Dom Dez 10, 2017 12:53 pm

Re: Automação de testes desktop em C#

Mensagem por QualidadeBR » Dom Dez 10, 2017 1:11 pm

Em relação ao Construtor de Testes do Visual Studio:


É uma ferramenta muito inteligente, pois consegue reproduzir passos previamente gravados através de teclado e mouse.

Comecei a utilizá-lo, devido à sua facilidade (o seu ponto forte, não é necessário conhecer nada de programação para conseguir criar tarefas automatizadas).

Mas desisti logo em seguida por alguns motivos:

1) A forma como o código é criado e mantido: Ele cria um código um tanto quanto complexo e é bem chato de editá-lo, pois praticamente tudo está dentro do arquivo UIMap.Designer.cs e o mesmo não pode ser editado (o VS não salva as informações que você insere manualmente no seu arquivo - na verdade até salva, mas qualquer alteração que seja necessário nesse arquivo, ele irá apagar o que não foi inserido por ele).

Tive um problema com uma máquina virtual que corrompeu e precisei recuperar um backup de outra máquina, até para conseguir fazer a junção do código presente nos UIMap.Designer.cs de ambas as máquinas foi difícil (tive que baixar uma extensão do VS que faz apenas isso).

2) Validação do teste: Como é um teste criado de maneira automática e devido ao citado no item 1, ficou bem difícil validar o teste.

3) Manipular dados dinâmicos: A ferramenta é instruída a interagir de forma estática. Por exemplo: Se em uma lista de 3 nomes (Joao, Maria e Jose), você clicar na primeira posição (Joao), ele sempre irá procurar pela palavra "Joao" para clicar. Muitas vezes eu preciso clicar não em um dado específico e sim em uma determinada posição de uma lista.
Isso é apenas um exemplo e para ser sincero não fui a fundo na busca de como manipular dados dinâmicos na ferramenta, mas isso me motivou a não continuar o uso da ferramenta

4) Falta de conteúdo disponível pela comunidade: Emendando o assunto do item 3, toda informação que eu precisava, em português era quase impossível e, mesmo no inglês, o conteúdo encontrado era muito restrito ao básico. Pode ser que eu tenha tirado conclusões precipitadas, mas acredito que se a ferramenta fosse realmente eficiente, teríamos uma comunidade muito maior utilizando-a e trocando informações internet a fora.

5) Tempo de execução dos testes: Isso aqui foi o crucial para eu abandonar a ferramenta: O tempo de execução era muito instável, mas na maioria das vezes era bem alto. Para uma bateria de testes pequena, pode ser que não influencie tanto. Mas no nosso caso, onde inicialmente serão mais de 400 testes, alguns bem complexos, isso poderia inclusive determinar se o investimento em testes automatizados seria viável ou não.

Vou falar sobre o Winium mais pra frente, mas para se ter noção, fiz 2 testes com os mesmos passos, um com o Construtor de Testes e outro com o Winium. O primeiro demorou 3min08s, enquanto o segundo demorou 51s. Imagine essa diferença multiplicada por 400! :o

QualidadeBR
Site Admin
MensagensCOLON 8
Registrado emCOLON Dom Dez 10, 2017 12:53 pm

Re: Automação de testes desktop em C#

Mensagem por QualidadeBR » Dom Dez 10, 2017 1:11 pm

Pela experiência anterior não ter sido a melhor possível, decidi testar o Winium (de começo tinha evitado um pouco pois achei meio trabalhoso o uso de um driver que precisava ser inicializado para "emular" o uso do Selenium).

O meu ponto de partida foi um artigo do Fernando Pimentel, no Agile Testers (http://agiletesters.com.br/topic/1077/w ... m-selenium). Como o artigo em si é bem esclarecedor, vou replicar seu conteúdo aqui:
De repente me deparo com um cenário diferente, novo emprego cheio de desafios e oportunidades. Ocasião de exercer e executar minha maior paixão que é a de automatizar testes.

Primeiro desafio, nos últimos 8 anos trabalhei com equipes de desenvolvedores Java, eis que minha nova equipe só possui Dev’s C#. Então seguindo as boas práticas onde o QA deve falar a mesma língua da equipe vamos aprender Selenium com C#! Mas isso é assunto pra um próximo artigo.

O Desafio que vou compartilhar aqui é a necessidade de automatizar para aplicações Desktop. Pesquisei e encontrei ferramentas bem interessantes como Autoit, Sikuli…

Mas será que não dá pra automatizar desktop usando o glorioso Selenium?

Foi ai que conheci o Winium Uma ferramenta Open Source mantida pela 2GIS para automação de aplicativos desktop. Que veio oferecer através do seu Driver suporte para aplicações Windows. Com ela podemos escrever testes em qualquer linguagem de programação que seja suportada pelo Webdriver e ela oferece suporte para Aplicativos do Windows Desktop (WPF, WinForms) entre outros como aplicação mobile para Windowsphone.

Neste Post, estarei mostrando como automatizar uma operação simples na calculadora do Windows.
Primeiro vamos fazer o download do Winium Driver,
https://github.com/2gis/Winium.Desktop/releases
É necessário também o uso de uma ferramenta que nos apontará qual Locator (elementos da tela) que deveremos usar nos testes com Selenium. Testei 3 ferramentas, o

Finder tools do AutoIt ( https://www.autoitscript.com/site/autoi ... downloads/ ),

Visual UI Automation Verify (https://uiautomationverify.codeplex.com/releases )


list item UISpy https://github.com/2gis/Winium.Cruciatu ... ools/UISpy .
Destas ferramentas a que melhor me adaptei foi a UISpy e com ela que iremos trabalhar nesse tutorial.

Mãos a massa!

Crie uma classe de test no Visual studio ;
Crie a propiedade RemoteWebDriver
public RemoteWebDriver Driver { get; set; }

Para iniciar é necessário chamar o navegador do Winium criaremos então o método SetUp assim:

CódigoCOLON Selecionar todos

public void SetUp()
        {
            var dc = new DesiredCapabilities();
            dc.SetCapability("app", @"C:\Windows\System32\calc.exe");
            this.Driver = new RemoteWebDriver(new Uri("http://localhost:9999"), dc);
}
Para o tearDow podemos usar método close do Selenium webdriver.

CódigoCOLON Selecionar todos

[TearDown]
       public void after()
       {
           Driver.Close();
       }
Vamos Agora começar a inspecionar as janelas abertas para isso abra o UISpy;

Imagem
Observe que o UISpy exibe todas as janelas abertas entre elas esta a calculadora , que será o aplicativo que iremos testar.
Navegando na Treeview encontraremos os elementos no painel properties na lateral direita. Para automatizar o teste podemos passar o AutomationID ou o Name.

Imagem

Observe que para o numero “2” o Name é “2” e o AutomationID é “132”.Dessa forma vamos fazer o método de teste somando 2 + 2;

CódigoCOLON Selecionar todos

[Test]
        public void Calcular()
        {

            Driver.FindElement(By.Id("132")).Click();
            Driver.FindElement(By.Id("93")).Click();
            Driver.FindElement(By.Name("2")).Click();
            Driver.FindElement(By.Name("Igual a")).Click();
            Thread.Sleep(2000);
            Assert.AreEqual(true, Driver.FindElement(By.Name("4")).Displayed);
           
            
        }
Para executar o teste é preciso que o driver do Winium esteja rodando, Descompacte o Driver baixado no início deste artigo e execute.
Imagem
Agora é so rodar o teste .
Fernando, se algum dia você ver esse post, fica aqui o meu muito obrigado pelo artigo. Ajudou muito nessa minha nova etapa também!

BUTTON_POST_REPLY