Pesquisar este blog

quarta-feira, 20 de janeiro de 2016

Testes Unitários com Jasmine+Karma Test Runner


          
Nessa Postagem vamos falar sobre Testes Unitários em JavaScript, hoje em dia é um diferencial o testador conhecer sobre o mesmo, testes unitários não é nenhum bicho papão para o testador temer. Muitas empresas como a google fala da evolução do Quality Assurance para Test Engineering então é bom você aprender porque será o futuro, para saber mais sobre essa palestra leia as referências. 

Em programação procedural, o teste unitário é feito para testar uma unidade isolada ou função individual ou um procedimento separado. Idealmente, cada teste de unidade é independente dos demais, o que possibilita ao programador testar cada módulo isoladamente. 


1.    Escopo dos Testes Realizados


Vamos realizar testes unitários em um Jogo da Velha/ Tic Tac Toe, este foi desenvolvido em JavaScript. Será usando o framework Jasmine/karma Test Runner para desenvolvimento dos testes unitários em JavaScript. 
Com relação a criação dos scripts de testes, serão exatamente 17 testes para cada browser, totalizando 85 testes feitos no todo.
O projeto se limita aos browser Firefox, IE , Chrome , Safari, Opera, o teste foi será rodado nos sistemas Operacionais Windows e Linux, no Linux com limitação de browser (Firefox, Chrome, PhantomJS). 
Além de fazer os testes Unitários vamos corrigir os bugs do Jogo.

2.    Testes Manuais:

Para realização dos testes manuais foram feitos a cobertura dos testes utilizando o plugin firebug no browser Firefox, e no Chrome o seu próprio editor interno.

Bug 01 - Ao abrir o Jogo no Firefox o mesmo não estar funcionado corretamente, esta dizendo que eu já selecionei o campo, mas o campo está vazio.

Bug 02 - Quando inicio um novo jogo ele diz nada, por padrão deveria mostrar uma mensagem que o jogo foi iniciado.

Bug 03 - Ao testar o jogo no browser Google Chrome e Safari esta informando o ganhador errado.

Bug 04 - Quando eu desativo o javascript, ele para de funcionar, deve estar claro para o usuário que o mesmo deve estar ativado para funcionamento do jogo.

   Bug 05 UX/UI  - Pra melhorar a usabilidade do jogo deve ser colocada cores diferentes para cada jogador, assim melhorando a usabilidade do mesmo.

Bug 06 UX/UI - Para ficar mais interessante o jogo foi colocado um Score/Placar e um reset de Score/Placar.



Figura 01 - Quando os valores dos campos estão como undefined, ele exibe a mensagem que o usuário já ganhou “The winner is” e o nome do jogador.

3.    Lógica e cobertura dos testes:


Para o sucesso dos Scripts de Testes, deve se entender bem a lógica do jogo, antes de realizar a automação.

 Foram realizados 17 jogadas, essas 17 jogadas cobre todos os loops do código fonte implementado, em casa desenhei um quadro com o jogo da velha, e cada campo uma numeração  ce11, tanto que mudei isso no código para ficar como variável global:

ce11 = '', ce12 = '', ce13 = '',ce21 = '', ce22 = '', ce23 = '', ce31 = '', ce32 = '', ce33 = '';

A figura abaixo mostra muito bem o que fiz, são oito linhas, são necessárias somente uma jogada certa para cobrir um loop de código, como assim [ "X","X","X","O","O","","","","","X" ]  é uma jogada na figura seria 3,2,3, isso quer dizer que X ganhou o jogo, a jogada de O , O não vai ser analisada pelo código, não importa a ordem da jogada, mesmo que a jogada seja de O ou X, a análise do código vai ser a mesma, ele vai entrar no primeiro loop do código:

if (((ce11 !== '') && (ce12 !== '') && (ce13 !== '') && (ce11 == ce12) && (ce12 == ce13)) ||

Primeiro ele verifica se os três primeiros campos estão vazios, e segundo se os três campo são iguais, e mostra a mensagem pro usuário X, por isso tem aquele X no final dos testes, representa o usuário que fez a jogada, concluindo basta um teste para cada loop feito no código. Beleza e quando o usuário não entra em nenhum loop?

Bom isso é simples  a jogada representa assim:

[ "X","X","O","O","","","","","","X" ]

X fez duas jogadas e O fez duas jogadas, e quem esta jogando é X.
Coloquei no código a mensagem "Continue game!", ele não faz nada continua a jogada no jogo, não importa a quantidade de vezes diferentes sempre vai entrar em Continue game, então você precisa somente de um único teste para representar isso!

E por último seria a jogada que não houve ganhador:

 ("X","O","X","O","X","X","O","X","O","X")).toEqual("There wasn't winner");

Representado pelo testes acima, basta um único teste para cobrir esse laço de código, são totalmente desnecessário realizar diversos testes, sendo que um único já basta.  


Para pessoas críticas quem me garante que você falou esta certo?
Para isso usei o karma-coverage é um plugin que analisa a cobertura do código realizado.


Como o código implementado seria exibido na página HTML, sem precisa criar um arquivo separado?

Respondendo essa questão, a melhor forma seria criar uma classe pra fazer a chamada das funções e referenciar o html para a classe, não foi implementado isso, mas fica a dica aqui, para melhorar o código feito.




Figura 02 - karma-coverage



Figura 03- Foi baseado nesta figura a quantidade de possibilidades de ganhar o jogo, que é a mesma do código.

4.    Testes Unitários/Unit Test:

 As figuras abaixo mostra o resultado dos testes realizados, em dois ambientes diferentes Linux e Windows.


Na figura 04 - Mostra os testes realizados no Linux (Mint), foram removidos os browsers que não são padrões como IE, Safari, Opera, no entanto foi adicionado um novo browser PhantomJS. O teste falho foi adicionado de propósito, para mostrar  o resultado com falha. 


Rodando os testes via Jasmine sem o Karma Test Runner, temos o seguinte relatório:




       Para concluir o Jasmine é uma ferramenta muito poderosa, além de fazer os testes unitário podemos executar os Testes na camada de UI com o Protractor, assim podemos ter uma solução completa. Nas referências contém tudo que vai precisar sobre os testes unitários em JavaScript, compartilhei o projeto para a comunidade de testadores saber mais sobre o assunto. Bom espero que tenham gostado, ser um bom testador é sempre ir mais além.


Referências:

Para Aprendizado sobre JavaScript, segue um curso online no YouTube:
Curso JavaScript - Introdução #01

Download da documentação e do jogo da velha com os testes unitários: 
https://www.dropbox.com/sh/jfhxudslfpasvhu/AAAn2mLvnNN4GdLov19moGPUa?dl=0

Palestra sobre Test Engineering da google:
GTAC 2013 Keynote: Evolution from Quality Assurance to Test Engineering

Jasmine:
http://jasmine.github.io/2.4/introduction.html

Karma Test Runner:
https://karma-runner.github.io/0.13/index.html


segunda-feira, 11 de janeiro de 2016

6 Bugs em páginas de Upload de arquivos


Cinco Bugs em páginas de Upload6 Bugs em páginas de Upload

    1. Eu estava fazendo upload de arquivo no site do agiletesters e encontrei um Bug no NodeBB, não conseguia fazer o upload do arquivo. Analisando o problema vi que quando exportei a apresentação que fiz pra imagem, ele gerou a extensão com letra maiúscula.
    O NodeBB não foi capaz de notar isso, provavelmente o programador quando fez a função deixou em lowercase a validação, a melhor forma é você converter tudo que vem pra lowercase ou seja letras minúscula. Isso é bem comum de acontecer esse tipo de problema nas aplicações, o programador com pressa deixa a validação em lowercase ou uppercase, esquecendo de validar os dois na sua validação. Fica aqui essa dica para conhecimento dos testadores.

   Caso vocês tenham dúvida que seja um erro, leia sobre o desenvolvimento de uma página de upload abaixo:

   No código apresentado na  linha 32 ele usou a função strtolower, todo bom programador sabe que tem que converter o código pra lowercase , senão pode dar problema.

Função aonde ele converte o a extensão pra letras minúsculas:
 $extensao = strtolower(end(explode('.', $_FILES['arquivo']['name'])));

http://php.net/manual/pt_BR/function.strtolower.php

  Exemplo real site do Agile Testers.

Alguns testadores leigos vão dizer que isso não é problema, existem muitos programas que converte a extensão pra letras maiúsculas, no meu caso foi o PowerPoint, um programa muito utilizado. Muitos clientes podem reclamar do sistema que não esta fazendo o upload, até você explicar para o cliente isso já deu bastante problema. É claro que não é problema do Agile Testes, que somente adotou o NodeBB, a questão que esta sendo levada aqui é outra.

2. Outro problema das páginas de Upload, é deixar fazer o upload de qualquer extensão sem restrição, nesse caso o NodeBB fez muito bem, como vemos abaixo:


Já vi sites serem invadidos por esse problema, ao fazer o upload de arquivos .php/.jsp/.java, pode ser executados remotamente pelo servidor, tendo acesso a enviar comandos no servidor, abrir portas para conexão, copiar dados, infectar outras máquinas com vírus, ou até mesmo travar o servidor com loops infinitos.

No site do "linha de código" ele desenvolveu um código bem legal, faz esse tipo de validação com um array, ele também poderia ler um arquivo de configuração .properties, sem precisar mexer no código para acrescentar uma nova extensão, caso o cliente venha pedir.

// Array com as extensões permitidas
$_UP['extensoes'] = array('jpg', 'png', 'gif');


Com isso evitamos o problema abaixo:


Um teste que se pode fazer é alterar a extensão da imagem, tentando enganar a aplicação, exemplo:
teste.png.php

3. Terceiro Bug é deixar fazer upload de arquivos muito grandes, sem nenhuma limitação. Isso pode gerar vários problemas de performance no servidor, para evitar essa dor de cabeça futuramente, limite o tamanho dos arquivos de upload. No código do "linha de código" ele fez bem feito, limitou em 2 megabyte.
// Tamanho máximo do arquivo (em Bytes)
$_UP['tamanho'] = 1024 * 1024 * 2; // 2Mb

Teste: Tente fazer upload de um arquivo gigante como 300Mb fora da rede da empresa, tente fazer a aplicação travar.

4. Nosso quarto problema em páginas de upload é caracteres especiais e acentuação, algumas páginas de upload armazena o nome em um banco de dados, se o charset não estiver correto, isso pode gerar algum erro. Uma dica seria converter todo nome para caracteres aplicáveis em entidades html, em PHP se usa a função htmlentities para codificar os caracteres, e você usa a função
html_entity_decode para decodificar os caracteres. Dessa forma não teremos problema.


5. Nosso quinto bug, é um problema simples, de você fazer o upload de uma imagem e ela não esta sendo exibida, geralmente o link ou o caminho esta quebrado, alguns programas geram o caminho dinamicamente e concatena com o nome do arquivo, também pode acontecer de endereço do servidor mudou, ou até mesmo não foi dado a permissão necessária.

Com essas dicas evitamos o problema abaixo (HTTP Error 500):



6. Nosso sexto bug é na verdade uma melhoria de Usabilidade, muitas páginas de Upload você consegue baixar um arquivo por vez, acho muito chato como usuário, fazer o upload de uma imagem por vez, perco muito tempo nesse processo, podemos melhorar isso, aumentando o número de upload, mas temos que limitar esse número por problemas de performance, 4 imagens/arquivos por vez seria uma maravilha.

Espero que com esses dicas você venha pegar inúmeros bugs, e ajudar a melhorar os sistemas Web. Bom espero ter ajudado a comunidade de testadores! Se tiver alguma dúvida deixe um comentário, ela será bem respondida.


http://www.w3schools.com/php/func_string_html_entity_decode.asp
http://www.w3schools.com/php/func_string_htmlentities.asp

domingo, 27 de dezembro de 2015

Mudando o nome do computador na rede (hostname) no Linux


Para mudarmos o nome do computador (hostname) no linux, vamos usar o comando abaixo, mas primeiro abra o Shell ou Terminal do Linux:
gksudo gedit /etc/hostname
Após editar o nome, salve o arquivo e feche o gedit.
Vamos reiniciar a maquina para não ter nenhum conflito com algum serviço:
reboot
Para confirmar a mudança usamos o comando abaixo:
hostname

gksudo -> Dar permissão de admin no modo gráfico.
gedit -> Editor texto padrão de algumas distros.
/etc/hostname -> Arquivo que contém o hostname.


Hostname é nome que é dado ao computador, ele serve para que possamos identificar uma maquina na rede, com mais facilidade que um número de IP.


Indo um pouco além agora, quero ver todos os hostnames da rede e seus ip's:

sudo nmap -T4 -A 192.168.100.0-255 | grep -E -i -w 'name|Nmap scan report'

192.168.100.0-255 - > É um range de 0 a 255 de uma rede, veja a sua com ifconfig e mude o valor.
grep -E -i -w 'name|Nmap scan report' > O grep vai me mostrar na tela somente a linha que contém a palavra "name" e "Nmap scan report".
nmap -> É um software que realiza port scan, para instalar use o comando "sudo apt-get install nmap".

http://askubuntu.com/questions/425620/sudo-gksudo-kdesudo-and-their-differences