Escolar Documentos
Profissional Documentos
Cultura Documentos
Teoria e Prtica
Abstract
Software testing has been shown to be important for reducing the number of product faults, attracting
interest from both academy and industry. As novel development approaches and support technologies
are proposed, new challenges arise in the testing of software developed in these new contexts. For
instance, object-oriented (OO) programming, already adopted by the developer community, and, more
recently, aspect-oriented (AO) programming, have motivated various efforts for the establishment of
novel testing approaches and criteria. The goal of this chapter is to present theoretical and practical
aspects of the software testing activity in the OO and AO software development context. In particular,
we emphasize structural and fault-based techniques with the support of JaBUTi and JaBUTi/AJ testing
tools, developed by the software engineering research group at ICMC/USP.
Resumo
O teste de software tem se mostrado importante para reduzir a quantidade de defeitos presentes
nos produtos, atraindo o interesse tanto da academia quanto da indstria. medida que surgem
novas abordagens de desenvolvimento e tecnologias de apoio, surgem tambm novos desafios re-
lacionados ao teste de software aplicado nesses contextos. Por exemplo, o paradigma orientado a
objetos (OO) j consolidado entre a comunidade desenvolvedora e, mais recentemente, a programa-
o orientada a aspectos (POA) tm motivado diversos esforos dedicados ao estabelecimento de
abordagens e critrios de teste nesses contextos. O objetivo deste texto apresentar os aspectos
tericos e prticos relacionados atividade de teste de software, tanto no contexto de software OO
quanto orientado a aspectos (OA). Em particular, so enfatizadas as tcnicas estrutural e baseada
em defeitos com o apoio das ferramentas de teste JaBUTi e JaBUTi/AJ, desenvolvidas pelo grupo de
pesquisas em Engenharia de Software do ICMC/USP.
13
Masiero, Lemos, Ferrari e Maldonado
1.1. Introduo
Muitas propostas de tcnicas e ferramentas para a verificao, validao
e teste de software tm sido apresentadas no contexto da rea agregada sob
o nome de Garantia de Qualidade de Software (GQS). Dentre elas, o teste
uma das mais utilizadas e consiste na execuo de um produto com a inteno
de revelar defeitos. Sua importncia deve-se ao fato das outras atividades de
GQS serem insuficientes para a descoberta dos erros introduzidos ao longo do
desenvolvimento do software [Pressman 2000, Myers et al. 2004].
Apesar de ser impossvel provar que um software est absolutamente cor-
reto por meio de testes, a sua utilizao fornece evidncias da conformidade
com as funcionalidades especificadas [Myers et al. 2004]. Alm disso, uma
atividade de teste conduzida de forma sistemtica e criteriosa auxilia no en-
tendimento dos artefatos testados e evidencia as caractersticas mnimas do
ponto de vista da qualidade do software [Harrold 2000, Weyuker 1996].
A aplicao de um critrio de teste est fortemente condicionada sua
automatizao, sendo ento de fundamental importncia o desenvolvimento
de ferramentas de teste. Sem a utilizao de ferramentas que automatizem
a aplicao das tcnicas e critrios associados, a atividade de teste torna-
se onerosa, propensa a erros e limitada a programas muito simples. Dessa
forma, a qualidade do teste, alm de depender das tcnicas e critrios sendo
utilizados, tambm depende da disponibilidade de ferramentas de apoio. Alm
disso, ferramentas de teste facilitam a conduo de estudos experimentais que
visam avaliar e comparar os diversos critrios de teste [Vincenzi 2004].
Com a consolidao do paradigma orientado a objetos (OO) para de-
senvolvimento de software durante os anos 80, diversos esforos tm sido
dedicados ao estabelecimento de tcnicas e critrios de teste no contexto
desse paradigma. Embora a orientao a objetos tenha trazido benefcios
para o projeto e desenvolvimento de software, oferecendo uma nova viso
de como decompor problemas e novas tcnicas para modelar e implemen-
tar solues para esses problemas [Booch 1994], o teste de software OO
apresenta um novo conjunto de desafios ao engenheiro de software, relacio-
nados s caractersticas e construes especficas do paradigma OO como,
por exemplo, encapsulamento, herana, polimorfismo e acoplamento dinmico
[McDaniel and McGregor 1994, Binder 1999].
Alm disso, mesmo com o desenvolvimento de tcnicas para construo
de software OO, observa-se que independentemente da tcnica utilizada ou do
modo como o sistema decomposto, alguns interesses pertinentes encontram-
se espalhados ou entrelaados nas vrias unidades do cdigo desenvolvido,
no estando portanto decompostos de forma organizada e localizada em m-
dulos separados [Elrad et al. 2001]. A Programao Orientada a Aspectos
(POA) surgiu no final da dcada de 90 como uma opo para solucionar es-
sas dificuldades, permitindo que interesses que se encontram espalhados ou
entrelaados possam ser implementados to separadamente quanto possvel
[Kiczales et al. 1997]. Contudo, assim como para a orientao a objetos, a
14
Teste de Software OO e OA: Teoria e Prtica
15
Masiero, Lemos, Ferrari e Maldonado
ao esperado [Adrion et al. 1982]. Dessa forma, podem ser definidas quatro
atividades no teste de software: planejamento, projeto dos casos de teste, exe-
cuo dos casos de teste e avaliao dos resultados [Pressman 2000]. Essas
atividades podem ser realizadas em cada uma das seguintes fases, nas quais
se divide tradicionalmente o teste de um software:
Teste de unidade: busca identificar defeitos1 na lgica e na implemen-
tao de cada unidade do software, isoladamente. Segundo o padro
IEEE 610.12 de 1990 [IEEE 1990], uma unidade um componente de
software indivisvel. Para se testar as unidades de um sistema, tem-se
a necessidade da implementao de pseudo-controladores (drivers) e
pseudo-controlados (stubs). Os drivers so responsveis por coordenar
e ativar a unidade que est sendo testada, passando a ela os dados de
teste. Os stubs, por sua vez, consistem em implementaes simplifica-
das que substituem entidades que interagem com a unidade em teste.
Teste de integrao: visa a descobrir defeitos nas interfaces das unida-
des, durante a integrao da estrutura do programa. No caso de um
programa OO, considerando-se o mtodo como uma unidade, um tipo
de teste de integrao consiste em testar cada mtodo juntamente com
os mtodos chamados direta ou indiretamente por ele dentro da mesma
classe. Para um dado paradigma, a definio do que consiste uma uni-
dade implica em diferentes definies de teste de unidade e de integra-
o. Neste texto, essas definies so apresentadas na Seo 1.3.1.
Teste de sistema: quer identificar defeitos nas funes e caractersticas
de desempenho do sistema como um todo. Alm disso, procura-se verifi-
car se todos os elementos do sistema (por exemplo, hardware, pessoal e
bases de dados) combinam adequadamente e se a funo/desempenho
global do sistema alcanada.
Um caso de teste um par ordenado (d, S(d)) tal que d um elemento
de um determinado domnio D (d D) e S(d) a sada esperada para uma
dada funo da especificao, quando d utilizado como entrada. Uma veri-
ficao completa de um determinado programa P poderia ser obtida testando-
se P com um conjunto de casos de teste T que inclui todos os elementos do
domnio. Entretanto, como geralmente o conjunto de elementos do domnio
infinito ou muito grande, torna-se necessria a obteno de subconjuntos
desses casos de teste. Para isso, podem ser utilizados critrios de teste que
auxiliam o testador, fornecendo um mtodo para a avaliao de conjuntos de
1Neste texto procura-se seguir o padro IEEE 610.12-1990 [IEEE 1990] nas definies
utilizadas para os termos defeito, erro e falha. Defeito definido como uma divergn-
cia entre o produto de software desenvolvido e o produto supostamente correto; erro
definido como um estado interno do produto de software que diverge do estado correto,
gerado pela execuo de um defeito presente nesse produto; e falha definida como a
manifestao externa de um erro quando esse interfere nos comandos que produzem a
sada do produto em execuo.
16
Teste de Software OO e OA: Teoria e Prtica
17
Masiero, Lemos, Ferrari e Maldonado
18
Teste de Software OO e OA: Teoria e Prtica
d=definio
uc=cuso
1 d ={s} up=puso
up={s} up={s}
d={achar, valid_id}
2 3 uc={achar, s}
public static boolean verify(String s)
{
/* 01 */ if (s == null || s.length() == 0) up={s,valid_id} up={s,valid_id}
/* 02 */ return false;
/* 03 */ char achar;
/* 03 4 5 d={i}
*/ boolean valid_id;
/* 03 */ valid_id = true;
/* 03 */ achar = s.charAt(0);
/* 03 */ valid_id = valid_s(achar);
/* 03 */ if (s.length() == 1 && valid_id)
/* 04 */ return true;
/* 05 */ int i = 1; 6
/* 06 */ while (i < s.length()) {
/* 07 */ achar = s.charAt(i); up={i,s} up={i,s}
/* 07 */ if (!valid_f(achar))
/* 08 */ valid_id = false;
/* 09 d={achar}
*/ i++;
7 10
/* 09 uc={achar,
*/ }
s}
/* 10 */ if (valid_id && (s.length() <= 6))
/* 11 */ return true; up={s} up={s}
/* 12 */ return false;
/* 12 */ }
d={valid_id} 8 11 12
d={i}
9 uc={i} 13
19
Masiero, Lemos, Ferrari e Maldonado
20
Teste de Software OO e OA: Teoria e Prtica
DM(P,T )
ms(P, T ) = M(P)EM(P)
Sendo:
ms(P,T): escore da mutao (mutation score);
DM(P,T): nmero de mutantes mortos por T;
21
Masiero, Lemos, Ferrari e Maldonado
22
Teste de Software OO e OA: Teoria e Prtica
23
Masiero, Lemos, Ferrari e Maldonado
24
Teste de Software OO e OA: Teoria e Prtica
1 -connections *
*
Call Connection
* -isMobile : Boolean
-state : int
*
+complete() : void
+drop() : void
1 -caller * +connects() : bool
Customer
-receiver -name : String
-phoneNumber : String
-areacode : int Local LongDistance
1
-password : String
-calls
+addCall()
+removeCall() -caller
+localTo()
+pickup()
+hangup() 1
+merge()
1 -receiver
25
Masiero, Lemos, Ferrari e Maldonado
26
Teste de Software OO e OA: Teoria e Prtica
27
Masiero, Lemos, Ferrari e Maldonado
*
Call
Timer
* -startTime : long
-stopTime : long
-connections *
1
1 -caller
Connection
Customer
-receiver -isMobile : Boolean
-name : String -state : int
-phoneNumber : String *
+complete() : void
-areacode : int
1 +drop() : void
-password : String
* +connects() : bool
-calls
+addCall()
+removeCall() -caller
+localTo()
+pickup()
+hangup() 1
Local LongDistance
+merge()
1 -receiver
3 A maior parte desta seo foi baseada no livro de Laddad [Laddad 2003].
28
Teste de Software OO e OA: Teoria e Prtica
operador de
palavra-chave para tipo do conjunto composio
declarar um de juno
conjunto de juno
29
Masiero, Lemos, Ferrari e Maldonado
30
Teste de Software OO e OA: Teoria e Prtica
31
Masiero, Lemos, Ferrari e Maldonado
32
Teste de Software OO e OA: Teoria e Prtica
0: aload_0
1: invokespecial java.lang.Object.<init> ()V (15)
4: aload_0
...
30: ifeq #48
33: new <telecom.Local> (32)
...
48: new <telecom.LongDistance> (36)
60: aload_0
...
Uma vez que o grafo DU de cada mtodo tenha sido obtido, critrios po-
33
Masiero, Lemos, Ferrari e Maldonado
dem ser definidos para derivar diferentes requisitos de teste, os quais podem
ser utilizados tanto para avaliar a qualidade de um determinado conjunto de
teste quanto para a prpria gerao de dados de teste. Ao todo, oito critrios
de teste estruturais foram definidos. Vincenzi [Vincenzi 2004] optou por sepa-
rar os requisitos de teste em dois conjuntos disjuntos: (1) os que podem ser
cobertos durante a execuo normal do programa, denominados independen-
tes de exceo; e (2) os que para serem cobertos exigem, obrigatoriamente,
que uma exceo tenha sido lanada, denominados dependentes de exceo.
Desse modo, foram estabelecidos os seguintes critrios:
Todos-Ns:
Todos-Ns-Independentes-de-Exceo (Todos-Nsei ): Requer que
cada n n N do grafo DU que alcanvel por pelo menos um ca-
minho livre de exceo, ou seja, caminhos que no incluam arestas
de exceo, seja exercitado por algum caso de teste.
Todos-Ns-Dependentes-de-Exceo (Todos-Nsed ): Requer que
cada n n N do grafo DU que no alcanvel por pelo menos
um caminho livre de exceo seja exercitado por algum caso de
teste.
Todas-Arestas:
Todas-Arestas-Independentes-de-Exceo (Todas-Arestasei ): Re-
quer que cada aresta e E do grafo DU que alcanvel por pelo
menos um caminho livre de exceo seja exercitada por algum
caso de teste.
Todas-Arestas-Dependentes-de-Exceo (Todas-Arestased ): Re-
quer que cada aresta e E do grafo DU que no alcanvel por
pelo menos um caminho livre de exceo seja exercitada por algum
caso de teste.
Todos-Usos:
Todos-Usos-Independentes-de-Exceo (Todos-Usosei ): Requer
que seja exercitado pelo menos um caminho livre de exceo e
livre de definio para uma varivel definida em um n n para todo
n e toda aresta que possui um uso da mesma varivel e que possa
ser alcanada a partir de n.
Todos-Usos-Dependentes-de-Exceo (Todos-Usosed ): Requer
que seja exercitado pelo menos um caminho que no seja livre
de exceo mas que seja livre de definio para uma varivel defi-
nida em um n n para todo n e toda aresta que possui um uso da
mesma varivel e que possa ser alcanada a partir de n.
Todos-Potenciais-Usos [Maldonado 1991]:
Todos-Pot-Usos-Independentes-de-Exceo (Todos-Pot-Usosei ):
Requer que seja exercitado pelo menos um caminho livre de
exceo e livre de definio de uma varivel definida em um n n
para todo n e toda aresta possvel de ser alcanada a partir de n.
34
Teste de Software OO e OA: Teoria e Prtica
Todos-Pot-Usos-Dependentes-de-Exceo (Todos-Pot-Usosed ):
Requer que seja exercitado pelo menos um caminho que no seja
livre de definio mas que seja livre de definio para varivel
definida em um n n para todo n e toda aresta possvel de ser
alcanada a partir de n.
Apesar de se ter evidncias da viabilidade prtica da aplicao desses cri-
trios no teste intra-mtodo, estudos experimentais e tericos ainda so ne-
cessrios para avaliar detalhadamente os resultados [Vincenzi 2004]. Alm
disso, o teste estrutural por si s apresenta algumas limitaes em sua apli-
cao como, por exemplo, o problema da no-executabilidade, que acontece
quando no existem dados de teste que faam com que requisitos de teste em
particular sejam satisfeitos [Zhu et al. 1997].
Em particular o custo, eficcia e dificuldade de satisfao entre os critrios
so propriedades interessantes para serem investigadas nesse contexto. A
ferramenta JaBUTi que implementa os critrios apresentados aqui, e ser vista
na Seo 1.4, pode auxiliar na conduo de tais estudos, j que fornece uma
maneira automatizada de aplicao do teste estrutural.
Teste Estrutural de Integrao OO
At o presente momento, poucos trabalhos abordam o teste estrutu-
ral de integrao no contexto de programas OO. Entretanto, alguns es-
foros podem ser observados nessa direo [Harrold and Rothermel 1994,
Alexander and Offutt 2000]. Em particular, pode ser destacado o trabalho de
Harrold e Rothermel [1994], que adapta o teste de fluxo de dados para clas-
ses.
Assim como so testados os procedimentos de forma isolada (teste intra-
procedimental) e a interao entre eles (teste interprocedimental), a mesma
idia pode ser aplicada aos mtodos isolados de uma classe (teste intra-
mtodo abordado anteriormente), e aos mtodos de uma classe que intera-
gem entre si (teste inter-mtodo). Alm disso, no paradigma OO devem ser
consideradas tambm as interaes de fluxo de dados que acontecem quando
usurios de uma classe invocam seqncias de mtodos de maneira arbitrria
[Harrold and Rothermel 1994]. Por exemplo, em uma classe D, com atributo a e
mtodos m1 , m2 , m3 , deve ser analisado se as diferentes seqncias de chama-
das (por exemplo: m2 , m1 , m3 , m2 ) no provocam nenhum estado inconsistente
na classe D com relao ao atributo a.
Harrold e Rothermel consideram ainda o teste de fluxo de dados na inte-
grao das classes, que corresponde a um quarto nvel de teste, o inter-classe.
Esse tipo de teste envolve os pares def-uso em que a definio de uma vari-
vel se encontra em uma classe e o uso em outra. Detalhes sobre o teste de
integrao no so tratados aqui, j que neste texto dada nfase ao teste
de unidade. No entanto cabe destacar que esses problemas so objetos dos
trabalhos em andamento de alguns grupos de pesquisas em Engenharia de
Software.
Assim como na POO, para que os critrios estruturais possam ser aplicados
35
Masiero, Lemos, Ferrari e Maldonado
36
Teste de Software OO e OA: Teoria e Prtica
37
Masiero, Lemos, Ferrari e Maldonado
38
Teste de Software OO e OA: Teoria e Prtica
39
Masiero, Lemos, Ferrari e Maldonado
uma classe podem ser considerados como variveis globais, pois so visveis
para todos os mtodos pertencentes classe. Dessa forma, o conjunto de va-
riveis globais na aplicao de teste de mutao em programas Java pode ser
restringido ao conjunto dos atributos da classe em teste.
Para o teste de mutao de programas OO, escritos em C++ e Java, Vin-
cenzi [2004] avaliou a aplicabilidade de conjuntos de operadores de mutao
definidos originalmente para serem aplicados em teste de mutao de pro-
gramas C [Agrawal et al. 1989, Delamaro 1997, Delamaro et al. 2001] e Java
[Ma et al. 2002]. Vincenzi procurou adaptar a aplicao destes operadores
para os nveis de teste intra-mtodo, inter-mtodo e inter-classe. Cada um dos
conjuntos foi avaliado e, quando necessrio, foram propostas as adaptaes
necessrias.
Vale ressaltar que cada linguagem possui particularidades. Sendo assim,
dependendo do tipo de defeito que se deseja enfatizar no teste, novos ope-
radores de mutao podem ser definidos para model-los. Por exemplo, em
alguns pontos, a linguagem C++ pode ser considerada mais flexvel do que
Java pela possibilidade de se definir heranas mltiplas e sobrecargas de ope-
radores. Novos operadores de mutao poderiam ser propostos para tratar
exclusivamente esses defeitos.
A aplicao do teste de mutao de programas OO nos nveis de unidade
e integrao discutida a seguir. Os conjuntos de operadores para cada fase
de teste so apresentados, inclusive suas aplicabilidades em programas Java
e C++.
Teste de Mutao de Unidade (Teste Intra-Mtodo)
Agrawal et. al [1989] definiram um conjunto de 80 operadores de mutao
para teste de unidade de programas escritos na linguagem C. Os operado-
res so distribudos em quatro classes: cinco operadores para mutao de
constantes, 16 operadores para mutao de comandos, 12 operadores para
mutao de variveis e 47 operadores para mutao de operadores6 . Cada
classe de operadores formada por um conjunto de operadores que modelam
diferentes defeitos em estruturas de um mesmo tipo. Por exemplo, o operador
SWDD (while Replacement by do-while), que pertence classe de ope-
radores para mutao de comandos, substitui o comando de iterao while
pelo comando do-while. A letra inicial do nome de cada operador possibilita
a identificao da classe qual esse operador pertence, sendo elas C cons-
tante, S comando (statement), V varivel e O operador. As demais letras
so utilizadas para descrever o operador, como no exemplo apresentado.
Analisando a aplicabilidade dos 80 operadores para as linguagens C++ e
6Neste texto, o termo operador utilizado tanto para se referir a um operador de muta-
o quanto a um operador tradicional de uma linguagem de programao (por exemplo,
operadores aritmticos ou lgicos). Se a utilizao do termo causar ambigidade, o
termo completo (por exemplo, operador de mutao ou operador aritmtico) ser uti-
lizado.
40
Teste de Software OO e OA: Teoria e Prtica
Java, Vincenzi [2004] concluiu que todos so aplicveis a C++, por se tratar de
um superconjunto da linguagem C, e 59 so aplicveis a Java. Dentre os ope-
radores no aplicveis a Java, esto um operador que trata do comando goto,
cinco operadores que so especficos para mutao de ponteiros e registros
(struct), e 15 operadores de mutao de operadores.
Vincenzi tambm definiu sete novos operadores para tratar de caractersti-
cas especficas da linguagem Java, sendo que trs desses tambm so aplic-
veis a C++. Os quatro novos operadores exclusivos para Java foram definidos
para tratar dos comandos break e continue, enquanto os trs aplicveis
tanto a Java quanto C++ foram definidos para tratar de variveis de referncia.
A descrio desses operadores apresentada na Tabela 1.1. A descrio dos
demais operadores pode ser encontrada no trabalho de Agrawal et al. [1989].
41
Masiero, Lemos, Ferrari e Maldonado
42
Teste de Software OO e OA: Teoria e Prtica
43
Masiero, Lemos, Ferrari e Maldonado
44
Teste de Software OO e OA: Teoria e Prtica
45
Masiero, Lemos, Ferrari e Maldonado
46
Teste de Software OO e OA: Teoria e Prtica
47
Masiero, Lemos, Ferrari e Maldonado
48
Teste de Software OO e OA: Teoria e Prtica
49
Masiero, Lemos, Ferrari e Maldonado
Uma vez que o conjunto de requisitos de teste de cada critrio foi determi-
nado, tais requisitos podem ser utilizados para avaliar a qualidade de um con-
junto de teste existente e/ou para desenvolver novos casos de teste visando a
melhorar a cobertura dos requisitos pelo conjunto de teste. O testador pode,
por exemplo, decidir criar um conjunto de teste com base em critrios de teste
funcionais ou mesmo gerar um conjunto de teste ad-hoc e avaliar a cobertura
desse conjunto de teste em relao a cada um dos critrios de teste estruturais
da JaBUTi. Por outro lado, o testador pode visualizar o conjunto de requisitos
de teste de cada critrio gerado para cada um dos mtodos das classes sendo
testadas, verificar quais deles ainda no foram cobertos por algum caso de
teste e ento desenvolver um novo caso de teste que satisfaa tais requisitos.
As Figuras 1.14(a) e 1.14(b) ilustram parte dos requisitos de teste do construtor
da classe Call gerados pelos critrios Todos-Nsei e Todos-Usosei , respecti-
vamente.
50
Teste de Software OO e OA: Teoria e Prtica
51
Masiero, Lemos, Ferrari e Maldonado
//Cobrindo Todas-Arestas-ei
public void testIncludesEdge() {
Customer jim = new Customer("Jim", 650, "1111");
Customer mik = new Customer("Mik", 500, "1112");
Customer john = new Customer("John", 500, "1113");
Customer cris = new Customer("Cris", 500, "1114");
Customer carl = new Customer("Carl", 500, "1115");
Customer luke = new Customer("Luke", 500, "1116");
52
Teste de Software OO e OA: Teoria e Prtica
53
Masiero, Lemos, Ferrari e Maldonado
54
Teste de Software OO e OA: Teoria e Prtica
(a) Grafo AODU do construtor da classe (b) Grafo AODU do mtodo hangup
Call
55
Masiero, Lemos, Ferrari e Maldonado
56
Teste de Software OO e OA: Teoria e Prtica
c1.pickup();
assertTrue(Timing.aspectOf().getTotalConnectTime(jim) == 0);
}
c1.pickup();
wait(2.0);
c1.hangup();
assertTrue((Timing.aspectOf().getTotalConnectTime(jim) > 150) &&
(Timing.aspectOf().getTotalConnectTime(jim) < 250));
assertTrue((Billing.aspectOf().getTotalCharge(jim) > 450) &&
(Billing.aspectOf().getTotalCharge(jim) < 750));
}
57
Masiero, Lemos, Ferrari e Maldonado
58
Teste de Software OO e OA: Teoria e Prtica
public Call(Customer caller, Customer receiver, public Call(Customer caller, Customer receiver,
boolean iM) { boolean iM) {
> this.caller = caller;
this.receiver = receiver; >
Connection c; Connection c;
if (receiver.localTo(caller)) { if (receiver.localTo(caller)) {
c = new Local(caller, receiver, iM); c = new Local(caller, receiver, iM);
} else { } else {
c = new LongDistance(caller, receiver, iM); c = new LongDistance(caller, receiver, iM);
} }
connections.addElement(c); connections.addElement(c);
} }
M1eq M2eq
public Call(Customer caller, Customer receiver, public void merge(Call other){
boolean iM) { >
this.caller = caller; }
this.receiver = receiver;
Connection c;
if (receiver.localTo(caller)) {
c = new Local(caller, receiver, iM);
} else {
c = new LongDistance(caller, receiver, iM);
}
>
}
M3 M4
public void merge(Call other){ public void merge(Call other){
for(Enumeration e = for(Enumeration e =
other.connections.elements(); other.connections.elements();
e.hasMoreElements();){ e.hasMoreElements();){
Connection conn = Connection conn =
(Connection)e.nextElement(); (Connection)e.nextElement();
other.connections.removeElement(conn); >
> connections.addElement(conn);
} }
} }
M5 M6
Figura 1.22. Mutantes gerados pelo operador SSDL
public Call(Customer caller, Customer receiver, public Call(Customer caller, Customer receiver,
boolean iM) { boolean iM) {
this.caller = caller; this.caller = caller;
this.receiver = receiver; this.receiver = receiver;
Connection c; Connection c;
> if (Util.trap_on_true( > if (Util.trap_on_false(
receiver.localTo(caller))) { receiver.localTo(caller))) {
c = new Local(caller, receiver, iM); c = new Local(caller, receiver, iM);
} else { } else {
c = new LongDistance(caller, receiver, iM); c = new LongDistance(caller, receiver, iM);
} }
connections.addElement(c); connections.addElement(c);
} }
M7 M8
Figura 1.23. Mutantes gerados pelo operador STRI
59
Masiero, Lemos, Ferrari e Maldonado
M9 M10
Figura 1.24. Mutantes gerados pelo operador OCNG
M11
Figura 1.25. Mutante gerado pelo operador SMTC
60
Teste de Software OO e OA: Teoria e Prtica
61
Masiero, Lemos, Ferrari e Maldonado
(a) (b)
Figura 1.28. Mtodo merge original e modificado
62
Teste de Software OO e OA: Teoria e Prtica
na seo anterior sero aplicados, sendo eles SSDL, STRI, OCNG e SMTC. Na
Figura 1.29 destaca-se parte do cdigo do aspecto Billing. Em particular,
destaca-se o adendo sobre o qual so aplicados os operadores de mutao
selecionados.
63
Masiero, Lemos, Ferrari e Maldonado
Ma1 Ma2
after(Connection conn) returning () :
Timing.endTiming(conn) {
long time =
Timing.aspectOf().getTimer(conn).getTime();
long rate = conn.callRate();
long cost = rate * time;
>
getPayer(conn).addCharge(cost);
}
Ma3
Figura 1.31. Mutantes gerados pelo operador SSDL
64
Teste de Software OO e OA: Teoria e Prtica
Ma4 Ma5
after(Connection conn) returning () : after(Connection conn) returning () :
Timing.endTiming(conn) { Timing.endTiming(conn) {
long time = long time =
Timing.aspectOf().getTimer(conn).getTime(); Timing.aspectOf().getTimer(conn).getTime();
long rate = conn.callRate(); long rate = conn.callRate();
long cost = rate * time; long cost = rate * time;
> if (Util.trap_on_false(conn.isMobile())) { if (conn.isMobile()) {
if (conn instanceof LongDistance) { > if (Util.trap_on_false(
long receiverCost = conn instanceof LongDistance)){
MOBILE_LD_RECEIVER_RATE * time; long receiverCost =
conn.getReceiver().addCharge(receiverCost); MOBILE_LD_RECEIVER_RATE * time;
} conn.getReceiver().addCharge(receiverCost);
} }
getPayer(conn).addCharge(cost); }
} getPayer(conn).addCharge(cost);
}
Ma6 Ma7
Figura 1.32. Mutantes gerados pelo operador STRI
Ma8 Ma9
Figura 1.33. Mutantes gerados pelo operador OCNG
65
Masiero, Lemos, Ferrari e Maldonado
66
Teste de Software OO e OA: Teoria e Prtica
nas demais reas. Nessa perspectiva, a organizao de uma base histrica so-
bre o custo e a eficcia das tcnicas e critrios de teste, em diferentes domnios
de aplicao, em relao a diferentes classes de defeitos, certamente facilita-
ria o planejamento de futuros desenvolvimentos de software. Facilitaria, ainda,
o estabelecimento de estratgias de teste que explorem os aspectos comple-
mentares das tcnicas e critrios, viabilizando a deteco do maior nmero de
defeitos possvel e com o menor custo, o que contribuiria para a liberao de
produtos de software de maior qualidade a um menor custo [Rocha et al. 2001].
1.6. Agradecimentos
Os autores agradecem Fundao de Amparo Pesquisa do Estado de
So Paulo (FAPESP) pelo apoio financeiro e aos pesquisadores Ellen Fran-
cine Barbosa, Auri Marcelo Rizzo Vincenzi e Mrcio Eduardo Delamaro pelas
diversas contribuies neste trabalho.
Referncias
[Acree 1980] Acree, A. T. (1980). On Mutation. PhD thesis, Scholl of Infor-
mation and Computer Science, Georgia Institute of Technology, Atlanta/GA -
USA.
[Acree et al. 1979] Acree, A. T., Budd, T. A., DeMillo, R. A., Lipton, R. J., and
Sayward, F. G. (1979). Mutation analysis. Technical Report GIT-ICS-79/08,
School of Information and Computer Science, Georgia Institute of Techno-
logy, Atlanta/GA - USA.
[Adrion et al. 1982] Adrion, W. R., Branstad, M. A., and Cherniavsky, J. C.
(1982). Validation, Verification, and Testing of Computer Software. ACM
Computing Surveys, 14(2):159192.
[Agrawal et al. 1989] Agrawal, H., DeMillo, R. A., Hathaway, R., Hsu, W., Hsu,
W., Krauser, E. W., Martin, R. J., Mathur, A. P., and Spafford, E. H. (1989).
Design of mutant operators for the C programming language. Technical Re-
port SERC-TR41-P, Software Engineering Research Center, Purdue Univer-
sity, West Lafayette/IN - USA.
[Alexander 2003] Alexander, R. (2003). Aspect-oriented programming: the real
costs? IEEE Software, 20(6):9093.
[Alexander et al. 2004] Alexander, R. T., Bieman, J. M., and Andrews, A. A.
(2004). Towards the systematic testing of aspect-oriented programs. Techni-
cal report, Department of Computer Science, Colorado State University.
[Alexander and Offutt 2000] Alexander, R. T. and Offutt, A. J. (2000). Criteria
for testing polymorphic relationships. In Proceedings of the 11th International
Symposium on Software Reliability Engineering (ISSRE2000), pages 1523,
Sao Jose/CA - USA. IEEE Computer Society.
[AspectJ Team 2003] AspectJ Team (2003). The AspectJ programming guide.
Online. Disponvel em http://www.eclipse.org/aspectj/doc/
released/progguide/index.html - ltimo acesso em 20/01/2006.
67
Masiero, Lemos, Ferrari e Maldonado
[Beck and Gamma 2006] Beck, K. and Gamma, E. (2006). JUnit, testing re-
sources for extreme programming. Online. Disponvel em http://www.
junit.org/index.htm - ltimo acesso em 02/04/2006.
[Binder 1999] Binder, R. V. (1999). Testing Object-Oriented Systems Models,
Patterns, and Tools. Addison Wesley, 1st. edition.
[Booch 1994] Booch, G. (1994). Object-Oriented Analysis and Design with Ap-
plications. Addison Wesley, 2nd. edition.
[Budd 1981] Budd, T. A. (1981). Mutation analysis: Ideas, example, problems
and prospects. Computer Program Testing North-Holand Publishing Com-
pany.
[Chevalley and Thvenod-Fosse 2003] Chevalley, P. and Thvenod-Fosse, P.
(2003). A mutation analysis tool for java programs. International Journal on
Software Tools for Technology Transfer (STTT), 5(1):90103.
[Cox and Novobilski 1991] Cox, B. J. and Novobilski, A. J. (1991). Object-
Oriented Programming. Addison-Wesley, 2nd. edition.
[Delamaro 1997] Delamaro, M. E. (1997). Mutao de Interface: Um critrio
de adequao interprocedimental para o teste de integrao. PhD thesis,
IFSC/USP.
[Delamaro et al. 2001] Delamaro, M. E., Maldonado, J. C., and Mathur, A. P.
(2001). Interface Mutation: An approach for integration testing. IEEE Tran-
sactions os Software Engineering, 27(3):228247.
[DeMillo 1978] DeMillo, R. A. (1978). Hints on test data selection: Help for the
practicing programmer. IEEE Computer, 11(4):3443.
[Domingues 2002] Domingues, A. L. S. (2002). Avaliao de critrios e fer-
ramentas de teste para programas OO. Masters thesis, ICMC/USP, So
Carlos/SP - Brasil.
[Elrad et al. 2001] Elrad, T., Filman, R. E., and Bader, A. (2001). Aspect-
oriented programming: Introduction. Communications of the ACM,
44(10):2932.
[Filman and Friedman 2000] Filman, R. and Friedman, D. (2000). Aspect-
oriented programming is quantification and obliviousness. In Workshop on
Advanced Separation of Concerns, OOPSLA 2000, pages 2135, Minnea-
polis - USA.
[Frankl and Weyuker 2000] Frankl, P. G. and Weyuker, E. J. (2000). Testing
software to detect and reduce risk. Journal of Systems and Software,
53(3):275286.
[Friedman 1975] Friedman, A. D. (1975). Logical Design of Digital Systems.
Computer Science Press.
[Harrold 2000] Harrold, M. J. (2000). Testing: A roadmap. In 22th International
Conference on Software Engineering - Future of SE Track, pages 6172.
68
Teste de Software OO e OA: Teoria e Prtica
ACM Press.
[Harrold and Rothermel 1994] Harrold, M. J. and Rothermel, G. (1994). Per-
forming data flow testing on classes. In 2nd ACM SIGSOFT Symposium on
Foundations of Software Engineering, pages 154163, New York, NY. ACM
Press.
[Howden 1986] Howden, W. E. (1986). Functional Program Testing and Analy-
sis. McGraw-Hill, Inc., New York/NY - USA.
[IEEE 1990] IEEE (1990). IEEE standard glossary of software engineering ter-
minology. Standard 610.12, Institute of Electric and Electronic Engineers.
[Kiczales et al. 2001] Kiczales, G., Hilsdale, E., Hugunin, J., Kersten, M., Palm,
J., and Griswold, W. G. (2001). An overview of AspectJ. In ECOOP 01:
Proceedings of the 15th European Conference on Object-Oriented Program-
ming, pages 327353.
[Kiczales et al. 1997] Kiczales, G., Irwin, J., Lamping, J., Loingtier, J.-M., Lo-
pes, C., Maeda, C., and Menhdhekar, A. (1997). Aspect-oriented program-
ming. In Aksit, M. and Matsuoka, S., editors, Proceedings of the European
Conference on Object-Oriented Programming, volume 1241, pages 220
242, Berlin, Heidelberg, and New York. Springer-Verlag.
[Kiczales and Mezini 2005] Kiczales, G. and Mezini, M. (2005). Aspect-
oriented programming and modular reasoning. In Proceedings of the 27th
International Conference on Software Engineering (ICSE2005), pages 49
58. ACM Press.
[Kim et al. 2000] Kim, S., Clark, J., and McDermid, J. (2000). Class muta-
tion: Mutation testing for object-oriented programs. In Proceedings of the
FMES2000.
[Laddad 2003] Laddad, R. (2003). AspectJ In Action. Manning Publications.
[Lemos 2005] Lemos, O. A. L. (2005). Teste de programas orientados a aspec-
tos: Uma abordagem estrutural para AspectJ. Masters thesis, ICMC/USP,
So Carlos/SP - Brasil.
[Lemos et al. 2004] Lemos, O. A. L., Maldonado, J. C., and Masiero, P. C.
(2004). Data flow integration testing criteria for aspect-oriented programs.
In Anais do 1o Workshop Brasileiro de Desenvolvimento de Software Orien-
tado a Aspectos (WASP2004), Braslia/DF - Brasil.
[Lemos et al. 2005] Lemos, O. A. L., Maldonado, J. C., and Masiero, P. C.
(2005). Structural unit testing of AspectJ programs. In Proceedings of the
1st Workshop on Testing Aspect Oriented Programs in conjunction with
AOSD2005, Chicago/IL, USA.
[Linnenkugel and Mllerburg 1990] Linnenkugel, U. and Mllerburg, M. (1990).
Test data selection criteria for (software) integration testing. In First Interna-
tional Conference on Systems Integration, pages 709717, Morristown/NJ -
69
Masiero, Lemos, Ferrari e Maldonado
USA.
[Ma et al. 2002] Ma, Y. S., Kwon, Y. R., and Offutt, J. (2002). Inter-class muta-
tion operators for java. In Proceedings of the 13th International Symposium
on Software Reliability Engineering (ISSRE02), pages 352366, Annapolis,
MD. IEEE Computer Society Press.
[Maldonado 1991] Maldonado, J. C. (1991). Critrios Potenciais Usos: Uma
Contribuio ao Teste Estrutural de Software. PhD thesis, DCA/FEE/UNI-
CAMP, Campinas, SP - Brasil.
[Mathur and Wong 1993] Mathur, A. P. and Wong, W. E. (1993). Evaluation of
the cost of alternative mutation strategies. In Anais do 7o Simpsio Brasileiro
de Engenharia de Software (SBES1993), pages 320335, Joo Pessoa/PB
- Brasil.
[McDaniel and McGregor 1994] McDaniel, R. and McGregor, J. D. (1994). Tes-
ting polymorphic interactions between classes. Technical Report TR-94-103,
Clemson University.
[Mortensen and Alexander 2004] Mortensen, M. and Alexander, R. T. (2004).
Adequate testing of aspect-oriented programs. Technical Report CS 01-110,
Department of Computer Science, Colorado State University.
[Myers et al. 2004] Myers, G. J., Sandler, C., Badgett, T., and Thomas, T. M.
(2004). The Art of Software Testing. John Wiley & Sons, 2nd edition.
[Offutt et al. 1993] Offutt, A. J., Rothermel, G., and Zapf, C. (1993). An expe-
rimental evaluation of selective mutation. In Proceedings of the 15th Inter-
national Conference on Software Engineering (ICSE1993), pages 100107,
Baltimore/MD - USA. IEEE Computer Society Press.
[Offutt et al. 2001] Offutt, J., Alexander, R., Wu, Y., Xiao, Q., and Hutchinson,
C. (2001). A fault model for subtype inheritance and polymorphism. In Pro-
ceedings of the 12th International Symposium on Software Reliability Engine-
ering, pages 8493, Hong Kong - China. IEEE Computer Society Press.
[Pressman 2000] Pressman, R. S. (2000). Software engineering - A Practitio-
ners Approach. McGraw-Hill, 5th edition.
[Rapps and J.Weyuker 1982] Rapps, S. and J.Weyuker, E. (1982). Data flow
analysis techniques for program test data selection. In 6th International Con-
ference on Software Engineering, pages 272278, Tokio, Japan.
[Rapps and J.Weyuker 1985] Rapps, S. and J.Weyuker, E. (1985). Selecting
software test data using data flow information. IEEE Transactions on Soft-
ware Engineering, 11(4):367375.
[Rocha et al. 2001] Rocha, A. R. C., Maldonado, J. C., and Weber, K. C.
(2001). Qualidade de Software. Prentice Hall.
[Simo and Maldonado 2000] Simo, A. S. and Maldonado, J. C. (2000). Mu-
tation based test sequence generation for Petri Nets. In Proceedings of the
70
Teste de Software OO e OA: Teoria e Prtica
71