<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>Técnicas para Construção de Testes Funcionais Automáticos</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Simone Antunes Correia</string-name>
          <email>simone.correia@optimus.pt</email>
          <xref ref-type="aff" rid="aff0">0</xref>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Alberto Rodrigues da Silva</string-name>
          <email>alberto.silva@acm.org</email>
          <xref ref-type="aff" rid="aff0">0</xref>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>---------------- • Simone Antunes Correia é estudante de mestrado do MEIC- IST/UTL. Trabalha como consultora na área de Testes de Software</institution>
        </aff>
        <aff id="aff1">
          <label>1</label>
          <institution>Palavras Chave - Testes Automáticos, Testes de Regressão</institution>
          ,
          <addr-line>Testes Data-driven, Testes Keyword-driven, Ferramentas Capture- Replay, Abordagens de Testes</addr-line>
        </aff>
      </contrib-group>
      <pub-date>
        <year>2004</year>
      </pub-date>
      <abstract>
        <p>Resumo - Este artigo apresenta a temática da automatização de testes funcionais na área da Engenharia de Software, iniciando por apresentar alguns conceitos básicos sobre Testes e em seguida mostrando as actuais técnicas para o desenvolvimento de testes automáticos sob sistemas com interface gráfica (GUI). As características e limitações das actuais ferramentas CaptureReplay são exploradas bem como diferentes técnicas e abordagens para a construção de testes funcionais automáticos.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>1 INTRODUÇÃO</title>
      <p>
        A crescente complexidade nos sistemas informáticos
juntamente com os métodos de desenvolvimento rápido e
incremental – como por exemplo, Rapid Application
Development [
        <xref ref-type="bibr" rid="ref16">16</xref>
        ] e Extreme Programming [
        <xref ref-type="bibr" rid="ref15">15</xref>
        ], que prometem
intervalos de entrega mais frequentes – requerem testes de
qualidade que possam ser rapidamente executados sempre
que necessário. Em tal cenário os testes manuais são pouco
vantajosos, visto que muitos testes são re-executados a cada
release do sistema.
      </p>
      <p>
        Os testes automáticos fornecem uma solução neste sentido
pois, quando desenvolvidos de forma adequada, serão
facilmente executados. Muitos projectos revelam que o
conhecimento na área de automação e experiência nos
métodos e ferramentas disponíveis, bem como o uso de técnicas
que promovam a reutilização e facilidade de manutenção
dos testes automáticos, são fundamentais para se obter
êxito nesta área [
        <xref ref-type="bibr" rid="ref17">17</xref>
        ], [
        <xref ref-type="bibr" rid="ref18">18</xref>
        ], [
        <xref ref-type="bibr" rid="ref19">19</xref>
        ].
      </p>
      <p>Este artigo contém informações abrangentes na área dos
testes automáticos que auxiliarão aqueles que pretendam
implantar ou melhorar o processo de testes dentro de uma
organização. Através desta leitura, será possível
compreender a terminologia usada no âmbito dos testes automáticos,
perceber as reais capacidades das ferramentas e conhecer o
esforço necessário para construção de testes automáticos de
qualidade.</p>
      <p>Este artigo apresenta uma análise geral à temática dos
testes automáticos organizado da seguinte forma: a Secção 1
introduz a motivação para a apresentação do artigo e
descreve a sua organização; a Secção 2 introduz os conceitos
básicos sobre testes manuais e testes automáticos usados no
âmbito da engenharia de software; a Secção 3 apresenta as
características das actuais ferramentas para construção e
execução automática de testes funcionais; a Secção 4
apresenta diferentes técnicas para automatização de testes
funcionais e finalmente, as considerações finais e de síntese do
artigo são apresentadas na Secção 5.</p>
    </sec>
    <sec id="sec-2">
      <title>2. TESTES EM ENGENHARIA DE SOFTWARE</title>
      <p>
        Podemos definir os testes como uma actividade que tem
como objectivo verificar se o software construído está de
acordo com sua especificação e se satisfaz as expectativas
do cliente e ou utilizador do sistema. Esta definição é uma
conclusão a partir do reconhecimento de que a actividade
dos testes é parte integrante do processo de Validação e
Verificação (V &amp; V) da Engenharia de Software, sendo
considerada a técnica dinâmica que exercita a implementação
[
        <xref ref-type="bibr" rid="ref5">5</xref>
        ].
      </p>
      <p>Nesta secção apresentam-se os conceitos básicos sobre os
testes manuais e testes automáticos usados no âmbito da
engenharia de software. Introduz-se nomeadamente os
tópicos referentes a (1) planeamento de testes; (2)
granularidade de testes; (3) abordagens de testes; (4) testes manuais
vs automáticos; e (5) automatização da actividade de teste.</p>
      <sec id="sec-2-1">
        <title>2.1 Planeamento de Testes</title>
        <p>
          Tal como referido anteriormente, os testes “exercitam uma
implementação”, mas é importante salientar que
previamente a este exercício os testes devem ser planeados de tal
modo que satisfaçam seu objectivo principal que, na
opinião de Myers, é de “revelar a existência de defeitos” [
          <xref ref-type="bibr" rid="ref7">7</xref>
          ]. Um
caso de teste é constituído por um conjunto de dados de
entrada, condições de execução de uma ou mais operações
e resultados esperados ou dados de saída, desenvolvidos
com um objectivo particular. O desenho dos casos de teste
e a preparação dos dados de teste constituem actividades
fundamentais do planeamento dos testes realizadas por um
testador.
        </p>
        <p>
          Visto que o número de casos de teste normalmente é
elevado, na maioria das vezes apenas é executado um
subconjunto destes casos de testes. Faz parte também da
actividade de planeamento determinar quais são os testes mais
importantes e que deverão ser executados. Por exemplo, pode
ser decidido que, os testes às funcionalidades já existentes
em outra versão do sistema devem ser prioritários aos
testes às funcionalidades novas oferecidas na nova versão do
sistema. Neste caso, as funcionalidades já existentes que
forem escolhidas para serem testadas serão exercitadas
pelos chamados Testes de Regressão [
          <xref ref-type="bibr" rid="ref6">6</xref>
          ].
        </p>
        <p>
          Testes de Regressão são definidos como sendo testes
aplicados a uma nova versão ou release de um sistema a fim de
verificar que ele continua a realizar as mesmas funções e da
mesma maneira que na versão anterior [
          <xref ref-type="bibr" rid="ref6">6</xref>
          ]. Os Testes de
Regressão são reutilizados entre diferentes versões do
sistema, sofrendo pouca ou nenhuma alteração.
        </p>
      </sec>
      <sec id="sec-2-2">
        <title>2.2 Granularidade de Testes</title>
        <p>Devido à complexidade dos sistemas a actividade de testes
deve ser feita ao longo de diferentes estágios. O processo de
testes mais utilizado é composto por cinco estágios, como
mostramos na Figura 1.</p>
        <p>Testes de
Unidade</p>
        <p>Testes de
Módulo</p>
        <p>Testes de
Sub-Sistema</p>
        <p>Testes de
Sistema</p>
        <p>Testes de
Aceitação
Testes de Componentes</p>
        <p>Testes de Integração</p>
        <p>Testes de utilizador</p>
        <p>
          Figura 1 ‐ Visão geral do processo de testes (adaptada de [
          <xref ref-type="bibr" rid="ref5">5</xref>
          ]) 
O processo é iterativo, sendo que a informação, produzida
em cada estágio, poderá fluir entre estágios adjacentes. Os
estágios do processo de testes segundo definições em [
          <xref ref-type="bibr" rid="ref5">5</xref>
          ]
são:
Testes de Unidade: Componentes individuais são testados
independentemente de outros componentes para
certificação de que operam correctamente.
        </p>
        <p>Testes de Módulo: Um módulo é uma colecção de
Componentes relacionados tais como classes, tipos abstractos de
dados ou um conjunto de procedimentos ou funções.
Durante este estágio cada módulo é testado individualmente.
Testes de unidade e de módulo fazem parte do processo de
implementação e são da responsabilidade dos
programadores que estiveram a desenvolver o componente alvo e ou o
componente para testar o componente alvo.</p>
        <p>Testes de Sub-Sistema ou Testes de Integração: Esta fase
envolve o teste de colecções de módulos integrados em
subsistemas. Sub-sistemas podem ser desenhados e
implementados independentemente. Um problema comum em
grandes sistemas está na integração das interfaces entre os
módulos dos sub-sistemas. Estes testes devem portanto
concentrar-se no exercício rigoroso de tais interfaces para
detecção de possíveis erros.</p>
        <p>Testes de Sistema: Os sub-sistemas são integrados para
formarem um único sistema. O processo deste tipo de teste
irá detectar falhas resultantes das interacções entre
subsistemas e componentes de sistema.</p>
        <p>Testes de Aceitação: Este é o estágio final do processo de
testes antes do sistema ser aceite para uso operacional. O
sistema é testado com dados fornecidos pelo utilizador
final, ao contrário de dados fictícios ou simulados. Os testes
de aceitação revelam principalmente erros e omissões na
definição dos requisitos, pois através do uso de dados reais
o sistema é exercitado de formas variadas.</p>
      </sec>
      <sec id="sec-2-3">
        <title>2.3 Abordagens de Testes</title>
        <p>
          Testes Black Box ou Testes Funcionais e Testes White Box ou
Testes Estruturais representam as principais abordagens
existentes de teste segundo [
          <xref ref-type="bibr" rid="ref1">1</xref>
          ]. Qualquer destas bordagens
podem ser aplicadas, em princípio, durante qualquer
estágio do processo de testes, contudo cada uma delas é
preferencialmente aplicável a determinados tipos de
componentes e realizáveis por equipas distintas.
        </p>
        <p>
          Segundo [
          <xref ref-type="bibr" rid="ref5">5</xref>
          ], a abordagem funcional por exemplo, é melhor
aplicada sob componentes de sistema e realizada por uma
equipa de testes, enquanto a abordagem estrutural é
melhor aplicada a componentes individuais ou a colecções de
componentes dependentes e realizada pela equipa de
desenvolvimento.
        </p>
        <p>Através da abordagem de Testes Funcionais, os casos de
testes são derivados a partir da especificação do sistema ou
componente a ser testado. O sistema é visto como uma
caixa fechada e o seu comportamento apenas pode ser
derivado através do estudo dos possíveis valores de entrada e dos
valores de saída relacionados. Por outro lado, através da
abordagem de Testes Estruturais, o testador pode analisar o
código e usar o conhecimento da estrutura do componente
para derivar os casos de testes. No restante do artigo,
quando não explicitada a abordagem de testes, deverá ser
assumida como a de testes funcionais.</p>
      </sec>
      <sec id="sec-2-4">
        <title>2.4 Testar versus Automatizar Testes</title>
        <p>
          A qualidade de um caso de teste é descrita através de
quatro atributos [
          <xref ref-type="bibr" rid="ref3">3</xref>
          ]. O primeiro consiste na capacidade de
encontrar defeitos. O segundo refere a capacidade em
exercitar mais de um aspecto reduzindo assim a quantidade de
casos de teste requeridos. O terceiro e quarto fazem
considerações de custo. O terceiro é inferido baseado no custo
necessário para a realização do caso de teste incluindo o
esforço de desenho, execução e análise dos resultados de
teste. O quarto atributo refere o esforço de manutenção
necessário sobre o caso de teste a cada alteração do sistema.
Estes quatro atributos devem ser balanceados de forma a se
ter casos de teste de boa qualidade.
        </p>
        <p>
          A forma manual ou automática de realização de um teste,
não interfere nos dois primeiros atributos citados. A
automatização de um caso de teste interfere apenas em quão
económico o caso de teste será e que esforço de manutenção
será necessário. O esforço de construção e de manutenção
requerido para um teste automático é normalmente maior
do que para um teste manual equivalente. Mas uma vez
construído, o teste automático tende a ser mais económico
que o teste manual, o esforço de execução e de verificação
de resultados será uma pequena fracção do esforço de
construção. Para testes funcionais sob sistemas com interface
gráfica foi concluído por Linz e Daigl [
          <xref ref-type="bibr" rid="ref11">11</xref>
          ] que, após
investimentos iniciais de criação de infra-estrutura, o gasto em
testes automáticos representará 40% do gasto com testes
manuais.
Visto que o custo original da implementação e o custo da
manutenção de um caso de teste automático será diluído a
cada execução que seja necessária, os Testes de Regressão
são fortes candidatos a serem automatizados.
        </p>
        <p>No entanto, os testes automáticos não são garantia da
existência de testes eficazes. A identificação, selecção e desenho
dos casos de testes funcionais devem ser feitos por um
testador que domine o domínio da aplicação. O responsável
que constrói testes automáticos e mantém os artefactos
relacionados com o uso de uma ferramenta de execução de
testes é chamado de Test Automator ou Automatizador de
Testes. O automatizador de testes pode ser ou não um testador,
devendo sempre ter habilidades em programação. A
habilidade do automatizador ditará a qualidade da automação,
mas será a habilidade do testador quem ditará a eficácia
dos testes realizados.</p>
      </sec>
      <sec id="sec-2-5">
        <title>2.5 Automatização da Actividade de Teste</title>
        <p>
          Nesta secção descrevemos as actividades de teste e suas
possíveis formas de automatização. As actividades de teste
são normalmente realizadas na seguinte sequência: (1)
Identificação, (2) Desenho, (3) Construção, (4) Execução e
(5) Comparação, como mostra a Figura 2. As três primeiras
actividades fazem parte do planeamento dos testes.
Falaremos de cada uma individualmente.
objectivo comum que é a razão ou propósito do teste.
Cada caso de teste possui dados de entrada, a informação
necessária para a execução do teste e a saída esperada. Os
pré-requisitos para realização dos testes, tais como
variáveis do ambiente de execução ou estado da base de dados
devem ser explicitados para cada caso de teste. A saída ou
resultado esperado inclui a criação ou visualização de itens,
a modificação ou actualização de itens (em base de dados,
por exemplo) ou a remoção de itens. O resultado esperado
deve indicar portanto o estado do sistema após a realização
da operação sob teste. A actividade de desenho de casos de
testes exige um esforço intelectual por parte do testador.
Algumas ferramentas fazem a geração automática dos
casos de teste baseadas em código fonte [
          <xref ref-type="bibr" rid="ref8">8</xref>
          ], [
          <xref ref-type="bibr" rid="ref9">9</xref>
          ], [
          <xref ref-type="bibr" rid="ref10">10</xref>
          ] ou
especificação formal [
          <xref ref-type="bibr" rid="ref21">21</xref>
          ].
        </p>
        <p>Construção
Nesta actividade os casos de teste são transformados em
scripts de teste que quando utilizados durante uma
execução manual do teste, é também chamado de procedimento
de teste. Um procedimento de teste detalha a informação
descrita no caso de teste de modo que o testador possa,
seguindo as instruções do procedimento, executar e validar a
execução de cada teste. Um script de teste é normalmente
armazenado em ficheiro e escrito em linguagem específica,
usada por uma ferramenta de automação da execução do
teste. Um script de teste pode implementar um ou mais
casos de teste. A ferramenta irá processar o script executando
as acções por ele descritas.</p>
        <p>A preparação dos dados de entrada do teste e do resultado
de saída esperado é tarefa fundamental da fase de
construção do teste. Quando os resultados de saída forem
utilizados para comparação automática através de uma
ferramenta, estes devem ser minuciosamente descritos. Uma
comparação manual não exige tanto rigor na descrição do
resultado esperado que normalmente está incluso dentro do
procedimento de teste.</p>
        <p>Execução
Nesta actividade o sistema é executado utilizando os scripts
de teste. Para testes manuais, esta fase pode consistir de
testadores a seguirem as instruções existentes em um
pro  cedimento de teste. Para testes automáticos as tarefas desta
fase podem ser resumidas apenas no lançamento do script
de teste correspondente. Os dados de entrada podem estar
no script de teste ou separado em ficheiros ou em base de
dados. A ferramenta irá executar o script, efectuando as
acções que o testador efectuaria manualmente. Existem
diferentes ferramentas para execução automática de testes e
diferentes técnicas para criação de tais scripts como veremos
apresentados em 4.</p>
        <p>Comparação
Os resultados obtidos do sistema sob testes são usados para
determinação do resultado do teste. Existem dois possíveis
resultados: positivo ou negativo. A verificação do resultado
obtido pode ser feita com confirmação informal do que o
testador espera ver ou pode ser um comparação rigorosa e
detalhada entre o resultado obtido e a resultado esperado
(determinado durante a fase de construção do teste).
Alguns resultados podem ser comparados ainda durante a
execução do teste (uma mensagem que deve ser enviada ao
ecrã), mas, por exemplo, resultados que fazem modificações
Identificar as condições de testes e</p>
        <p>priorizá-las
Identificação</p>
        <p>Desenhar casos de teste, indicando
como as condições de teste serão</p>
        <p>testadas
Desenho</p>
        <p>Construção</p>
        <p>Construir casos de teste
(implementar scripts e dados)</p>
        <p>Executar os casos de teste
Execução</p>
        <p>
          Comparar a saída do caso de
teste com a saída esperada
Comparação
{testes finalizados}
Figura 2 - Actividades de teste (adaptada de [
          <xref ref-type="bibr" rid="ref3">3</xref>
          ])
        </p>
        <sec id="sec-2-5-1">
          <title>Identificação</title>
          <p>
            Nesta primeira etapa, o testador determinará o que será
testado identificando as condições de teste (itens ou
eventos) que precisam ser verificados por cada teste. Condições
de teste são descrições de circunstâncias que devem ser
examinadas. Existem diversas técnicas para uma derivação
rigorosa de condições de teste nomeadamente [
            <xref ref-type="bibr" rid="ref1">1</xref>
            ]:
equivalence particioning, boundary value analysis, cause-effect graphing,
todas indicadas para uso em uma abordagem de Testes
Black Box ou Funcional. Algumas técnicas para derivação de
condições de teste para uso sob uma abordagem White Box
é apresentada em [
            <xref ref-type="bibr" rid="ref1">1</xref>
            ], como statement coverage e path
coverage.
          </p>
        </sec>
        <sec id="sec-2-5-2">
          <title>Desenho</title>
          <p>O desenho dos casos de teste determinará como as
condições de testes serão testadas. Um caso de teste é um
conjunto de testes realizados em sequência e que possuem um
de registos em base de dados podem apenas ser
comparados depois que a execução do teste é finalizada. Um teste
automático pode utilizar os dois métodos de comparação.</p>
        </sec>
      </sec>
    </sec>
    <sec id="sec-3">
      <title>3. FERRAMENTAS PARA CONSTRUÇÃO E EXECUÇÃO</title>
      <p>DE TESTES AUTOMÁTICOS FUNCIONAIS
As ferramentas para construção de testes automáticos
funcionais permitem a realização dos testes de uma forma não
assistida.</p>
      <p>
        Na secção seguinte iremos destacar as ferramentas do tipo
capture-replay fazendo uma descrição de suas
funcionalidades, recursos, limitações e contextos de utilização. A
ferramenta comercial WinRunner [
        <xref ref-type="bibr" rid="ref14">14</xref>
        ] será usada para a
exemplificação de alguns aspectos descritos.
      </p>
      <sec id="sec-3-1">
        <title>3.1 Funcionalidades</title>
        <p>As ferramentas capture-replay ou gravação-execução que
daqui por diante abreviaremos por ferramentas GE, são
ferramentas que permitem a criação, execução e a
verificação dos resultados de testes automáticos para sistemas com
interface gráfica standard. Na indústria informática, são as
ferramentas mais conhecidas para a realização de testes
automáticos.</p>
        <p>As ferramentas GE possuem duas funções principais de
utilização, a função de gravação e a função de repetição.
Através da primeira, todos os objectos visualizados no
sistema a ser testado são registados e toda a sequência de
interacções realizadas sob estes objectos são
registados/gravados em ficheiro. Este ficheiro ou script de teste,
como passa a ser chamado, contém todos os movimentos
do rato e teclado realizados, todas as entradas inseridas, as
opções escolhidas e o resultado obtido. Quando
interrompido o modo de gravação, a ferramenta pára de registar as
acções no script.</p>
        <p>Através da função de repetição, qualquer script escrito na
linguagem da ferramenta poderá ser executado, incluindo
aquele criado pela função de gravação. A execução de um
script que tenha sido gravado será uma repetição fiel de
todas as acções realizadas aquando da gravação.
O resultado obtido durante a gravação pode ser
considerado o resultado esperado do teste e será comparado com os
resultados obtidos durante as subsequentes execuções
automáticas como forma de determinar o resultado final do
teste.</p>
      </sec>
      <sec id="sec-3-2">
        <title>3.2 Recursos Utilizados</title>
        <p>Existem duas principais formas usadas pelas ferramentas
GE para o reconhecimento dos elementos de uma interface
gráfica da aplicação sob testes. A primeira é orientada pela
posição das coordenadas do elemento gráfico no ecrã. A
segunda, mais flexível, reconhece os elementos da interface
como objectos gráficos, possuidores de propriedades que
determinam o seu aspecto e comportamento.</p>
        <p>
          Para a ferramenta WinRunner [
          <xref ref-type="bibr" rid="ref14">14</xref>
          ], que realiza testes sob
aplicações com interface Windows ou Web, a lista das
propriedades físicas juntamente com os respectivos valores de
atribuição, usados para identificação de cada objecto
gráfico, formam o que é chamado de “descrição física” do
objecto [
          <xref ref-type="bibr" rid="ref22">22</xref>
          ]. No entanto, os scripts de teste referenciam os
objectos utilizando outro identificador, chamado de “nome
lógico”. A relação entre o descritor físico e o nome lógico é
mantida em ficheiros chamados de GuiMap[
          <xref ref-type="bibr" rid="ref22">22</xref>
          ]. Esta
solução, permite que os scripts mantenham-se sintaticamente
válidos mesmo quando há alteração nas propriedades
físicas dos objectos, passando a ser necessário apenas alteração
no ficheiro GuiMap.
        </p>
        <p>
          A maioria das ferramentas GE permitem a criação de testes
que interajam com objectos gráficos e janelas criados com o
standard Microsoft Foundation Class Library (MFC). Objectos
e janelas criados usando tecnologias diferentes por
exemplo, Java Foundation Class Library podem ou não ser
suportados pela ferramenta envolvida [
          <xref ref-type="bibr" rid="ref13">13</xref>
          ]. No caso da
ferramenta WinRunner existem add-ins para o tratamento de
aplicações Java, PowerBuilder, Visual Basic e aplicações Web [
          <xref ref-type="bibr" rid="ref12">12</xref>
          ].
Caso uma ferramenta GE não consiga identificar o tipo do
objecto gráfico, como último recurso a ferramenta GE pode
sempre reconhecer objecto pelas suas coordenadas
espaciais do ecrã.
        </p>
        <p>Muitas ferramentas GE, incluindo WinRunner, possuem
funções próprias para a realização de queries SQL sob
qualquer base de dados que suporte a interface ODBC. Tal
funcionalidade permite inclusive que a verificação do
resultado não seja feita apenas baseado no que é visualizado no
ecrã, mas sim no que foi realmente alterado em base de
dados.</p>
        <p>A possibilidade de permitir a criação de bibliotecas de
funções reutilizáveis é uma funcionalidade bastante desejável e
existente em muitas ferramentas. Além de permitir a
criação de bibliotecas próprias algumas ferramentas permitem
o acesso a bibliotecas externas através de chamadas a
ficheiros .dll.</p>
        <p>
          As linguagens de scripts fornecidas pelas ferramentas GE
normalmente são proprietárias e interpretadas. A
ferramenta WinRunner fornece uma linguagem estruturada,
semelhante a C, chamada TSL (Test Script Language) [
          <xref ref-type="bibr" rid="ref22">22</xref>
          ].
        </p>
      </sec>
      <sec id="sec-3-3">
        <title>3.3 Limitações</title>
        <p>As actuais ferramentas comerciais GE são vendidas como
sendo uma solução fácil e auto-suficiente para a realização
de testes automáticos, no entanto a experiência mostra que
os scripts gravados possuem algumas limitações que
inviabilizam a sua utilização como única forma de criação de
testes. Abaixo mostraremos algumas das fragilidades dos
scripts gravados, designadamente:
•
•</p>
        <p>Os scripts são pobremente estruturados. Os scripts
gerados pelo modo de gravação resultam em
scripts extensos onde todas as acções efectuadas
são registadas. Muitas destas acções poderiam ser
reutilizadas por outros testes mas são
repetidamente gravadas em cada novo script de teste
gravado.</p>
        <p>Inexistência de mecanismos de reutilização de
código. As acções (código), os dados de entrada e de
resultado esperado ficam todos juntos no script
criado pelo modo de gravação. Isto não permite que
os scripts sejam escaláveis e reutilizados pois os
dados estão hard-coded no script. Muitas vezes o
que difere um caso de teste de outro são os dados
por ele processados, enquanto as acções são as
mesmas.</p>
        <p>Todas estas limitações podem ser ultrapassadas se, tal
como acontece na programação, utilizarmos as técnicas
apropriadas para construção dos scripts. Na Secção 4
veremos algumas formas de se desenvolver scripts com baixo
custo de manutenção e mais vantajosos num
desenvolvimento a longo prazo.</p>
      </sec>
      <sec id="sec-3-4">
        <title>3.2 Contextos de Utilização</title>
        <p>As ferramentas GE são fundamentalmente usadas para a
realização de testes funcionais, de aceitação, sob sistemas
com interface gráfica.</p>
        <p>No entanto, se quisermos realizar testes automáticos sob
formatos não gráficos, como por exemplo testes a stored
procedures PL-SQL, a WebServices, aplicações servidor ou a
um componente através de uma dll, a única solução
possível passa pela criação de uma camada de interface gráfica
standard simples, que possibilitará a invocação dos
serviços a serem testados. Esta interface abstrairá as
características da interface não tratada directamente pela ferramenta,
possibilitando a invocação dos serviços a serem testados.
Através da utilização deste recurso, podemos dizer que as
ferramentas GE podem ser aplicáveis para execução e
comparação automática de testes em todos os níveis: unidade,
módulo, integração, sistema ou aceitação.</p>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>4. TÉCNICAS PARA CONSTRUÇÃO DE SCRIPTS DE</title>
    </sec>
    <sec id="sec-5">
      <title>TESTE</title>
      <p>
        As técnicas para construção de scripts de testes automáticos
são similares às técnicas de programação. Os scripts de
testes automáticos contêm dados e instruções para a
ferramenta de teste. A minimização do esforço de manutenção dos
scripts só é conseguida através de um investimento na
construção dos scripts. Em [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ], os autores consideram a
existência de cinco técnicas para criação de scripts, que se refere de
seguida.
      </p>
      <p>Scripts Lineares
Um script linear é aquele obtido a partir da gravação feita
por uma ferramenta GE. É uma rápida forma de começar a
construir scripts de testes automáticos, pois não requer
conhecimento da linguagem oferecida pela ferramenta. No
entanto, estes scripts não são úteis num plano a longo
prazo. Normalmente, possuem informação excessiva e
repetida, dados registados junto às acções (hard-coded) e estão
muito associados a particularidades do sistema na altura da
gravação o que os torna bastante vulneráveis a mudanças
no sistema a ser testado. A criação de testes automáticos
através de scripts gravados não é portanto uma boa prática.
Scripts Estruturados
Tal como as linguagens de programação estruturadas estes
scripts usam estruturas de controlo como “If” e “Loop”, o
que garante uma flexibilidade não existente nos scripts
lineares. Na escolha da ferramenta convém verificar, entre
outras, a capacidade das suas linguagens no que se refere às
instruções de controlo.</p>
      <p>Scripts Partilhados
São scripts que podem ser usados por mais de um caso de
teste. Os scripts partilhados podem ser específicos a uma
aplicação ou independente de aplicação. Uma vez
identificado um conjunto de acções úteis para mais de um teste,
um script partilhado deve ser criado e disponibilizado para
invocação a partir de qualquer outro teste. As informações
variáveis devem ser passadas como parâmetro, tal como
acontece na invocação de uma função na programação
estruturada.</p>
      <p>Scripts Data-driven
São scripts mais abrangentes que lêem entradas de testes ou
resultados esperados a partir de um ficheiro de dados ou
tabela de dados evitando termos dados hard-coded no
próprio script. Além disto esta técnica permite que novos testes
sejam adicionados mais facilmente, uma vez que em alguns
casos a existência de novos testes pode ser expressa pela
inclusão de novas entradas na tabela de dados, sem
nenhuma alteração no script de controlo. Os testes podem ser
adicionados sem a necessidade de alteração no código do
script. Em adição à entrada de teste, o resultado esperado
também pode ser removido do script e colocado no ficheiro
de dados, uma vez que o resultado esperado está
directamente associado com a entrada do teste.</p>
      <p>Script original:</p>
      <p>AdicionaCliente
FocusOn 'Cliente'
SelectOption 'Adiciona
Cliente'
FocusOn 'Adiciona Cliente'
Type 'João'
Type '91223344'
Type '1284749303'
LeftMouseClick 'OK'
FocusOn 'Adiciona Cliente'
Type 'Joaquim'
Type '91223774'
Type '1284939303'
LeftMouseClick 'OK'
. . .</p>
      <p>Script de Controlo data-driven:</p>
      <p>ClienteControle
OpenFile 'DadosCliente'
For each record in DadosCliente</p>
      <p>Read NOME
Read TELEMÓVEL</p>
      <p>Read NRCONTRIBUINTE
FocusOn 'Cliente'
SelectOption 'Adiciona Cliente'
FocusOn 'Adiciona Cliente'
Type 'NOME'
Type 'TELEMÓVEL'
Type 'NRCONTRIBUINTE'
LeftMouseClick 'OK'</p>
      <p>Ficheiro de Dados: DadosCliente
João, 91223344, 1284749303
Joaquim, 91223774, 1284939303
Carlos, 918333441, 1284229303</p>
      <p>
        Francisco, 945403399, 1284740303
Figura 3 - O script original AdicionaCliente, implementado pela técnica
data-driven (adaptada de [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ])
Muitas ferramentas GE encorajam a utilização desta técnica
fornecendo mecanismos para armazenamento de dados de
entrada em ficheiro texto e atribuição dos mesmos, durante
a execução, a variáveis do script.
      </p>
      <p>Como uma limitação desta técnica podemos citar que os
scripts data-driven requerem que o desenho do teste seja
feito na linguagem de automação da ferramenta. Desta
forma, todos os envolvidos com o desenvolvimento de
testes automáticos ou execução automática de testes precisam
ser conhecedores do ambiente e da linguagem de
programação da ferramenta de automação. A Figura 3 apresenta
um exemplo de utilização desta técnica para testes a um
sistema de facturação. Os testes apresentados fazem a
inserção de clientes, onde os dados requeridos são: nome,
telemóvel e número de contribuinte.
Scripts Keyword-driven
Na técnica data-driven a navegação e acções realizadas são
as mesmas para cada caso de teste e o conhecimento lógico
sobre os testes está distribuído no ficheiro de dados e no
script de controlo e precisam ser sincronizados. A técnica
keyword-driven combina a técnica data-driven com a
possibilidade de especificar os casos de teste de forma menos
detalhada, tal como é feito quando estamos a descrever um caso
de teste manual.
Esta técnica expande o ficheiro de dados da técnica anterior
de forma a torná-lo uma descrição dos casos de teste que
queremos automatizar, utilizando um conjunto de palavras
chave (keywords). Este novo ficheiro que é chamado de
ficheiro de testes descreve apenas o que o caso de testes faz,
mas não a forma como é feito. O script de controlo tem
habilidade de interpretar estas keywords, as quais estão
implementadas fora do script de controlo. Esta separação na
implementação das keywords requer um nível adicional de
implementação técnica, que é feito através dos chamados
scripts de suporte. Temos portanto três estruturas básicas
que são o script de controlo, os ficheiros de teste e os scripts
de suporte.</p>
      <p>Esta técnica permite usar o conhecimento de um testador
experiente no domínio da aplicação para o desenho ou
construção dos casos de testes em ficheiros de teste e o
conhecimento técnico de um automatizador nas ferramentas e
linguagens existentes para a construção dos scripts de
suporte, utilizando assim perfis distintos de testadores para a
construção de testes automáticos mais efectivos e robustos.
A Figura 4 apresenta a utilização desta técnica para o
exemplo de um sistema de facturação, onde os testes
pretendem verificar a realização de operações básicas, como
adicionar/remover factura e adicionar/remover cliente. As
palavras chave AdicionaFactura e RemoveFactura, são
invocadas em diferentes testes ou ficheiros de teste, mas estão
implementadas apenas nos scripts de suporte
correspondentes.</p>
    </sec>
    <sec id="sec-6">
      <title>5. CONSIDERAÇÕES FINAIS</title>
      <p>Concluímos este artigo com a apresentação da Figura 5 que
sintetiza os conceitos e classificações apresentados neste
artigo sobre os testes de sistemas informáticos.</p>
      <p>Manual
Automático
*</p>
      <p>Tipo de Suporte</p>
      <p>Granularidade</p>
      <p>Teste</p>
      <p>Caixa Branca Caixa Preta
1
Técnica Construção de Script</p>
      <p>Abordagem</p>
      <p>Unidade
Módulo
Integração</p>
      <p>Sistema
Aceitação
Estruturada</p>
      <p>Partilhada</p>
      <p>Data-driven</p>
      <p>Keyword-driven
Figura 5 - Visão geral dos tipos de testes
Vista como actividade que promove o aumento na
qualidade do software, a realização de testes de acordo com uma
metodologia tem vindo a se tornar cada vez mais frequente
na indústria informática. Vimos neste artigo que esta
actividade deve ser realizada segundo um processo bem
definido que valorize a qualidade do desenho dos testes
independente do tipo de suporte possível: manual ou
automático.</p>
      <p>Neste artigo, apresentamos os diferentes tipos de testes
segundo sua granularidade e as principais abordagens de
teste existentes. Indicamos como cada uma das actividades
de testes pode ser realizada automaticamente, salientando e
discutindo o contexto onde a automatização é mais
indicada.</p>
      <p>Apresentamos as funcionalidades das ferramentas que
permitem a execução e comparação automática dos testes,
bem como suas limitações e contextos de utilização.
Diferentes técnicas para a construção de testes automáticos
foram apresentadas, tendo sido salientadas as mais evoluídas
data-driven e keyword-driven, que permitem a criação de
testes automáticos reutilizáveis e flexíveis.</p>
      <p>
        Um procedimento favorável ao sucesso da automação é
tratá-lo como um projecto de desenvolvimento de software
[
        <xref ref-type="bibr" rid="ref23">23</xref>
        ]. Neste sentido, sugere-se a criação de uma
infraestrutura de testes automáticos reutilizáveis e de fácil
manutenção, com um objectivo de sucesso a longo prazo.
Apenas desta forma poderão ser constatadas as vantagens
da automação.
      </p>
      <p>Recomendamos que a realização dos testes automáticos seja
feita de forma planeada, a pensar não apenas no sistema
actualmente a ser testado, mas tendo em consideração que,
com algum esforço adicional, os scripts poderão ser usados,
por diferentes releases do mesmo sistema, e também por
diferentes sistemas, com menor esforço de concepção e
desenvolvimento.</p>
      <p>A partir da constatação de que muitas actividades de testes
são comuns a diferentes sistemas, pensamos que, um
desafio para o futuro está na concepção de arquitecturas de
testes e na implementação de testes genéricos. Tais testes,
mediante configuração específica do sistema alvo,
nomeadamente o modelo de interface gráfica e de estrutura de
dados, poderiam ser utilizados eficientemente por distintos
sistemas.
Simone Antunes Correia Licenciatura em Ciência da Computação
pela Universidade Federal de Pernambuco. Estudante de mestrado do
MEIC-IST/UTL. Trabalha actualmente como consultora na área de
Testes de Software.</p>
      <p>Alberto Rodrigues da Silva Doutoramento e mestrado em
Engenharia Informática e Computadores pelo IST/UTL e licenciatura em
Engenharia Informática pela FCT/UNL. Professor auxiliar no Departamento
de Engenharia Informática do IST/UTL, investigador sénior no
INESCID na área de Sistemas de Informação e consultor em diferentes
empresas e instituições.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>E.</given-names>
            <surname>Kit</surname>
          </string-name>
          .
          <source>Software Testing in the Real World: Improving the Process. Addison-Wesley</source>
          ,
          <year>1995</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]  Bodgan Bereza, Jarocinski. Tools and Automation in a Shoestring.  Workshop Eurostar. Estocolmo, 
          <year>2001</year>
          . 
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <surname> </surname>
            <given-names>M.</given-names>
          </string-name>
          <string-name>
            <surname>Fewster</surname>
             e
            <given-names> D.</given-names>
          </string-name>
          <string-name>
            <surname>Grahm</surname>
          </string-name>
          . Software Test Automation. 
          <string-name>
            <surname>Addison‐Wesley</surname>
          </string-name>
          , 
          <year>1999</year>
          . 
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <surname> </surname>
            <given-names>H.</given-names>
          </string-name>
          <string-name>
            <surname>Buwalda</surname>
            ,  D.Janssen,
            <given-names>  I.Pinkster.</given-names>
          </string-name>
            Integrated  Test 
          <article-title>Design  and  Automation: Using the TestFrame Method</article-title>
          . 
          <string-name>
            <surname>Addison‐Wesley</surname>
          </string-name>
          , 
          <year>2002</year>
          . 
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names> </given-names>
            <surname>Sommerville</surname>
          </string-name>
          . Software Engineering. 
          <string-name>
            <surname>Addison‐Wesley</surname>
          </string-name>
          , 
          <year>2000</year>
          . 
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]  Share Lawrence Pfleeger. Software Engineering:  Theory and Practice.  Prentice Hall, 
          <year>2001</year>
          . 
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]  Glenford 
          <string-name>
            <given-names>J.</given-names>
            <surname>Myers</surname>
          </string-name>
          .  The  Art  of  Software  Testing.  New  York:  John  Wiley and Sons, 
          <year>1979</year>
          . 
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <surname> </surname>
            <given-names>IPL</given-names>
          </string-name>
          , www.iplbath.com (AdaTEST, Cantata, Cantata++) 
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <surname> </surname>
            <given-names>LDRA</given-names>
          </string-name>
           Ltd, www.ldra.com (LDRA Testbed, geração automática de  ambiente de testes ‐  harness, stubs e drivers) 
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>[10]  Testwell,  www.testwell.sci.fi/homepage.html  (ferramentas  de  teste para C, C++ e Java) </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]  Tilo Linz, Matthias Daigl. White Paper: How to Automate 
          <article-title>Testing of  Graphical  User  Interfaces</article-title>
          .  Alemanha, 
          <year>1998</year>
          .  http://www.imbus.de/forschung/pie24306/gui/aquis‐full_
          <year>paper1</year>
          .3.html. 
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12]  Horwath,  Green  &amp; 
          <string-name>
            <surname>Lawler</surname>
          </string-name>
          .  White  Paper:    SilkTest  and  WinRunner  Feature Descriptions, 
          <year>2000</year>
          . 
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [13]  Elisabeth  Hendrickson.  Making  the  Right  Choice.  Revista  StqeMagazine,  Maio/Junho 
          <year>1999</year>
          .  http://www.qualitytree.com/feature/mtrc.pdf 
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>[14]  WinRunner  information.  http://www.mercury.com/us/products/quality‐center/functionaltesting/winrunner/ </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          [15]  Kent Beck. Extreme Programming Explained. 
          <string-name>
            <surname>Addison‐Wesley</surname>
          </string-name>
          , 
          <year>2000</year>
          . 
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          [16]  Steve Mcconnell. Rapid Development. Microsoft Press, 
          <year>1996</year>
          . 
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          [17]  JimDougherty,  Keith  Haber.  Test  Automation:  Reducing  Time  to  Market. International Conference on Software Testing, Analysis &amp; 
          <string-name>
            <surname>Review</surname>
          </string-name>
          , 
          <year>2002</year>
          . 
        </mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>
          [18]  Tilo Linz. Case Study: IMBUS GmbH. Automated Testing of Graphical User Interfaces, 
          <year>1998</year>
          . www.esi.es/VASIE/Reports/All/24151/guitest1.pdf 
        </mixed-citation>
      </ref>
      <ref id="ref19">
        <mixed-citation>
          [19]  Elisabeth  Hendricson.  White  Paper:  The  Difference  between  Test  Automation  Failure  and  Success, 
          <year>1998</year>
          .  www.qualitytree.com/feature/dbtasaf.pdf 
        </mixed-citation>
      </ref>
      <ref id="ref20">
        <mixed-citation>
          [20]  Cem  Kaner.  Improving  the  Maintainability  of  Automated  Test  Suites. Quality Week Conference, 
          <year>1997</year>
           
        </mixed-citation>
      </ref>
      <ref id="ref21">
        <mixed-citation>
          [21]
          <string-name>
            <surname> </surname>
            <given-names>ADL</given-names>
          </string-name>
           Translation System  
        </mixed-citation>
      </ref>
      <ref id="ref22">
        <mixed-citation>
          [22]
          <article-title>  WinRunner User's </article-title>
          <source>Guide Versão 7</source>
          .6, Mercury Interactive Corporation. 
        </mixed-citation>
      </ref>
      <ref id="ref23">
        <mixed-citation>
          [23]
          <string-name>
            <surname> </surname>
            <given-names>B.</given-names>
          </string-name>
          <string-name>
            <surname>Pettichord</surname>
          </string-name>
          . Seven Steps  to Test  Automation Sucess. STAR West  Conference, 
          <year>1999</year>
          . Versão revisada em 
          <year>2001</year>
           
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>