Geração automática de casos de teste com a ferramenta EclipsePro

Propaganda
TQS - Teste e Qualidade de Software
(Software Testing and Quality)
Geração Automática de Casos de Teste com
a Ferramenta EclipsePro
(Problema dos Extensos)
João Pascoal Faria
[email protected]
www.fe.up.pt/~jpf
Teste e Qualidade de Software, Mestrado em Engenharia Informática, João Pascoal Faria, 2004
‹#›
Invocação do gerador
Teste e Qualidade de Software, Mestrado em Engenharia Informática, João Pascoal Faria, 2004
‹#›
Resultados do gerador
Projecto e
classes
gerados
automaticamente
Teste e Qualidade de Software, Mestrado em Engenharia Informática, João Pascoal Faria, 2004
‹#›
Casos de teste gerados automaticamente (1)
class ExtensosTest {
....
public void testNumExt_1() throws Exception {
int n = 999999999;
String result = Extensos.NumExt(n);
// add test code here
assertEquals("NOVECENTOS E NOVENTA E NOVE
MILHÕES NOVECENTOS E NOVENTA E NOVE MIL
NOVECENTOS E NOVENTA E NOVE", result);
fail("unverified");
}
public void testNumExt_2() throws Exception {
int n = 0;
String result = Extensos.NumExt(n);
// add test code here
assertEquals("ZERO", result);
fail("unverified");
}
public void testNumExt_3() throws Exception {
int n = 1000000;
String result = Extensos.NumExt(n);
// add test code here
assertEquals("UM MILHÃO", result);
fail("unverified");
}
...
public void testNumExt_4() throws Exception {
int n = 1000;
String result = Extensos.NumExt(n);
// add test code here
assertEquals("MIL", result);
fail("unverified");
}
public void testNumExt_5() throws Exception {
int n = 100;
String result = Extensos.NumExt(n);
// add test code here
assertEquals("CEM", result);
fail("unverified");
}
public void testNumExt_6() throws Exception {
int n = 200;
String result = Extensos.NumExt(n);
// add test code here
assertEquals("DUZENTOS", result);
fail("unverified");
}
...
Teste e Qualidade de Software, Mestrado em Engenharia Informática, João Pascoal Faria, 2004
‹#›
Casos de teste gerados automaticamente (2)
...
public void testNumExt_7() throws Exception {
int n = 20;
String result = Extensos.NumExt(n);
// add test code here
assertEquals("VINTE", result);
fail("unverified");
}
...
public void testNumExt_10() throws Exception {
int n = 99;
String result = Extensos.NumExt(n);
// add test code here
assertEquals("NOVENTA E NOVE", result);
fail("unverified");
}
public void testNumExt_8() throws Exception {
public void testNumExt_11() throws Exception {
int n = 999999;
int n = 199;
String result = Extensos.NumExt(n);
String result = Extensos.NumExt(n);
// add test code here
// add test code here
assertEquals("NOVECENTOS E NOVENTA E
assertEquals("CENTO E NOVENTA E NOVE",
NOVE MIL NOVECENTOS E NOVENTA E NOVE", result); result);
fail("unverified");
fail("unverified");
}
}
public void testNumExt_9() throws Exception {
int n = 999;
String result = Extensos.NumExt(n);
// add test code here
assertEquals("NOVECENTOS E NOVENTA E
NOVE", result);
fail("unverified");
}
...
public void testNumExt_12() throws Exception {
int n = 21;
String result = Extensos.NumExt(n);
// add test code here
assertEquals("VINTE E UM", result);
fail("unverified");
}
}
Teste e Qualidade de Software, Mestrado em Engenharia Informática, João Pascoal Faria, 2004
‹#›
Completar código gerado automaticamente

Comentar as instruções
fail("unverified");
ficando
// fail("unverified");
ou então alterar preferências
antes de gerar

Substituir
junit.textui.TestRunner.run(E
xtensosTest.class);
por
junit.swingui.TestRunner.run(
ExtensosTest.class);

Todos os casos de teste
passam!
Teste e Qualidade de Software, Mestrado em Engenharia Informática, João Pascoal Faria, 2004
‹#›
Grau de cobertura dos casos de teste gerados
não testou valores fora da gama e
lançamento de excepções (por defeito
só testa se excepção for declarada no
cabeçalho do método)
não testou milhões compostos com "E"
não testou milhares compostos com "E"
não testou dezenas exactas acima de 20
Teste e Qualidade de Software, Mestrado em Engenharia Informática, João Pascoal Faria, 2004
‹#›
Geração de casos de teste para as excepções



Alterar cabeçalho
do método NumExt
acrescentando
throws
IllegalArgumentExc
eption
Voltar a gerar os
casos de teste
automaticamente
Aparecem 2 novos
casos de teste
public void testNumExt_13() throws Exception {
int n = 1000000000;
try {
String result = Extensos.NumExt(n);
fail("The exception java.lang.IllegalArgumentException should
have been thrown.");
} catch (java.lang.IllegalArgumentException exception) {
if (!exception.getClass().getName().equals(
"java.lang.IllegalArgumentException"))
fail("The exception java.lang.IllegalArgumentException
should have been thrown.");
}
}
public void testNumExt_14() throws Exception {
int n = -1;
try {
String result = Extensos.NumExt(n);
fail("The exception java.lang.IllegalArgumentException should
have been thrown.");
} catch (java.lang.IllegalArgumentException exception) {
if (!exception.getClass().getName().equals(
"java.lang.IllegalArgumentException"))
fail("The exception java.lang.IllegalArgumentException
should have been thrown.");
}
}
Teste e Qualidade de Software, Mestrado em Engenharia Informática, João Pascoal Faria, 2004
‹#›
Como funciona a geração automática? (1)
"For each target method, the test generator
1. generates a list of values for the fixture (if the target method is an instance
method) and each of the arguments,
• The test generator uses a number of heuristics to generate a list of values for a
given argument. First, it analyzes the target method to try to determine how the
parameter is used within the method and see whether that tells it anything about
what values to use. For example, if an integer parameter is used in a switch
statement, then it would use each of the values explicitly listed in non-empty
case labels as well as some value that isn’t in any of the case labels.
• If it can’t determine anything from analyzing the method, then it looks to see if
the type of the parameter is well known. This includes primitive types as well as
several non-primitive types such as String. For well known types, there is a list of
default values.
• For other classes of objects, as well as for test fixtures, it looks for zeroargument static accessor methods, constructors, and multi-argument static
accessor methods, in that order, generating values for their arguments as
necessary.
2. determines which combinations of values to use to invoke the method,
• The number of combinations of all possible values for fixtures and arguments is
usually too high to be practical, so the test generator uses rules for choosing a
reasonable number of those combinations.
Teste e Qualidade de Software, Mestrado em Engenharia Informática, João Pascoal Faria, 2004
‹#›
Como funciona a geração automática? (2)
3. computes the result of invoking the method,
• Then, for each combination, the test generator computes the expected result of
the method. This can either be a value, if the method returns normally, nothing,
if the method has a return type of void, or an exception if the method throws an
exception.
4. figures out how to validate the result,
• If an exception is thrown, it is assumed that the method should throw an
exception and the test method will be written to verify that the exception is
thrown. If the method returns a value, then the test generator determines how
to test the returned value. Some types can be checked directly, while other types
require invoking accessing methods or fields to determine the state of the
object. If the method does not return a value, then the state of the fixture is
tested instead.
5. generates one test method for each combination of values.
• Once we know the test fixture, argument values, and validation steps for each
test method, generating the code for the test method is quite straightforward.
The input values and expected results are also shown in the JUnit Test Case
Outline view "
(source: product documentation)
Teste e Qualidade de Software, Mestrado em Engenharia Informática, João Pascoal Faria, 2004
‹#›
Links úteis

www.instantiations.com
• tem ferramenta comercial EclipsePro Test e Audit de análise de
cobertura de código Java, geração automática de casos de teste,
métricas, auditoria ao código, integrável no Eclipse, que pode ser
experimentada gratuitamente (instalar a versão mais completa
http://www.instantiations.com/_private/codepro/files/ws/EclipsePro_v
4.0.1_for_win32.exe)
Teste e Qualidade de Software, Mestrado em Engenharia Informática, João Pascoal Faria, 2004
‹#›
Download