Lição 17 - Atividades:
"Implementação" e "Testes"
"Implementação" e "Testes"
Nesta lição, vamos compreender melhor as atividades que acontecem na terceira etapa de um processo de desenvolvimento de software, que são: "Implementação" e "Testes". A primeira atividade visa à codificação do software. A segunda atividade, por sua vez, pretende verificar se a codificação do software corresponde ao projeto especificado e se o seu comportamento está correto.
Não é fácil implementar e depois testar produtos de software. É algo muito dinâmico, pois os stakeholders (profissionais da organização do cliente que estão envolvidos no projeto) podem alterar sua compreensão sobre as necessidades do projeto, ao longo do processo.
Além disso, as regras de negócios (internas e externas) podem ser complexas e haver necessidade de serem atualizadas, durante o processo de desenvolvimento de software. Sem falar que os recursos tecnológicos (plataforma de software e hardware) têm evoluído rapidamente.
Pode ocorrer, também, de os profissionais das equipes — desenvolvimento e testes de software — não serem os mesmos do início ao fim e, por isso, os novos membros podem não ter domínio sobre o que deve ser desenvolvido/testado, proporcionando dificuldades iniciais no andamento do projeto.
Diante do que foi apresentado, o que pode ser feito para evitar que desencontros de informações ocorram durante o desenvolvimento e os testes de softwares? Uma solução muito importante é seguir padrões e estilos de programação e testes para facilitar todo o processo.
Portanto, nesta lição, compreenderemos os processos de implementação e de testes e, também, a dependência que essas atividades têm sobre o documento gerado pelas atividades anteriores, ou seja, documento de "Elicitação e análise de requisitos" e o documento posterior de "Projeto". Documentos pelos quais você, futuro(a) profissional, será responsável de especificar e, assim, executar um ótimo trabalho. Vamos lá!
O João se formou como Técnico de Desenvolvimento de Sistemas e é analista júnior de sistemas, em uma empresa de informática. Cada vez mais, percebe a importância de realizar testes, durante todo o processo de desenvolvimento de software.
Apesar de pouco tempo de experiência, João já sabe que construir o planejamento de testes é um processo sistemático e que o documento de requisitos é muito importante para que isto ocorra. Ele sabe que deve verificar as dificuldades que o usuário final possa vir a ter ao usar o software, antes que esse seja entregue.
Uma das possibilidades para ocorrência de falhas é quando se dá a entrada incorreta dos dados e, por consequência, o processamento destes dados provoca uma falha. Esta situação, normalmente, acontece quando o sistema não faz validação adequada na entrada dos dados.
Outra possibilidade que o João reconhece é quando o requisito funcional não está bem definido, ou é mal interpretado pelo programador, e a codificação acaba por não ter o comportamento esperado. Isso, normalmente, acontece quando o profissional não conhece todos os recursos e técnicas necessárias para modelar/compreender o documento de requisitos.
João sabe que existem outras possibilidades para que ocorram falhas no produto de software e pretende, pouco a pouco, aprender e, principalmente, aplicar nas suas atividades de analista júnior.
Ele, também, já percebeu que é importante compreender os recursos e técnicas definidos na Engenharia de Requisitos como também se especializar na área de testes para garantir um bom desenvolvimento do produto do software.
A etapa que vamos estudar nesta lição trata-se da "Implementação e Testes", que acontece na terceira etapa do ciclo clássico do Software, conforme apresentado na Figura 1.
As três primeiras atividades do desenvolvimento de software já foram explicadas nas lições anteriores. Vamos, agora, compreender como devem ocorrer as atividades de Implementação e, na sequência, as atividades de Testes.
Procurando no Dicionário Aurélio Júnior, não encontramos o termo implementação, mas sim implementar, descrito como verbo transitivo direto, ele significa: (1) prover de implemento; (2) pôr em prática, dar execução a um (plano, programa ou projeto) (FERREIRA, 2011).
Atualmente, os profissionais da informática, também, utilizam bastante os termos "codificação" e "programação". Veja na Tabela 1, a seguir, o significado destes termos.
Tabela 1 - Significado dos verbos Codificar, Implementar e Programar e seus substantivos
Fonte: adaptada de Ferreira (2011).
#PraCegoVer: a figura representa uma tabela de cor azul claro dividida em duas colunas, trazendo os significados dos verbos Codificar, Implementar e Programar e seus substantivos. Na coluna da esquerda, no topo em azul marinho, lemos "Substantivo" e, na coluna da direita também em azul marinho no topo, lemos "Verbo transitivo direto". Na primeira linha da coluna à esquerda, temos a palavra "Codificação" que corresponde a: Substantivo feminino. Um: ato de codificar, ou o resultado deste ato. Dois: Informática Processamento digital de um conjunto de dados (texto, som, imagem etc.) para adequá-lo a um aplicativo. Na segunda linha, ainda à esquerda, temos a palavra "Programação" seguida da explicação: Substantivo feminino. Um: ato de programar, ou o resultado deste ato. Dois: conjunto de apresentações, ações, eventos etc. Planejados antecipadamente. Três: série de compromissos por atender. Quatro: ciência ou técnica de elaboração de programa de computador. Cinco: conjunto de programas de uma emissora etc. Na segunda coluna, na primeira linha, temos "Codificar" que corresponde a: verbo transitivo direto. Um: reunir em código; Dois: reduzir a código. Na segunda linha desta coluna temos: "Programar" - verbo transitivo direto. Um: fazer o programa de planejar. Dois: prever ou selecionar, como parte de programa ou de programação. Três: Informática. Determinar a forma de funcionamento de (aparelho, computador), fornecendo programa. Intransitivo. Quatro: Informática. Desenvolver, como programador, programa de computador".
Você notou que aparece o termo "Informática" no significado desses termos? Quando eu leciono, sempre, digo aos meus alunos: "Vamos programar? Ou seja, vamos codificar as linhas do programa, as instruções!".
É importante que você perceba que a etapa de implementação (codificação ou programação) faz com que a equipe de desenvolvimento (mais especificamente, o profissional com perfil profissional de programador) procure programar o que foi especificado no projeto. Vamos compreender as atividades que envolvem esta etapa?
Antes de mais nada, preciso que você compreenda o significado destes dois termos:
Linguagem de baixo nível: é composta por '0's ou '1's, que é como o computador compreende.
Linguagem de alto nível: é composta por uma sequência de instruções de uma linguagem de programação que nós, seres humanos, compreendemos.
Você compreendeu que o computador só consegue executar programas escritos em linguagens de baixo nível? E os programas escritos em linguagens de alto nível precisam ser processados antes que possam executar (também dizemos "rodar")?
Fazer codificação em alto nível é algo que leva algum tempo. Você pode pensar que é uma desvantagem de se utilizar linguagens de alto nível. Chamo, porém, a atenção para o fato de que as vantagens são enormes. Uma grande vantagem é que fica rápido e fácil de escrever instruções nesta linguagem, pois se aproxima da nossa forma de escrever.
Além disso, o tamanho do programa é menor, mais fácil de ler e, por consequência, de alterar sempre que for necessário. Uma outra vantagem é que toda linguagem de alto nível é portável, ou seja, pode rodar em diferentes tipos de computador, com pouca ou nenhuma modificação. É importante ressaltar que os programas em baixo nível só podem rodar em um único tipo de computador e precisam ser reescritos para rodar em outro tipo de computador.
Devido a essas duas vantagens, quase todos os programas são escritos em linguagens de alto nível; as de baixo nível são utilizadas em algumas poucas aplicações especializadas.
Como fazer, então, para que a linguagem de alto nível seja convertida em linguagem de baixo nível? Existem dois tipos de programas, chamados de interpretador ou compilador, que podem ajudar. Vamos compreender as diferenças entre eles?
A Figura 2, a seguir, mostra que o interpretador lê o código fonte (ou seja, o programa escrito em uma linguagem de alto nível) e o executa, fazendo o que as instruções do programa dizem. Ou seja, seguindo o que deve ser feito (ler um dado, fazer um cálculo, apresentar um resultado na tela do computador, entre tantas outras ações). Mas, atenção, pois o interpretador executa o programa aos poucos; ou ele está lendo algumas linhas de instrução, ou está executando as instruções.
Figura 2 - Processo de interpretação
Fonte: a autora.
#PraCegoVer: a figura traz a ilustração sobre o “Processo de Interpretação”, na qual vemos três retângulos em azul claro; os dois primeiros da esquerda para a direita têm ambos uma seta diretiva que aponta para a direita da imagem. O primeiro retângulo traz o detalhe como de um pergaminho, tendo as bordas ligeiramente enroladas, acima para frente e abaixo para traz e com a escrita "printf("Olá")"; o segundo traz a escrita "Interpretador" e o terceiro retângulo que lembra uma tecla tem "Olá". Abaixo do primeiro retângulo lemos "Linguagem de alto nível" e abaixo do terceiro retângulo lemos "Saída". Todas as palavras são grafadas na cor preta.
Veja na Figura 3, a seguir, que o compilador lê o programa em linguagem de alto nível (também chamado de código fonte), ele primeiro o traduz completamente e só depois o programa está disponível para executar, ou rodar (também chamado de código executável).
Uma vez que um programa é compilado, nós podemos executá-lo mais de uma vez, sem que precise de nova tradução. Agora, se o código fonte precisar ser alterado, uma nova compilação precisará ser feita!
Figura 3 - Processo de compilação
Fonte: a autora.
#PraCegoVer: a figura traz a ilustração sobre o “Processo de Compilação”, na qual vemos cinco retângulos em azul claro; os quatro primeiros, da esquerda para a direita, têm ambos uma seta diretiva que aponta para a direita da imagem. O primeiro retângulo traz o detalhe como de um pergaminho, tendo as bordas ligeiramente enroladas, acima para frente e abaixo para traz e com a escrita "printf("Olá")"; o segundo traz a escrita "Compilador"; o terceiro retângulo traz o mesmo formato do primeiro e apresenta o numeral na primeira linha: zero, um, zero, um, zero, zero e, na segunda linha abaixo, zero, um, zero, um, zero, um; o quarto retângulo, a escrita "Executor" e o quinto e último retângulo que lembra uma tecla tem "Olá". Abaixo do primeiro retângulo lemos "Código fonte em linguagem C"; abaixo do terceiro retângulo lemos "Código Executável" e abaixo do quinto retângulo lemos "Saída". Todas as palavras e números são grafados na cor preta.
Vamos, agora, compreender um pouco sobre testes e sua importância?
Antes de compreender o objetivo dos testes, devemos perceber porque os testes são necessários. Além dessa compreensão, é importante compreender que há diferenças entre os possíveis problemas que podem ocorrer nos sistemas. Observe a relação entre defeito, erro e falha.
Um defeito é uma instrução (ou comando) incorreta no código fonte; por exemplo, uma expressão aritmética ter sido digitada errada (um “-” ao invés de um “+”).
Um erro é quando a instrução é executada e há um desvio da especificação; por exemplo, a expressão incorreta ser executada.
Uma falha é quando o usuário detecta a falha, ao perceber que o resultado do cálculo desejado apresenta uma informação incorreta.
Figura 4 - Relação entre defeito, erro e falha
Fonte: a autora.
#PraCegoVer: a figura traz a ilustração sobre a "Relação entre defeito, erro e falha" que podem ocorrer nos sistemas. Na imagem, vemos seis retângulos com informações da seguinte forma: o retângulo maior em azul claro traz para a margem esquerda deste a palavra "Defeito" na primeira linha e, em negrito, abaixo lemos "Universo do Usuário", acima e também em azul claro outro retângulo com seta apontada para as palavras citadas no retângulo maior em azul, em que lemos "instrução ou comando incorreto"; dentro do retângulo azul claro há outro retângulo na cor verde militar, um pouco menor que também para a margem esquerda deste traz a palavra "Erro", na primeira linha e em negrito, abaixo lemos "Universo da Informação", acima e também em verde militar outro retângulo com seta apontada para as palavras citadas no retângulo maior em verde, onde lemos "Desvio da Especificação" e, por fim, um retângulo bege sobreposto ao verde, mais para o lado direito da figura, traz para a margem esquerda desse a palavra "Falha" na primeira linha e, em negrito, abaixo lemos "Universo Físico", acima e também em bege outro retângulo com seta apontada para as palavras citadas no retângulo maior em bege, em que lemos "Processamento incorreto e comportamento incorreto". Todas as palavras são grafadas na cor preta.
É importante que os testes sejam aplicados desde o início, a fim de que os defeitos não cheguem ao nível das falhas. Pode-se prevenir que defeitos sejam introduzidos no código executável e, para isso, existem diferentes técnicas referentes a cada uma das atividades, no ciclo de desenvolvimento de software.
O objetivo de realizar testes é encontrar os defeitos no ambiente de testes e, por consequência, prevenir que aconteçam falhas no ambiente do cliente. Além disso, pode-se determinar o grau de qualidade do produto de software, indicando que este pode ser implantado no ambiente do cliente ou que deve sofrer alterações/correções por apresentar falhas na especificação do documento ou, até mesmo, no próprio software. Finalmente, o cliente pode obter informações para decidir pela aceitação do produto de software, a partir dos resultados dos diferentes testes aplicados.
A Figura 5 salienta que cada etapa do processo de desenvolvimento de software apoia o planejamento dos testes e posterior aplicação destes. Note a sequência das atividades: inicia com a "Elicitação de requisitos" e finaliza com o "Teste de Aceitação".
Note, também, que as atividades de "Implementação" e as de "Testes" estão em sequência, tema desta nossa lição. Finalmente, perceba que a maior parte das atividades acontecem no ambiente de desenvolvimento, mas as duas últimas devem ser realizadas, preferencialmente, no ambiente do cliente.
Figura 5 - Atividades do desenvolvimento de software e atividades de teste do software
Fonte: a autora.
#PraCegoVer: a figura apresenta a ilustração sobre “Atividades de desenvolvimento de software e atividades de teste do software”. No centro da imagem e em preto, vemos duas retas que convergem na formação da letra “V”, quando se encontram na margem inferior da imagem. Dentro do espaço em “V”, de cima para baixo, temos três setas diretivas em azul claro apontadas para a direita da imagem, em ordem decrescente, diminuindo de tamanho conforme o “V” vai afunilando e, por fim, uma seta menor, igual, sobre a base inicial deste. Para a esquerda da imagem em diagonal, acompanhando a reta em “V”, vemos outra seta diretiva em preto que aponta para a margem inferior; para o lado direito da imagem, na mesma direção e alinhamento, há outra seta diretiva em preto, porém, apontando lateralmente para a margem direita da imagem; no topo da imagem e após finalização da abertura da reta que forma a letra ”V”, para a esquerda lemos em preto e negrito “Atividades do desenvolvimento” e para a direita da abertura lemos em preto e negrito “Atividades de teste”. Para o lado esquerdo entre a reta da letra “V” e a seta diretiva diagonal para baixo, assim como para o lado direito, também entre a reta e a seta diretiva diagonal para a margem direita, temos as seguintes informações, de baixo para cima tendo como indicação as setas diretivas em azul citadas no início, sendo assim na primeira linha temos: “Implementação” em vermelho, seguindo para “Teste unitário” também em vermelho; segunda linha “Projeto” em vermelho, seguindo para “Teste de integração” também em vermelho; terceira linha “Análise de requisitos” em vermelho, seguindo para “Teste de sistema” em lilás; e quarta e última linha temos “Elicitação de requisitos” em vermelho, seguindo para “Teste de aceitação” em lilás. Abaixo, em letras maiúsculas em preto e negrito, lemos “LEGENDA”, na linha abaixo, “atividade” citada em vermelho, “que ocorre no ambiente de desenvolvimento” citadas em preto; na segunda linha, “atividade” citada em lilás, “que ocorre no ambiente do cliente” citadas em preto.
A seguir, uma breve descrição de cada um destes tipos de testes:
Teste unitário: o teste unitário é realizado pelo programador que testa os seus procedimentos, funções ou métodos (ou seja, suas "unidades") que visa resolver um requisito funcional. Este teste pretende verificar se o código do programador se comporta corretamente, de forma isolada.
Teste de integração: este tipo de teste pretende integrar as diferentes unidades que passaram pelo teste unitário. O objetivo deste tipo de teste é garantir que "se funciona separado, deve funcionar tudo junto".
Teste de sistema: diferente dos dois testes anteriores, o teste de sistema pretende testar os requisitos não funcionais. Por exemplo, verificar se o desempenho do produto de software está adequado; se existe segurança de comunicação; entre outros requisitos definidos durante a análise de sistema. Relembre que esses testes devem ser realizados no ambiente do cliente (ambiente de produção).
Teste de aceitação: este teste é também conhecido por "homologação do produto", pois é quando o cliente recebe da equipe de desenvolvimento o produto de software solicitado. A aceitação do software faz com que este passe para a fase de implantação e, na sequência, fique disponível para todos os seus usuários finais.
Importante ressaltar que os testes permitem a detecção da existência de defeitos, mas não é possível garantir a ausência desses. Por que isso ocorre? Porque é impossível testar todas as possibilidades de execução de testes.
A equipe de desenvolvimento (mais especificamente, analistas de teste e testadores) devem procurar: descobrir e consertar os defeitos ‘certos’, ou seja, os que possuem maior visibilidade para os clientes; observar os caminhos da aplicação mais utilizados pelos usuários. Obviamente que as decisões dependem de cada projeto, os aplicativos mais críticos sempre exigem um maior cuidado com os testes.
Sempre existirão defeitos, devemos aprender a viver com isso. Introduzir, porém, testes durante todo o processo de desenvolvimento de software minimizará os defeitos.
Fique ligado(a) neste desafio para você aplicar o conhecimento adquirido nesta lição: eu o(a) desafio a fazer um teste exploratório em um site que tenha cadastro de usuário (ou cliente).
O que são testes exploratórios? São extremamente úteis para encontrar bugs rapidamente, quando o projeto não tem uma documentação bem definida ou ela se encontra desatualizada. Um bug de software pode ser um defeito, erro ou falha no produto de software, fazendo com que este produto tenha um comportamento incorreto ou inesperado ou, até mesmo, não intencional.
Você deve se perguntar como fazer o teste exploratório, correto? Vou, então, indicar a você o passo a passo:
Procure um site comercial que você tenha que fazer o seu registro. Sugestões? Amazon, Saraiva, Submarino, entre outros.
Veja quais são os campos que precisam ser preenchidos e procure pensar no valor correto para cada campo, mas também no preenchimento não adequado.
Por exemplo, o campo Nome deve conter, pelo menos, duas palavras; se você inserir um espaço em branco ou apenas uma letra, estará inserindo um dado incorreto e o sistema deve acusar este erro.
Outro exemplo é o campo de e-mail. Um e-mail correto deve ter o formato "user@dominio" onde domínio pode ser "gmail.com"; o sistema deve acusar erro se você inserir "joao@gmail" ou "joao@" ou "@gmail.com".
Um campo que normalmente se pede é o número de CPF; se você inserir 999.999.999/99 o sistema deve acusar erro.
Você deve preencher o formulário, inserindo valores errados e submeter este formulário, ou seja, “enviar”.
Ao final, verifique quais são as mensagens de erro. Verifique quais são os campos que o sistema aceita e quais são os campos que o sistema rejeita.
Ao final, você verificará que muitos formulários, ainda, não fazem a validação correta de muitos dos campos, o que pode prejudicar o processamento dos dados pessoais.
Espero que com esta atividade você perceba a importância de pensar, com cuidado, como a entrada de dados deve ser feita, quando estiver envolvido na construção do documento de requisitos para que a etapa de codificação tenha atenção necessária para a validação destes dados.
FERREIRA, A. B. de H. Aurélio Júnior Dicionário Escolar da Língua Portuguesa. 2 ed. Curitiba: Positivo, 2011.