2. Komponenten Test
• Testbasis (Was ist die Grundlage für die Testfälle)
• Anforderungen an die Komponente
• detaillierter Entwurf
• Code
• Testobjekte (SUT = System Under Test):
• Komponenten
• Programme
• Datenumwandlung/Migrationsprogramme
• Datenbankmodule
2
3. Vier Phasen Test
(Four-Phase Test)
Setup
Verify
Teardown
Exercise
SUT
Fixture
1
2
3
4
3
Quelle: XUnit Test Patterns - Gerard Meszaros
10. JUnit4 Test Exceptions
@Rule
public ExpectedException thrown= ExpectedException.none();
@Test
public void testSort_NullPointerException() {
thrown.expect(NullPointerException.class);
thrown.expectMessage(The values should not be null.);
sut.sort(null);
}
10
11. JUnit4 Rules
public class IgnoreRule implements MethodRule {
!
@Retention(RetentionPolicy.RUNTIME)
public static @interface IgnoreTest {}
!
@Override
public Statement apply(final Statement base,
final FrameworkMethod method, Object target) {
return new Statement() {
@Override
public void evaluate() throws Throwable {
if (method.getAnnotation(IgnoreTest.class) == null) {
base.evaluate();
}
}
};
}
}
11
12. JUnit4 Ignore Rule Test
@Rule
public IgnoreRule ignoreRule = new IgnoreRule();
@Test
@IgnoreTest
public void failingTest() {
throw new RuntimeException(Not Implement);
}
12
13. JUnit4 Runner
(Parametrisierter Test)
@RunWith(Parameterized.class)
public class SorterTest {
!
@Parameters
public static IterableObject[] data() {
return Arrays.asList(new Object[][] {{
new Integer[] { 5, 4, 3 },
new Integer[] { 3, 4, 5 }
}});
}
!
public SorterTest(Integer[] values, Integer[] expected) {
this.values = values;
this.expectedValues = expected;
}
13
16. „Als Testabdeckung bezeichnet man das Verhältnis an
tatsächlich getroffenen Aussagen eines Tests gegenüber
den theoretisch möglich treffbaren Aussagen bzw. der
Menge der gewünschten treffbaren Aussagen.“
- Wikipedia
Testabdeckung
16
17. Testabdeckung
boolean
aAndbOrC(boolean
a,
boolean
b,
boolean
c)
{
return(a
b)
||
c;
}
Erwartet a b c
false false false false
true false false true
false false true false
true false true true
false true false false
true true false true
true true true false
true true true true
17
18. Vollständige Testabdeckung
„Eine vollständige Testabdeckung stellt eine Ausnahme
dar, weil die Anzahl möglicher Testfälle sehr schnell
ungeheuer groß wird (durch kombinatorische Explosion).
Ein vollständiger Funktionstest für eine einfache Funktion,
die zwei 16-Bit-Werte als Argument erhält, würde schon
2^(16+16), also ca. 4 Milliarden Testfälle bedeuten, um
die Spezifikation vollständig zu testen.“
- Wikipedia
18
19. Flussdiagramm (flowchart)
boolean
aAndbOrC(
boolean
a,
boolean
b,
boolean
c)
{
boolean
result
=
false;
if(A
B)
{
result
=
true;
}
else
if(C)
{
result
=
true;
}
else
{
result
=
false;
}
return
result;
}
result = false
Start
return result
A B result = true
C result = true
result = false
19
20. Vereinfachtes Flussdiagramm
boolean
aAndbOrC(
boolean
a,
boolean
b,
boolean
c)
{
boolean
result
=
false;
if(a
b)
{
result
=
true;
}
else
if(c)
{
result
=
true;
}
else
{
result
=
false;
}
return
result;
}
a b
c
false
true
true
20
24. Testabdeckung
int
sum(int
values[],
int
offset){
int
result
=
0;
for
(int
value
:
values)
{
if(offset
0){
if(offset
value)
result
+=
offset;
}
result
+=
value;
}
return
result;
}
24
25. Testabdeckung
result = 0
for(value
: values)
offset 0
offset
value
result +=
offset
result +=
value
return
result
Erwartet values offset
3 [2] 1
100%
Anweisungs-
überdeckung
25
26. Zweigabdeckung
(Branch Coverage)
result = 0
for(value
: values)
offset 0
offset
value
result +=
offset
result +=
value
return
result
Erwartet values offset
3 [2] 1
26
27. Zweigabdeckung
(Branch Coverage)
result = 0
for(value
: values)
offset 0
offset
value
result +=
offset
result +=
value
return
result
Erwartet values offset
3 [2] 1
2 [2] 0
27
28. Zweigabdeckung
(Branch Coverage)
result = 0
for(value
: values)
offset 0
offset
value
result +=
offset
result +=
value
return
result
Erwartet values offset
3 [2] 1
2 [2] 0
2 [2] 2
Merke: 100% Zweigabdeckung schließt
100% Anweisungsüberdeckung ein!!!
28
29. Entscheidungsüberdeckung
(Term Coverage)
boolean
aAndbOrC(
boolean
a,
boolean
b,
boolean
c)
{
if((a
b)
||
c)
{
return
true;
}
else
{
return
false;
}
}
Erwartet a b c
true true true false
true false false true
false false true false
Merke: 100% Entscheidungsüberdeckung schließt
100% Zweigabdeckung ein!!!
29
34. Schleifenüberdeckung
(Loop Coverage)
int result = 0
return result
each(values)
result += offset
offset 0
result += value
offset value
Schleife wird:
- keinmal
- genau einmal
- mehr als einmal
durchlaufen
34
35. Pfadüberdeckungstest
(Path Coverage)
Pfadüberdeckungstest werden alle
möglichen Pfade betrachtet.
!
Pfade in Schleifen:
n = Anzahl Schleifendurchläufe
m = Anzahl der Pfade in der Schleife
P = m(n)+ m(n-1)+ m(n-2) + … + m0
!
Beispiel:
max(values) = 5
P = 35
+ 34 + 33
+ 32
+ 31
+ 1
= 364
243
+ 81
+ 27
+ 9
+ 3
+ 1
= 364
!
Bei Schleifen ergeben sich sehr viele Pfade
kombinatorische Explosion.
A
for(values)
B D
EC
F
35
40. Testen ohne Abhängigkeiten
public class Calc {
!
private int result = 0;
!
private Cache cache = new Cache();
!
public void add(int a) {
if (a 0)
throw new IllegalStateException();
String stmt = String.format(%d + %d, result, a);
Integer cachedResult = cache.get(stmt);
if (cachedResult != null)
result = cachedResult;
else
cache.put(stmt, result += a);
}
!
public int sum() { return result; }
}
40
41. Testability (Prüfbarkeit)
public class Calc {
!
private int result = 0;
!
// DOC
Cache cache = new Cache();
…
// DOC
private Cache cache = new Cache();
public void setCache(Cache cache) {
this.cache = cache;
}
PackageVisible Dependencies
Setters for Dependencies
41