Testen-Tutorial - Heinz Nixdorf Institut
Download
Report
Transcript Testen-Tutorial - Heinz Nixdorf Institut
© Fachgebiet Softwaretechnik, Heinz Nixdorf Institut, Universität Paderborn
Testen
Tutorial im Rahmen des Software(technik)praktikums
© Fachgebiet Softwaretechnik, Heinz Nixdorf Institut, Universität Paderborn
Grundlagen (1)
Softwaretest ist ein fundamentales Element in der
Softwarequalitätssicherung
Softwaretest wird am häufigsten eingesetzt
Viele Organisationen benötigen 40-50 % der
Entwicklungszeit für das Testen
Software(technik)praktikum - Tutorial Testen
Stand: 2010
2
© Fachgebiet Softwaretechnik, Heinz Nixdorf Institut, Universität Paderborn
Grundlagen (2)
Testen befasst sich mit dem Auffinden, dass Fehler
existieren.
Debuggen befasst sich damit zu finden, wo genau der
Fehler enthalten ist (Code, Design, Anforderungen) und
den Fehler zu beheben.
Auch wenn die besten Review-Methoden eingesetzt
werden, ist Testen wichtig.
Software(technik)praktikum - Tutorial Testen
Stand: 2010
3
© Fachgebiet Softwaretechnik, Heinz Nixdorf Institut, Universität Paderborn
Grundlagen (3)
„A successful test in one that breaks the software.“
[McConnell 1993]
Ein guter Test findet also Fehler, die bisher unentdeckt
waren.
Testen kann nicht die Abwesenheit von Fehlern zeigen!
Für komplexe Software ist vollständiges Testen nicht
möglich.
Software(technik)praktikum - Tutorial Testen
Stand: 2010
4
Testtechniken
Statisch, d.h. Code wird nicht ausgeführt:
Code-Walkthrough
Review
© Fachgebiet Softwaretechnik, Heinz Nixdorf Institut, Universität Paderborn
Dynamisch, d.h. Code wird ausgeführt mit Testdaten:
Black-Box
• Kein Einblick in Code
• Testfälle werden anhand von Spezifikationen und
Schnittstellen erstellt
White-Box
• Analyse des Codes, um Testfälle zu erstellen
Software(technik)praktikum - Tutorial Testen
Stand: 2010
5
Unit code
Unit
test
Design
System
Other
Customer
User
specifications functional
software
requirements environment
requirements requirements specification
Unit
test
.
.
.
Integration
test
System
test
Integrated
modules
Unit code
© Fachgebiet Softwaretechnik, Heinz Nixdorf Institut, Universität Paderborn
Unit code
Testschritte
Performance Acceptance
test
test
Functioning Verified,
system
validated
software
Unit
test
Installation
test
Accepted
system
SYSTEM
IN USE!
[Pfleeger 2001]
Software(technik)praktikum - Tutorial Testen
Stand: 2010
6
Unit-Tests
Unit-Test testet eine individuelle Programmeinheit auf
korrektes Verhalten.
© Fachgebiet Softwaretechnik, Heinz Nixdorf Institut, Universität Paderborn
Was ist eine Unit?
„Kleinste kompilierbare Einheit“
„Stand alone procedure of function“
„Kann von einer einzelnen Person implementiert werden“
Unit-Tests werden typischerweise vom Entwickler selbst
ausgeführt.
Software(technik)praktikum - Tutorial Testen
Stand: 2010
7
Unit-Testplan am Beispiel
Unit zur Errechnung des größten gemeinsamen Teilers
(GGT) zweier Integer-Zahlen (nicht beide 0)
© Fachgebiet Softwaretechnik, Heinz Nixdorf Institut, Universität Paderborn
GGT(a,b) = c
• c ist ein positiver Integer-Wert
• c ist gemeinsamer Teiler von a und b
• c ist größer als alle gemeinsamen Teiler von a und b
Beispiele:
GGT(45,27) = 9
GGT(7, 13) = 1
GGT(-12, 15) = 3
GGT(13, 0) = 13
GGT(0,0) nicht definiert
Software(technik)praktikum - Tutorial Testen
Stand: 2010
8
Unit-Testplan GGT
© Fachgebiet Softwaretechnik, Heinz Nixdorf Institut, Universität Paderborn
Finden der Testfälle:
1. Algorithmus schreiben
2. Pfadgraph erstellen und mit Überdeckungskriterium
analysieren (White-Box)
3. Äquivalenzklassen bestimmen
4. Grenzwerte bestimmen
5. Testfälle auswählen
Software(technik)praktikum - Tutorial Testen
Stand: 2010
9
© Fachgebiet Softwaretechnik, Heinz Nixdorf Institut, Universität Paderborn
Testfälle für GGT (1. Algorithmus)
note: Based on Euclid’s algorithm
1. function gcd (int a, int b) {
2.
int temp, value;
3.
a := abs(a);
4.
b := abs(b);
5.
if (a = 0) then
6.
value := b; // b is the GCD
7.
else if (b = 0) then
8.
raise exception;
9.
else
10.
loop
11.
temp := b;
12.
b := a mod b;
13.
a := temp;
14.
until (b = 0)
15.
value := a;
16.
end if;
17.
return value;
18. end gcd
Software(technik)praktikum - Tutorial Testen
Stand: 2010
10
© Fachgebiet Softwaretechnik, Heinz Nixdorf Institut, Universität Paderborn
Testfälle für GGT (1. Graph)
note: Based on Euclid’s algorithm
1. function gcd (int a, int b) {
2.
int temp, value;
3.
a := abs(a);
4.
b := abs(b);
5.
if (a = 0) then
6.
value := b; // b is the GCD
7.
else if (b = 0) then
8.
raise exception;
9.
else
10.
loop
11.
temp := b;
12.
b := a mod b;
Basic Path Set
13.
a := temp;
14. 4 Pfadeuntil (b = 0)
15. (1,5,6,17,18),
value :=(1,5,7,18),
a;
16.
end if;
(1,5,7,9,10,17,18),
17.
return value;
(1,5,7,9,10,9,10,17,18)
18. end
gcd
Software(technik)praktikum - Tutorial Testen
1
5
7
9
6
10
17
18
Stand: 2010
11
Testfälle für GGT (3. + 4.)
Äquivalenzklassen
Negative Werte, positive Werte und 0
© Fachgebiet Softwaretechnik, Heinz Nixdorf Institut, Universität Paderborn
• a < 0 and b < 0, a < 0 and b > 0, a > 0 and b < 0
• a > 0 and b > 0, a = 0 and b < 0, a = 0 and b > 0
• a > 0 and b = 0, a > 0 and b = 0, a = 0 and b = 0
Grenzwerte
a = -231, -1, 0, 1, 231-1 and b = -231, -1, 0, 1, 231-1
Software(technik)praktikum - Tutorial Testen
Stand: 2010
12
© Fachgebiet Softwaretechnik, Heinz Nixdorf Institut, Universität Paderborn
Testfälle für GGT (5. Testfälle wählen)
Test Description / Data
Expected Results
Basic Path Set
path (1,5,6,17,18)
(0, 15)
15
path (1,5,7,18)
(15, 0)
15
path (1,5,7,9,10,17,18)
(30, 15)
15
path (1,5,7,9,10,9,10,17,18) (15, 30)
15
Equivalence Classes
a < 0 and b < 0 (-27, -45)
9
a < 0 and b > 0 (-72, 100)
4
a > 0 and b < 0 (121, -45)
1
a > 0 and b > 0 (420, 252)
28
a = 0 and b < 0 (0, -45)
45
a = 0 and b > 0 (0 , 45)
45
a > 0 and b = 0 (-27, 0)
27
a > 0 and b = 0 (27, 0)
27
a = 0 and b = 0 (0 , 0)
exception raised
Boundary Points
(1 , 0)
1
(-1 , 0)
1
(0 , 1)
1
(0 , -1)
1
(0 , 0) (redundant)
exception raised
(1, 1)
1
(1, -1)
1
(-1, 1)
1
(-1, -1)
1
Software(technik)praktikum - Tutorial Testen
Test Experience / Actual Results
Stand: 2010
13
Testautomatisierung
© Fachgebiet Softwaretechnik, Heinz Nixdorf Institut, Universität Paderborn
Jetzt haben wir die Testfälle, aber wie testen wir sie?
JUnit-Framework (Plugin für Eclipse)
Trennung von Programm-Code und Test-Code
Bequemes Schreiben der Unit-Tests
Automatische Ausführung
Software(technik)praktikum - Tutorial Testen
Stand: 2010
14
© Fachgebiet Softwaretechnik, Heinz Nixdorf Institut, Universität Paderborn
JUnit
Software(technik)praktikum - Tutorial Testen
Stand: 2010
15
JUnit TestCase
© Fachgebiet Softwaretechnik, Heinz Nixdorf Institut, Universität Paderborn
import junit.framework.TestCase;
Namenskonventionen:
Test Case Class:
[classname]Test.java
public class MultiPurposeCalculatorTest extends
TestCase {
private MultiPurposeCalculator cal;
public void setUp()
{
Test Case Method:
cal = new MultiPurposeCalculator();
test[methodname]
}
@Test
public void testGCD()
Inzwischen wird statt JUnit 3
{
die neue Version JUnit 4
int expected=1;
assertEquals(expected, cal.gcd(17,23));
verwendet, in der sich einiges
expected=4;
geändert hat
assertEquals(expected, cal.gcd(12, 4));
Gutes Tutorial:
expected=3;
http://www.vogella.de/articles
assertEquals(expected, cal.gcd(51,57));
expected=17;
/JUnit/article.html
assertEquals(expected, cal.gcd(17,34));
}
http://www4.comp.polyu.edu.hk/~cskwyung/labs/lab4.html
}
Software(technik)praktikum - Tutorial Testen
Stand: 2010
16
Asserts (Auszug)
© Fachgebiet Softwaretechnik, Heinz Nixdorf Institut, Universität Paderborn
http://junit.org/apidocs/org/junit/Assert.html
assertArrayEquals(byte[] expecteds, byte[] actuals)
assertArrayEquals(char[] expecteds, char[] actuals)
assertFalse(boolean condition): Asserts that a condition is
false.
assertNull(java.lang.Object object): Asserts that an object
is null.
assertTrue(java.lang.String message, boolean condition):
Asserts that a condition is true.
…
Software(technik)praktikum - Tutorial Testen
Stand: 2010
17
JUnit TestSuite
import junit.framework.Test;
import junit.framework.TestSuite;
© Fachgebiet Softwaretechnik, Heinz Nixdorf Institut, Universität Paderborn
public class SampleTestSuite extends TestSuite
{
public static Test suite() {
TestSuite suite = new TestSuite("Sample Tests");
Sammeln der TestCases
und automatisches
Ausführen aller TestCases
Rechtsklick auf TestSuite
oder TestCase und Run As
> Junit Test
// Add one entry for each test class
// or test suite.
suite.addTestSuite(MultiPurposeCalculatorTest.class);
suite.addTestSuite(MultiPurposeCalculatorTest2.class);
// For a master test suite, use this pattern.
// (Note that here, it's recursive!)
suite.addTest(SampleTestSuite2.suite());
return suite;
}
}
Software(technik)praktikum - Tutorial Testen
Stand: 2010
18
© Fachgebiet Softwaretechnik, Heinz Nixdorf Institut, Universität Paderborn
JUnit Failure Trace
Software(technik)praktikum - Tutorial Testen
Stand: 2010
19
Units mit Schnittstellen
GGT-Unit interagiert nicht mit anderen Units.
Andere Units können nicht so isoliert betrachtet werden.
Test Stub
© Fachgebiet Softwaretechnik, Heinz Nixdorf Institut, Universität Paderborn
Ein temporäre, minimale Implementierung einer Unit
Beim Integrieren (Bottom-up) können die Stubs dann
durch die getesteten Units ersetzt werden.
Software(technik)praktikum - Tutorial Testen
Stand: 2010
20
Unit code
Unit
test
Design
System
Other
Customer
User
specifications functional
software
requirements environment
requirements requirements specification
Unit
test
.
.
.
Integration
test
System
test
Integrated
modules
Unit code
© Fachgebiet Softwaretechnik, Heinz Nixdorf Institut, Universität Paderborn
Unit code
Testschritte
Performance
test
Acceptance
test
Functioning Verified,
system
validated
software
Unit
test
Installation
test
Accepted
system
SYSTEM
IN USE!
[Pfleeger 2001]
Software(technik)praktikum - Tutorial Testen
Stand: 2010
21
Systemtest
© Fachgebiet Softwaretechnik, Heinz Nixdorf Institut, Universität Paderborn
Integriertes System
Testen der funktionalen Anforderungen
Use Cases als Basis für die Testfallerstellung nehmen
Software(technik)praktikum - Tutorial Testen
Stand: 2010
22
Bug gefunden – und nun?
© Fachgebiet Softwaretechnik, Heinz Nixdorf Institut, Universität Paderborn
Bugtracker: https://trac.cs.upb.de/swtpra2012-XY
Software(technik)praktikum - Tutorial Testen
Stand: 2010
23
Testwerkzeuge
Wir geben für das Praktikum folgende Werkzeuge vor:
© Fachgebiet Softwaretechnik, Heinz Nixdorf Institut, Universität Paderborn
JUnit (http://www.junit.org/index.htm)
EMMA (http://emma.sourceforge.net/index.html): ein
Open-source Testwerkzeug zur Messung von
Anweisungsüberdeckungen. Bzw. EclEmma
(http://www.eclemma.org/userdoc/index.html): Emma für
Eclipse
Software(technik)praktikum - Tutorial Testen
Stand: 2010
24
Software(technik)praktikum - Tutorial Testen
Stand: 2010
25
© Fachgebiet Softwaretechnik, Heinz Nixdorf Institut, Universität Paderborn