Professional Documents
Culture Documents
Legados
São Paulo
2007
REINALDO COELHO SARTORELLI
Legados
São Paulo
2007
RESUMO
Legacy computer system is the term that is commonly used to describe software
that is considered obsolete but is still being used in an organization. It usually
represents software that is difficult to maintain or created with technology that is no
longer supported by the vendor, software that is difficult to evolve due to a bad
design or the use of obsolete development methods and the cost of maintenance
is too high. These are some reasons for which the software is still used by the
company although the development and improvement were discontinued. Other
factors include de risk as it can consist of a core application for the company and
the cost does not justify the change, as replacing it can lead to profit loss.
The main goal of this work is to present a theoretical proposal of tests automation
that can be linked to any software development process. The automation of a
systems' test routines leads to significant quality mprovements of legacy systems,
and a guarantee of reliability in the process of implementing new features and
avoiding losses due to the continued use of a legacy software in a company or
organization.
TI Tecnologia da Informação
Extensível)
Eletrotecnica Internacional)
de aplicação)
SUMÁRIO
1 INTRODUÇÃO.................................................................................................................10
Objetivos.......................................................................................................................... 11
Metodologia de Trabalho................................................................................................. 11
2 SISTEMAS DE SOFTWARE........................................................................................... 13
2.1 Processos de Desenvolvimento de Software............................................................. 13
2.1.1 Ciclo de Vida Codifica-Remenda ou Ad-Hoc....................................................15
2.1.2 Ciclo de Vida Cascata ou Clássico.....................................................................17
2.1.3 Ciclo de Vida em Espiral................................................................................... 19
2.2 Arquitetura de Software.............................................................................................21
2.2.1 Arquitetura Cliente Servidor.............................................................................. 24
2.2.2 Arquitetura Três Camadas..................................................................................27
2.2.3 Arquitetura Orientada a Serviços....................................................................... 28
2.3 Paradigmas de Desenvolvimento de Software.......................................................... 30
2.3.1 Paradigma Orientado a Objetos......................................................................... 33
3 QUALIDADE................................................................................................................... 38
3.1 Qualidade de Software...............................................................................................38
3.1.1 Atributos de Qualidade de Software.................................................................. 41
3.2 Métricas de qualidade de software............................................................................ 44
3.2.1 Métrica de Defeito............................................................................................. 45
3.2.2 Métrica de Problemas do Cliente....................................................................... 46
3.2.3 Métrica de Satisfação do Cliente....................................................................... 48
3.3 Estratégias de Teste de Software............................................................................... 50
3.3.1 Teste de Unidade................................................................................................ 53
3.3.2 Teste de Integração.............................................................................................56
3.3.3 Teste de Sistema.................................................................................................60
3.3.4 Teste de Aceitação..............................................................................................64
3.3.5 Teste de Regressão............................................................................................. 65
3.4 Técnicas de Teste de Software...................................................................................66
3.4.1 Teste de Caixa-Branca....................................................................................... 67
3.4.2 Teste de Caixa-Preta...........................................................................................73
3.5 Automação de Teste de Software...............................................................................79
3.5.1 Automação de testes de unidade........................................................................ 84
3.5.2 Automação de testes de integração.................................................................... 86
3.5.3 Automação de testes de sistema......................................................................... 88
4 SISTEMAS DE SOFTWARES LEGADOS..................................................................... 93
4.1 A qualidade do software legado.................................................................................95
4.2 Transformação de sistema legado............................................................................100
5 PROPOSTA DE AUTOMAÇÃO DE TESTES EM SISTEMAS LEGADOS................104
5.1 Identificar pontos de necessidade de automação..................................................... 107
5.2 Planejar os testes a serem efetuados........................................................................ 109
5.3 Definir as ferramentas para a automação.................................................................111
5.4 Incluir a automação no processo de desenvolvimento.............................................113
5.5 Acompanhamento e análise dos resultados..............................................................115
6 CONCLUSÃO.................................................................................................................117
REFERÊNCIAS................................................................................................................. 119
10
1 INTRODUÇÃO
Devido as técnicas utilizadas para criar estes sistemas legados, muitas vezes a
qualidade deles em comparação aos sistemas construídos na atualidade é muitas
vezes menor, o que aumenta também o risco de se fazer uma manutenção ou
evolução nos mesmos.
Objetivos
Metodologia de Trabalho
2 SISTEMAS DE SOFTWARE
Por tratar de assuntos muito complexos, serão apresentados apenas algumas das
estruturas mais comuns destas divisões dos sistemas de software.
2 Partes Interessadas são todas as pessoas que tem um interesse na realização do projeto. Em
Informática, estas pessoas são chamadas StakeHolders. Por exemplo: Gerente, Cliente e etc.
15
Existem três ciclos de vida primários de onde surgiram quase todos os ciclos de
vida existentes na atualidade. Muitos destes novos ciclos de vida foram formados
a partir da mistura de três ciclos básicos:
Este modelo de ciclo de vida já foi e ainda é muito utilizado, devido a algumas de
suas características, o que implica em muitas vezes se encontrar no mercado
sistemas legados que em sua criação e/ou evolução utilizam este tipo de ciclo de
3 Institute of Electrical and Electronics Engineers será apresentado como IEEE a partir de agora.
16
vida.
Uma das características deste ciclo de vida que o torna tão utilizado é o prazo de
entrega proporcionado por ele, como não há nenhuma exigência de
planejamento, documentação ou qualidade comprovada (testes documentados,
automáticos e etc...), o tempo gasto entre a concepção e a entrega é
proporcionalmente menor.
Este modelo de ciclo de vida entretanto ainda tem sua valia quando utilizado em
algumas entregas muito pontuais, como por exemplo customizações de sistemas,
adaptações emergenciais entre outras.
Este sistema de entrega única causa problemas pois sempre que é encontrada
alguma falha em qualquer parte do ciclo, o ciclo de trabalho recomeça e os prazos
de entrega do sistema são alterados, muitas vezes com a necessidade de
reajustes no escopo do projeto.
4 Top-Down que em português quer dizer "De cima para Baixo", assim como o nome "Cascata"
refere-se a seqüencia como este ciclo de vida é trabalhado, sempre numa ordem única, não
possibilitando mudança nesta ordem.
5 Pontos de Controle são intervalos entre entregas onde é possível avaliar possíveis informações
sobre a entrega desta parte do projeto, como lições aprendidas, riscos entre outros.
18
processo mais seguro e confiável do que o modelo Cascata puro, tende a deixar
muito complexo o Gerenciamento de Projetos, (PADUA, 2000, p.24).
Cada volta ao espiral envolve diversas atividades com o intuito de completar uma
parte do trabalho, isto gera diversas entregas ao longo do desenvolvimento do
sistema, que promovem validações a cada iteração, que por sua vez geram
informações sobre o andamento do projeto e necessidades de mudanças.
O principal problema do modelo em espiral é que ele requer uma gestão muito
20
Conforme Dr. Rick Kazman, Dr. Paul Clements e Len Bass arquitetura de software
“é a estrutura ou estruturas do sistema que abrange os componentes de software,
as propriedades externamente visíveis desses componentes e as relações entre
eles”, (BASS, 2003, p.21).
Não existe uma melhor ou pior arquitetura, cada uma apresenta vantagens e
desvantagens, e cabe a cada um escolher a que mais se adapta ao negócio que
será suportado pelo sistema. Para tanto é necessário ter um conhecimento prévio
dos tipos de arquitetura existentes e uma visão geral sobre como cada uma pode
auxiliar numa determinada necessidade.
George Schussel nos apresenta que o termo Cliente/Servidor foi utilizado pela
primeira vez nos anos 80, em referência aos computadores pessoais em rede e
que a atual estrutura Cliente/Servidor ganhou aceitação em meados dos anos 80,
ao dar a entender que sua arquitetura possibilitava mais usabilidade, flexibilidade,
interoperabilidade e escalabilidade em comparação ao centralizado Mainframe,
(SCHUSSEL, 2007).
Este sistema funcionou muito bem durante algum tempo, entretanto esta
arquitetura passou a gerar problemas de escalabilidade quando a quantidade de
requisições e o tamanho dos objetos de Internet cresceram.
Esta mesma divisão apresentada por Hug E. Williams e David Lane pode ser vista
na figura 10.
13 Query é a definição dada as consultas efetuadas nos Bancos de Dados através de uma
linguagem específica
28
Com base nas informações acima é possível entender que uma arquitetura três
camadas é uma arquitetura onde se divide o sistema em três partes, sendo a
primeira a parte do Banco de Dados que deveria conter muito pouca ou nenhuma
regra de negócio, sendo responsável apenas pelos dados do sistema, uma
segunda camada que contém toda a regra de negócio do sistema e que somente
ela efetua acessos a camada de Banco de Dados para efetuar as transações e
uma camada final onde se tem uma aplicação Cliente que também deve conter
pouca ou nenhuma regra de negócio e que tem como função principal ser a
interface da aplicação para o usuário final.
Desta forma é possível compreender que uma das idéias principais da Arquitetura
Orientada a Serviço (SOA) é facilitar a comunicação entre as pessoas de TI e as
pessoas de negócio. A maneira proposta para isto é que todas as chamadas ao
sistema sejam feitas através de chamadas de negócio, facilitando para que
29
Como complemento a idéia acima, Jeffrey Hasan e Mauricio Duran definem que
“Arquitetura Orientada a Serviço(SOA) representa um novo e envolvente modo de
construir aplicações distribuídas” e que os serviços são “componentes distribuídos
que provem uma interface bem definida dos processos e trafega as mensagens
através de XML”, (HASAN, 2006, p.1).
Desta forma entendemos que além da comunicação com o sistema ser feita
através de chamadas de negócio, toda a informação trafegada entre elas é feita
através da linguagem de marcação XML14.
Tecnicamente Jeffrey Hasan e Mauricio Duran explicam que “SOA é como outras
arquiteturas distribuídas que permite a você construir aplicações que utilizam
componentes em domínios separados. SOA utiliza Web Services como aplicação
entre os pontos, que são conceitualmente equivalentes a componentes proxy e
stub dos tradicionais sistemas distribuídos baseados em componentes, exceto
que a interação entre um provedor Web Service e o cliente é mais fracamente
acoplado”, (HASAN, 2006, p.2).
É detalhado neste caso o paradigma mais atual que compõe a maior parte dos
33
“Um objeto é uma entidade do mundo real que tem uma identidade. Objetos
podem representar entidades concretas (um arquivo no meu computador, uma
bicicleta) ou entidades conceituais (uma estratégia de jogo, uma política de
escalonamento em um sistema operacional). Cada objeto ter sua identidade
significa que dois objetos são distintos mesmo que eles apresentem exatamente
as mesmas características” e “A estrutura de um objeto é representada em termos
de atributos. O comportamento de um objeto é representado pelo conjunto de
operações que podem ser executadas sobre o objeto”, (RICARTE, 2007).
Neste caso é possível entender que um objeto é composto por atributos que
apresentam as características do objeto, os comportamentos que são as ações
que este objeto pode executar e o estado do objeto que apóia a manter a sua
identidade.
Muitas das definições apresentadas acima estão ilustradas nas figuras 12 e 13,
onde é possível visualizar as heranças das classes na figura 12 e as partes que
compões uma classe na figura 13.
3 QUALIDADE
As razões dadas por ele para a confusão com o termo qualidade são as
seguintes:
1. Qualidade não é uma idéia simples, mas sim um conceito multi
dimensional;
3. O termo qualidade faz parte do nosso uso diário e seu significado popular e
profissional podem ser muito diferentes.
O intuito com isto é ter uma base firme sobre o que é qualidade de software e o
que ela abrange, o que são testes de software e como estes podem ser aplicados
nos diferentes tipos de software além de como e porque podemos automatizar
testes de software.
Stephen H. Kan nos adverte dizendo que “o mais estreito senso de qualidade de
produto está diretamente ligado a um leque de erros no produto. Este é apenas o
significado mais básico de conformidade com os requisitos, porque se o software
contém muitos defeitos funcionais, o requisito desejado não está sendo atendido”,
(KAN, 2002).
Ao olhar qualidade de software por uma visão um pouco mais abrangente pode-
se perceber que não se deve preocupar somente com o teste do produto de
software em si, mas sim com todo o processo de construção do software.
Pensando neste problema, John W. Horch aponta em seu livro que os elementos
para a qualidade de um sistema de software são: Padrões, Revisões, Testes,
Analise dos Defeitos, Gerencia de Configuração, Segurança, Educação, Gerencia
de Vendas, Segurança e Gerencia de Riscos e cita ainda algumas adicionais
como Manutenção, Documentação, Considerações Organizacionais e a
Implementação de um Sistema Total de Qualidade de Software (HORCH, 2003).
Stephen H. Kan nos diz que “Além de satisfação total do cliente com o produto de
software, satisfação em direção a atributos específicos também é estimada”,
(KAN, 2002).
Com o texto acima é apresentado que não basta apenas atender os requisitos de
sistema para garantir a satisfação do cliente em relação ao produto de software,
mas que se deve atender alguns outros atributos considerados pelos clientes.
Ele também complementa dizendo que “estes atributos de qualidade não são
sempre do mesmo tipo. Por exemplo, quanto mais alta a complexidade funcional
do software, mais difícil torna-se alcançar manutenabilidade. Dependendo do tipo
de software e do cliente, diferentes atributos de qualidade serão necessários”,
(KAN, 2002).
Para a organização dos atributos existem pelo menos duas classificações básicas
para eles:
1. Funcionais – São aqueles atributos que pertencem a funcionalidade do
sistema, normalmente são estes atributos que recebem boa parte da
atenção pois eles estão diretamente ligados aos requisitos identificados
para o sistema;
A IBM por exemplo utiliza um grupo destes atributos que recebe o nome de
CUPRIMDSO, que atualmente foi atualizado para uma nova versão com o nome
de CUPRIMDSAPI que significa: (IPCOM, 2007)
● Capability (Capacidade) – Funcionalidade do sistema, ou seja, atender
aos requisitos funcionais;
● Usability (Usabilidade) – Quão intuitivo e fácil é o sistema para o usuário
final;
● Performance – Tempo de resposta do sistema para o usuário final;
● Reliability (Confiabilidade) – Livre de Falhas Operacionais, significa o
tempo entre as falhas;
● Installability (Instalabilidade) – De fácil instalação e configuração para
uso.
● Maintainability (Manutenabilidade) – Facilidade de corrigir problemas e
facilidade para criar e aplicar patchs17 de correção.
17 Patch, que significa Remendo em português é um pacote pequeno contendo uma atualização
ou mais comumente correções a um sistema de software.
43
Stephen H. Kan diz que “métricas de software podem ser classificadas em três
categorias: métricas de produto, métricas de processo e métricas de projeto”,
(KAN, 2002).
São apresentados abaixo cada uma das variáveis necessárias para que seja
gerado o indicador:
● O numerador neste caso é o número de defeitos válidos, ou seja, o número
conhecido de erros do sistema.
Para calcular o numerador por exemplo deve-se ter um controle dos defeitos do
sistema de forma atualizada e eficiente, para que o indicador resultante dos
cálculos sejam válidos e de uso confiável.
Com base no resultado deste indicador, é possível ter um controle real de como
anda a “saúde” do software em questão, além de haver a possibilidade de
estimar quantos defeitos poderão ser encontrados numa próxima versão do
software, utilizando a base histórica dos defeitos por tamanho de software.
Esta métrica foca principalmente nos problemas identificados pelo cliente durante
o seu uso, ao contrário da métrica de defeito onde apenas alguns tipos de erros
encontrados no sistema são selecionados para entrar no cálculo do indicador, na
métrica de problemas do cliente todos os problemas devem ser levados em
consideração, com algumas exceções.
“Problemas que não são considerados defeitos válidos podem ser problemas de
47
No caso da fórmula acima, tem-se que do total de defeitos reportados pelo cliente
no período são considerados apenas os defeitos válidos que se enquadram na
citação acima.
e onde:
Stephen H. Kan indica também três atividades que auxiliam a diminuir o valor do
PUM: (KAN, 2002)
1. Melhore o processo de desenvolvimento e reduza os defeitos do produto.
É necessário lembrar que apesar deste indicador poder ser gerado sem o
indicador anterior e apresentar algum resultado, são obtidos apenas dados
comparativos de interesse real quando se segue a dependência apresentada na
Figura 15.
Com esta métrica é possível ter uma estimativa aproximada de como a evolução
do software está acontecendo numa visão mais macro do que em relação a
métrica de defeitos, em compensação o resultado deste indicador é totalmente
dependente de ações efetuadas diretamente sobre o produto que podem ser
decisões tomadas a partir da análise do resultado da métrica de defeitos.
● Neutral (Neutro)
● Dissatisfied (Insatisfeito)
● Very dissatisfied (Muito Insatisfeito)
Baseado nos dados resultantes desta pesquisa da escala dos cinco pontos, ele
sugere também alguns possíveis indicadores a serem retirados e afirma que
vários outros podem ser encontrados com os dados da pesquisa.
A conclusão acima pode parecer obvia, porém pode-se ter a situação onde os
primeiros indicadores foram reduzidos e o de porcentagem de clientes satisfeitos
50
Assim como os exemplos acima, muitas outras informações podem ser obtidas a
partir de análises macro como estas.
20 Requisitos não funcionais (RNF) são requisitos de sistema que não dizem respeito diretamente
as funcionalidades, mas que são de extrema importância para o bom funcionamento e para
atender as necessidades dos usuários. Como exemplos temos: Performance, Usabilidade, e
etc...
21 Detalhes desta informação foram citados no item 3.1.1
51
Apesar de existir uma forma única documentar o planejamento dos testes (Casos
de Teste) independentemente da estratégia adotada, é de extrema importância
que cada estratégia de teste tenha seu próprio grupo de casos de teste, escritos e
planejados especificamente para aquele determinado tipo de estratégia escolhida.
Para fazer uma analogia do que foi apresentado, é possível imaginar que os
defeitos do software são como peixes num lago, e que cada estratégia de teste é
como uma das malhas que compõe a rede, elas são complementares e quanto
mais malhas mais peixes são capturados. A figura 16 ilustra parte desta analogia.
Desta forma, não existe uma melhor estratégia ou uma principal pela qual se deve
iniciar o trabalho, cabe a cada um conhecendo o seu negócio e seu sistema
escolher qual ou quais das estratégias irá gerar maior benefício ao ser
implementada.
Com isso entende-se que o teste de unidade utiliza a menor parte testável do
sistema como seu foco de trabalho.
A linguagem orientada a objetos deixa mais uma dúvida em relação aos testes de
unidade, que tem a ver com a sua capacidade de trabalhar herança. Ao trabalhar
com heranças, tem-se várias subclasses partilhando atributos e operações de
uma superclasse. Quando é necessário testar estas classes no contexto de
unidade, deve-se testar sempre as subclasses, ignorando as classes abstratas,
(PRESSMAN, 2006, p.303).
“Casos de teste devem descobrir erros tais como (1) comparação de tipos de
dados diferentes, (2) operadores ou precedência lógica incorretos, (3) expectativa
de igualdade quando o erro de precisão torna a igualdade improvável, (4)
comparação incorreta de variáveis, (5) terminação de ciclo inadequada ou
inexistente, (6) falha na saída quando iteração divergente é encontrada, e (7)
variáveis de ciclo inadequadamente modificadas”, (PRESSMAN, 2006, p.295).
serão testadas, e diversas vezes não há uma forma de se testar uma unidade
sem sua dependência.
Roger Pressman define que “teste de integração é uma técnica sistemática para
construir a arquitetura do software enquanto, ao mesmo tempo, conduz testes
para descobrir erros associados às interfaces. O objetivo é, a partir de
componentes testados no nível de unidade, construir uma estrutura de programa
determinada pelo projeto”, (PRESSMAN, 2006, p.297).
A partir disto é possível entender que os testes de integração tem como objetivo
principal validar se todas as interfaces de comunicação entre as unidades estão
funcionando corretamente. Desta forma é possível assegurar que o sistema
trabalha em conjunto e que as informações trocadas entre os módulos funcionam
corretamente.
57
Roger Pressman nos indica cinco passos para implementar uma integração
descendente: (PRESSMAN, 2006, p.298)
1. O módulo de controle principal é usado como Driver24 do teste, e os Stubs
são substituídos por todos os componentes diretamente subordinados ao
módulo de controle principal.
O processo continua a partir do item 2 até que todo o programa esteja completo.
Com base nas informações acima é possível deduzir que os testes de integração
são trabalhosos de se gerar, devido a isto muitas empresas acabam por
simplificar os testes de integração executando os testes diretamente sobre o
módulo principal e com o sistema já completo. Desta forma consegue-se o
mesmo resultado testando a integração de todas as interfaces do sistema e
evitando o trabalho de criação dos Drivers e Stubs fazendo com que o sistema
seja testado de forma mais rápida.
Esta abordagem apesar de ser muito utilizada pode trazer consequências ruins,
como o objetivo dos testes de integração é descobrir problemas de comunicação
entre as interfaces de comunicação, testar o sistema inteiro de uma vez pode
fazer com que seja muito difícil identificar o erro quando este aparecer, pois se o
erro estiver ocorrendo num dos componentes da baixa hierarquia do qual muitos
dos testes dependam, todos estes testes podem apresentar erro ao final e desta
forma torna-se difícil descobrir em qual interação de componentes houve o erro.
3. O agregado é testado.
Algo que faz com que os testes de integração ascendentes não sejam tão
utilizados quanto os testes de integração descendentes é o fato de não haver
como saltar nenhuma etapa o que mantém o custo para a implantação do mesmo
alta.
Roger Pressman apresenta uma sugestão para diminuir este custo descrevendo
que “de fato, se os dois níveis superiores da estrutura do programa são
integrados descendentemente, o número de Drivers pode ser reduzido
substancialmente e a integração de agregados é grandemente simplificada”,
(PRESSMAN, 2006, p.299).
60
2. Conduzir uma série de testes que simule maus dados ou outros erros em
potencial na interface do software;
Teste de Recuperação
Com base no texto, podemos resumir que o teste de recuperação força falhas no
sistema para validar se as ações de recuperação estão de acordo com as
definições dos requisitos do sistema.
Teste de Segurança
Como apresentado acima, o teste de segurança visa validar como o sistema está
preparado para sofrer tentativas de invasões, não somente invasões de hackers 27,
mas de funcionários descontentes, de concorrentes, e etc...
27 Hacker são pessoas com um alto grau de conhecimento em computadores, que utiliza deste
conhecimento para invadir e obter informações de locais não autorizados, normalmente
fazendo isso por diversão ou para testar seus próprios limites/conhecimentos.
63
facilitar uma invasão. Qualquer meio utilizado que consiga invadir o sistema de
qualquer forma deve ser comunicado e corrigido.
Teste de Estresse
situações dentro dos limites estipulados pelos requisitos que causam alguma
instabilidade ou comportamento estranho no sistema.
Teste de Desempenho
2006, p.300).
Esta técnica de teste visa o planejamento dos testes com foco no código, ou seja,
o responsável pelo planejamento do teste deve escrever os casos de teste com o
conhecimento de como o sistema se comporta internamente, suas condições e
ciclos, e deve garantir que aos testes finalizados, todas as condições ou ciclos do
sistema foram testadas por completo.
Roger Pressman apresenta esta definição de outra forma, dizendo que “teste de
caixa branca de software é baseado em um exame rigoroso do detalhe
procedimental. Caminhos lógicos internos ao software e colaborações entre
componentes são testados, definindo-se casos de testes que exercitam conjuntos
específicos de condições e/ou ciclos”, (PRESSMAN, 2006, p.318).
Um indicador comum utilizado para saber quanto deste código foi testado ou não
é chamado de cobertura de código, ele indica qual a porcentagem das linhas de
68
código que estão sendo testadas pelo menos uma vez. Um sistema que tem cem
por cento do seu código coberto não está livre de erros, porém haverá menos
chances de acontecer um erro por não ter testado uma parte do sistema.
Ele apresenta três explicações para o fato do sistema com cem por cento de
cobertura de código ainda apresentar erros, e são, (MYERS, 2004, p.13):
1. Ao fazer um teste com cem por cento de cobertura de código você não tem
garantia de que está testando a coisa certa. Por exemplo, imagine que foi
solicitado a você fazer uma função para ordenação ascendente e por
engano você criou uma ordenação descendente, neste caso cobrir cem por
cento do código não irá descobrir o erro sendo que o teste está validando
uma ordenação descendente.
Desta forma fica claro que não basta uma cobertura completa do código para
garantir eficiência, é necessário novamente um bom planejamento dos testes para
28 Missing Paths é como está no original em inglês e o autor se refere a trechos do código que
podem não ter sido implementados mesmo que fossem necessários.
29 Data-Sensitivity Errors refere-se a erros com devido a dados variáveis dentro do sistema.
69
Conforme explicado, é possível entender que esta técnica de teste nos permite a
partir de um processo de sistema, gerar um conjunto de caminhos de execução
que podem originar casos de teste com grande probabilidade de captura de erros.
A lista que segue contém uma definição mínima de partes importantes que
compõem a estrutura de caminho básico segundo Roger Pressman,
(PRESSMAN, 2006, p.319-326):
● Notação de Grafo de Fluxo – Esta é uma notação que representa
graficamente o fluxo de dados do programa possibilitando uma visão
externa importante para visualizar e definir os testes, nesta notação cada
grupo lógico do programa é numerado, e estes números juntamente com a
notação gráfica fornecem uma base para definição dos casos de teste. Um
exemplo de notação de grafo de fluxo é a figura 18.
70
30 A complexidade ciclomática é uma métrica de software que fornece uma medida quantitativa da
complexidade lógica de um programa.
71
Neste caso a atenção deste teste é voltada aos operadores de comparação como:
<, >, = e etc e operadores compostos como E(&), OU(|) e NÃO(¬). Uma condição
sem estes operadores é considerada uma operação booleana, (PRESSMAN,
2006, p.325).
Roger Pressman afirma que “teste de Ciclo é uma técnica de teste caixa branca
que focaliza exclusivamente a validade de construções de ciclo”, (PRESSMAN,
2006, p.326).
Com isto é possível entender que esta técnica tem como objetivo principal se
preocupar com os ciclos (loops) existentes no código da aplicação.
O teste de caixa preta ao contrario do teste de caixa branca não tem qualquer
preocupação com a estrutura interna do sistema. O teste de caixa preta é um
teste funcional e sua principal preocupação é se o componente ou o sistema
fazem o que foram projetados para fazer.
Desta forma o teste de caixa preta pode encontrar erros nas seguintes categorias,
(PRESSMAN, 2006, p.327):
● Funções incorretas ou omitidas;
● Erros de interface;
● Erros de estrutura de dados ou de acesso a base de dados externas;
● Erros de comportamento ou desempenho;
● Erros de iniciação e termino.
O teste de caixa preta assim como o teste de caixa branca também contém
técnicas de teste que geram maior valor aos resultados obtidos pelos casos de
teste, como apresentado a seguir.
Desta forma o grafo é apenas uma base que será utilizada por outros métodos
para gerar casos de teste que resultam em bons resultados. Boris Beizer
descreve alguns métodos de teste de comportamento que podem fazer uso dos
grafos, (BEIZER, 1990):
1. Modelagem de Fluxo de Transação – Os nós representam passos em
alguma transação (por exemplo, os passos necessários para fazer uma
reserva em uma linha aérea usando um serviço on-line), e as ligações
entre os nós do grafo representam as conexões lógicas entre os passos.
Particionamento de Equivalência
“Se o conjunto de objetos puder ser ligado por relações simétricas, transitivas e
reflexivas, uma classe de equivalência estará presente”, (BEIZER, 1995).
Roger Pressman nos informa algumas diretrizes que definem uma classe de
equivalência, (PRESSMAN, 2006, p.329):
1. Se uma condição de entrada especifica um intervalo, uma classe de
equivalência válida e duas inválidas são definidas.
A partir destas diretrizes é possível gerar os casos de teste para cada um dos
valores de entrada definidos. Os casos de teste devem ser selecionados de modo
que o maior número de atributos de uma classe de equivalência seja exercitado
ao mesmo tempo, (PRESSMAN, 2006).
Os casos de teste criados a partir destas classes de equivalência tem uma grande
chance de encontrar um erro, a partir destes valores é possível gerar as
combinações mais adequadas de casos de teste para a aplicação.
A técnica de análise de valor limite(AVL) tem como objetivo gerar casos de teste
que testem os valores de limite de um determinado parâmetro de entrada. Esta
técnica é um complemento a técnica de particionamento de equivalência, assim
ao invés de se selecionar todos os valores das classes de equivalência, a AVL
leva os casos de teste até as fronteiras da classe.
“Um grande número de erros ocorre nas fronteiras do domínio de entrada em vez
de no 'centro'. É por esta razão que a análise de valor limite (boundary value
analysis) foi desenvolvida”, (PRESSMAN, 2006, p.329).
O “teste de matriz ortogonal pode ser aplicado a problemas nos quais o domínio
de entrada é relativamente pequeno, mas grande demais para acomodar o teste
78
Para o caso acima foi apresentada uma avaliação dos resultados da matriz
ortogonal como, (PRESSMAN, 2006, p.331):
● Detecta e isola todas as falhas de modo singular. Uma falha singular é
um problema consistente com qualquer nível de qualquer parâmetro
singular.
A automação de testes não é uma obrigação, ela é uma opção e deve ser
levantada a sua viabilidade a cada caso. Muitas vezes o teste manual pode ser
mais eficiente e provavelmente mais barato do que um teste automatizado, a
automação tem um custo elevado e sua implantação precisa ser justificada.
“Criar um teste automatizado custa normalmente mais caro do que rodar o teste
manualmente uma vez”, (MARICK, 2007).
É possível perceber este aumento do custo dos testes manuais devido ao teste de
regressão na figura 20, que mostra o tempo necessário para testar cada versão
do sistema de forma manual, e como é aumentado o tempo necessário para
efetuá-lo.
80
Brian Marick aponta em seu artigo algumas perguntas que respondidas podem
auxiliar na escolha da viabilidade da automatização um determinado caso de
teste, (MARICK, 2007):
1. Automatizar este teste e executá-lo uma vez custa mais do que
simplesmente rodar o teste uma vez manualmente? Quanto é este custo a
mais?
“Automação não é uma bala de prata; ela apenas traz alguns problemas. Para
resolver o problema de automação, defina a metodologia de testes, então escolha
direito a tecnologia que irá ajudar você a implementar a metodologia”, (NGUYEN,
2006, p.34).
E eles sugerem que o ROI seja avaliado considerando que estes custos sejam
justificados por:
● Maior Velocidade/Mais testes?
● Maior Velocidade/Mais ciclos de testes?
● Melhor cobertura de testes a cada ciclo?
● Melhor qualidade dos testes?
Para poder fazer todas estas avaliações é necessário que se tenha uma boa
visibilidade.
Desta forma ele reforça que os testes de unidade devem ser escritos por
desenvolvedores, e que os desenvolvedores devem investir um tempo
considerável do seu trabalho desenvolvendo estes testes unitários.
Kent Back também diz que “tente montar um punhado de dados de teste, então
rode este punhado de testes e então limpe a sujeira”, (BACK, 2007).
Com isto ele defende que os testes sejam independentes um dos outros, e que ao
executar um teste, o ambiente deve ser limpo, ou seja, uma sujeira restante de
uma execução qualquer pode afetar diretamente os testes subseqüentes.
● Test Case (Caso de Teste) – É o caso de teste que será executado, neste
momento é chamada a função que está sendo testada com os parâmetros
configurados e o retorno pode ser devolvido numa das variáveis criadas na
Fixture por exemplo.
Os testes de integração são executados a partir dos casos de teste gerados para
esta estratégia de teste. A automação deste tipo de teste pode ser desenvolvida
tanto por testadores quanto por desenvolvedores, porém se for desenvolvida por
87
Kent Back quando escreveu sobre o framework do SUnit36 faz uma recomendação
para os testes de integração. “Eu recomendo que um testador independente
escreva os testes de integração”, (KENT, 2007).
Sendo assim, é arriscado que a pessoa que construiu o sistema seja a mesma
pessoa a criar e executar os testes. Uma boa alternativa para este caso é treinar
os testadores para conhecer o mínimo da linguagem de programação a ponto de
poderem desenvolver os testes de integração automatizados, ganhando tempo
dos desenvolvedores e evitando problemas.
3. Limpar o ambiente para que o próximo teste seja executado sem chance
de erros devido à algum vestígio do teste anterior.
Alguns dos pontos negativos são o alto custo para preparar o ambiente antes de
cada teste, a manutenção, o acompanhamento constante e o tempo utilizado
tanto por um desenvolvedor ou um testador que tenham que desenvolver este
teste de forma automatizada.
Como apresentado no item 3.3.3, o teste de sistema engloba uma série de outros
testes. Desta forma são apresentadas as ferramentas mais comuns referentes a
automação de testes de sistema.
Dentre as ferramentas que empregam uma ou mais destas habilidades podem ser
citadas:
1. Rational Functional Tester (RFT) – Ferramenta da IBM para automação
de testes de sistema.
Uma outra definição para software legado é citada por Roger Pressman dizendo
que “Sistemas de software legado (...) foram desenvolvidos décadas atrás e tem
sido continuamente modificados para satisfazer as mudanças nos requisitos de
negócio e nas plataformas de computação. A proliferação de tais sistemas está
causando dor de cabeça para grandes organizações que os consideram
dispendiosos de manter e arriscados de evoluir”, (PRESSMAN, 2006, p.8).
Desta forma é possível concluir que um sistema legado é qualquer sistema que
tenha sido implantado e está em uso atualmente. É possível deduzir também que
se estes sistemas ainda estão em uso, ou ainda geram muito lucro (que
dificilmente poderia ser obtido com outro substituto), ou são operações vitais para
a empresa no qual o risco da migração seria muito alto.
Roger Pressman diz que a melhor solução para este problema de má qualidade
pode ser simplesmente não fazer nada, (PRESSMAN, 2006, 9).
Entretanto ele mesmo apresenta algumas razões pelas quais os sistemas legados
tendem a se manter em evolução constante, o que nos impede de simplesmente
não fazer nada, (PRESSMAN, 2006, 9):
● O software precisa ser adaptado para satisfazer as necessidades do novo
ambiente ou tecnologia computacional.
Roger Pressman apresenta em seu livro que “durante os últimos 30 anos, Manny
Lehman e seus colegas realizaram análises detalhadas de software e sistemas de
qualidade industrial em um esforço para desenvolver uma teoria unificada para
evolução de software”, (PRESSMAN, 2006, p.9).
O resultado deste esforço foi um trabalho dos quais saíram algumas leis das
quais Roger Pressman cita algumas derivações, (PRESSMAN, 2006, p.9):
● Lei da Modificação Contínua (1974) – Sistemas tipo-E39 devem ser
continuamente adaptados ou então eles se tornam progressivamente
menos satisfatórios.
A partir da leitura destas leis é possível compreender que boa parte delas
constituem parte do dia a dia das pessoas que trabalham com sistemas. Estas
leis representam de forma adequada problemas que podem se gerados se um
acompanhamento correto da evolução do sistema não estiver sendo efetuado.
Além disso, Calvin Lawrence apresenta quais são os pontos principais que
incomodam nos sistemas legados, (LAWRENCE, 2007):
● Alto custo de posse, incluindo custo de manutenção, operação e
atualização ambos de hardware e software. Exemplo: Preço por CPU
utilizada nos Mainframes.
evolução.
40Patches são pacotes contendo atualizações ou evoluções do sistema, que são atualizados a um
sistema em produção.
100
Com o que foi visto até o momento é possível perceber que os sistemas legados ,
apesar de sua vital importância para o negócio tem se tornado um incomodo para
muitas empresas. Desta forma, como não é possível simplesmente substituir ou
ignorar o sistema legado, as empresas vêem tentado modificar o sistema legado
para que ele possa gerar ainda mais valor, justificando assim os seus custos.
“Num ambiente de SOA, tarefas de negócio são realizadas por executar uma
série de 'serviços', que por sua vez participa do processo de negócio. Os serviços
têm uma maneira bem definida de conversar com outros serviços e maneiras
bem-definidas em que eles conversam de volta. A implementação de um serviço
não importa a um usuário, contanto que o serviço responda no tempo esperado e
ofereça a qualidade de serviço exigida por ele. Esta forma de contato com o
serviço deve ser segura, de confiança, e rápida, e isto faz do SOA ideal para
ambientes de TI onde software e hardware de muitos vendedores estão
instalados, ou em um ambiente em que os sistemas existentes são misturados
com novas aplicações, tecnologias de integração ou fontes de dados”,
(LAWRENCE, 2007).
Desta forma ele nos apresenta que a arquitetura SOA é ideal para ser
implementada em sistemas legados que necessitam de interação com outros
sistemas, fornecendo informações que antes só podiam ser efetuadas através de
processamento em lote, e que agora podem ser efetuadas em tempo real.
Desta forma Calvin Lawrence nos apresenta três estágios para transformar um
sistema legado em SOA, que são melhorar a experiência do usuário, adaptação
para aumento dos relacionamentos e inovação para novas capacidades,
(LAWRENCE, 2007). Estes estágios são apresentados na seqüência.
102
LEGADOS
Este capítulo apresenta uma proposta de passos que podem ser efetuados para
automatizar testes em sistemas legados. Todo o conteúdo apresentado
anteriormente tem o intuito de fornecer uma base para esta proposta.
Desta forma, quando se trata de um sistema legado que permanecerá em uso por
tempo indeterminado, uma alternativa interessante para melhorar a qualidade do
sistema pode ser iniciar um processo de automação de testes, evitando falhas,
aumentando a segurança e podendo servir como um suporte confiável para uma
futura transformação do sistema legado.
Esta segunda fase trata-se de um ciclo que se repete até que a lista dos projetos
107
Este conhecimento é importante para poder definir quais partes do sistema devem
ser testadas (ou pelo menos que devem ser testadas com maior prioridade), desta
forma é possível conhecer onde a automação de testes do legado pode trazer
maiores benefícios.
A lista gerada por este passo do processo define quais são as partes do sistema
que podem encontrar mais erros ou trazer maior segurança para o sistema
legado. A ordenação da mesma é importante para definir quais partes do sistema
terão seus testes automatizados de forma prioritária, garantindo uma diminuição
dos erros ou uma garantia de que as modificações do sistema não irão danificar
uma determinada funcionalidade crítica do sistema legado.
Entretanto são apresentados a seguir alguns casos que podem favorecer uma
determinada estratégia de teste:
● Um sistema legado em evolução, onde existem desenvolvedores
trabalhando para incluir funcionalidades ou corrigir erros constantemente
pode indicar um ambiente adequado para automação de testes unitários ou
de integração, pois além de serem testes muito válidos por capturarem
erros em fases iniciais dos projetos, também são ideais para serem
integrados as tarefas dos desenvolvedores. Esta manutenção contínua ao
sistema legado fará com que a cobertura dos testes em relação ao sistema
aumente rapidamente;
Após a escolha das estratégias de teste, é necessário criar os casos de teste para
a estratégia escolhida. O item 3.4 nos apresenta as técnicas de teste de caixa
branca e caixa preta, estas duas técnicas de teste apresentam diversas formas
comprovadas que podem auxiliar na criação de casos de teste mais efetivos e
com maiores chances de captura de erros.
Num exemplo, um primeiro projeto abrange uma parte crítica do sistema e teve
seus casos de teste automatizado através de uma ferramenta de record &
playback, no momento da conclusão do projeto, a empresa passa a ter um
conhecimento específico sobre esta estratégia e técnica de teste utilizado,
conhecimento este que pode ser replicado para o processo de desenvolvimento.
Outro caso onde a empresa pode incluir este passo é no processo de correção de
erros, onde cada erro encontrado e corrigido deve ser avaliado quanto a
possibilidade de automação do teste. Este processo possibilita que o erro sempre
seja verificado e impede um retorno deste mesmo erro num momento futuro.
Descobrir este erro e aprender com ele fará com que outros projetos de
automação não falhem, gerando uma maior confiabilidade no processo, o fato de
um projeto de automação ter falhado também significa que a empresa investiu
menos recursos do que se tivesse tentado implementar esta automação
diretamente no processo de desenvolvimento de sistemas, poupando assim
desenvolvedores, testadores e todos aqueles que teriam de conviver com a
mudança referente a automação de testes no seu dia a dia. Isto também faz com
que a equipe envolvida no projeto ganhe experiência em relação ao processo de
automação de testes, podendo auxiliar no aprendizado de outras equipes que
serão envolvidas nas automações de teste dos próximos projetos.
6 CONCLUSÃO
A má qualidade dos sistemas legados faz com que as empresas não tenham
condições de evoluir este sistema devido aos riscos de efetuar uma manutenção
ou evolução no mesmo. Por serem sistemas de importância vital para a empresa,
qualquer manutenção ou melhoria só é efetuada quando os benefícios
ultrapassam em muito os riscos apresentados para o projeto. Desta forma, a má
qualidade de um sistema legado pode impedi-lo de evoluir até chegar um ponto
onde o custo para mantê-lo ativo faz com que a empresa se torne menos
produtiva, diminuindo sua capacidade de se manter competitiva no mercado,
entretanto as informações contidas nestes sistemas são tão críticas quanto a
competitividade da empresa no mercado. Devido a estes problemas, o
investimento destas empresas no aumento da qualidade do software legado é
justificado, e desta forma a melhoria da qualidade deste sistema o torna mais
confiável, diminuindo o risco dos projetos de manutenção e melhoria e fazendo
com que o sistema legado volte a se tornar produtivo.
Os sistemas de software legados entretanto podem ter sido criados a tanto tempo,
que acumularam uma quantidade muito grande de funcionalidades neste período,
e desta forma pode não ter havido uma preocupação em relação a documentação
e registro dos testes efetuados, gerando assim um sistema enorme no qual seria
inviável investir na criação de testes automatizados para todo o sistema.
Para propor uma solução para estes problemas este trabalho desenvolveu uma
solução de automação de testes em sistemas legados para se obter uma melhoria
no processo de qualidade. A solução proposta é constituída de cinco passos, que
propõe uma implementação da automação dos testes de forma gradual e
incremental, possibilitando a evolução do produto em paralelo a este processo.
Esta proposta ainda necessita de uma comprovação prática para verificar se
todas as informações contidas em livros, bibliotecas e artigos sejam efetivas.
Esta proposta fornece uma base inicial para futuras pesquisas que possam
complementar e melhorar o processo desenvolvido pelo autor.
119
REFERÊNCIAS
MYERS, Glenford J. The Art of Software Testing: Segunda Edição: John Wiley &
122
ROMAN, Steven. Access Database Design and Programming: O' Reilly, 2002