SlideShare uma empresa Scribd logo
1 de 101
Baixar para ler offline
BEI UNSTESTEN
LAUTER AFFEN
Das Ende der Bananensoftware
Dr. Jeremias Rößler
JUG-Saxony Day 2016
Änderung
Fehler
Testen
Wer hat manuell regressionsgetestet?
Wer hat manuell getestet?
Wem hat das Spaß gemacht?
UMFRAGE
UMFRAGE
Warum haben Sie nicht automatisch getestet?
public void testSomething() throws Exception {
// here be some test code ...
UIElement element = driver.getElement(“path/to/element”);
assertEquals(null, element.getAction());
assertEquals(“action”, element.getActionCommand());
assertEquals(true, element.isEnabled());
assertEquals(true, element.isFocusable());
assertEquals(“Lucida Grande”, element.getFont().getName());
assertEquals(13, element.getFont().getSize());
assertEquals(0, element.getFont().getStyle());
assertEquals(23, element.getHeight());
assertEquals(null, element.getIcon());
assertEquals(0, element.getMnemonic());
assertEquals(null, element.getPressedIcon());
assertEquals(true, element.isSelected());
assertEquals(“label”, element.getText());
assertEquals(119, element.getWidth());
assertEquals(27, element.getX());
assertEquals(191, element.getY());
}
AUTOMATISCH
Mehr-Aufwand
Zeit
Einsparung
Automatisierung
keine Zeit
keine
automatische
Automatisierung!
SW Entwicklung
1
3
Testen
Programmieren
+
Rest
gute	
Software!
=	
gut	getestet	
nach jeder
Änderung
Infinite-Monkey-Theorem:
Wenn eine Affe nur lange genug auf einer
Schreibmaschine tippt,
schreibt er irgendwann alle Werke von Shakespeare.
Wir ersetzen die Schreibmaschine
mit einem Computer...
Infinite Monkey
public static void main(String... args) throws Exception {
Robot robot = new Robot();
while (true) {
robot.mouseMove(random.nextInt(maxX), random.nextInt(maxY));
robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
robot.delay(200);
for (char inputChar : randomString().toCharArray()) {
robot.keyPress((int) inputChar);
robot.keyRelease((int) inputChar);
robot.delay(10);
}
robot.keyPress(KeyEvent.VK_ENTER);
robot.keyRelease(KeyEvent.VK_ENTER);
}
}
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Infinite Monkey
DEMO
Aufwand
pro Fehler
Qualität
100%
= 0 Fehler
Intelligenter Affe
public static void main(String... args) throws Exception {
WebDriver driver = new FirefoxDriver();
driver.get("http://www.retest.de");
while (true) {
List<WebElement> links = driver.findElements(By.tagName("a"));
links.get(random.nextInt(links.size())).click();
Thread.sleep(500);
List<WebElement> fields =
driver.findElements(By.xpath("//input[@type='text']"));
WebElement field = fields.get(random.nextInt(fields.size()));
field.sendKeys(randomString());
Thread.sleep(500);
}
}
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Intelligenter Affe
DEMO
Intelligenter Affe
gremlins.js
Open Source Produkte
UI/Application Exerciser Monkey
NetFlix Chaos Monkey
Intelligenter Affe
?
Problemraum
Problem
raum
Türme von Hanoi
© André Karwath aka Aka
Quelle: http://en.wikipedia.org/wiki/File:Tower_of_Hanoi_4.gif
1. class TuermeVonHanoi():
2. def __init__(self):
3. self.A = [6, 5, 4, 3, 2, 1]
4. self.B = []
5. self.C = []
6.
7. def AtoB(self): self.B.append(self.A.pop())
8.
9. def AtoC(self): self.C.append(self.A.pop())
10.
11. def BtoA(self): self.A.append(self.B.pop())
12.
13. def BtoC(self): self.C.append(self.B.pop())
14.
15. def CtoA(self): self.A.append(self.C.pop())
16.
17. def CtoB(self): self.B.append(self.C.pop())
18.
19. def valid(self):
20. return all(self.A[i + 1] < self.A[i] for i in range(len(self.A)-1)) and 
21. all(self.B[m + 1] < self.B[m] for m in range(len(self.B)-1)) and 
22. all(self.C[n + 1] < self.C[n] for n in range(len(self.C)-1))
Türme von Hanoi
Rekursiv
1. def bewege(schritte, i, a_name, b_name, c_name):
2. if (i > 0):
3. bewege(schritte, i-1, a_name, c_name, b_name)
4. schritte.append('tuerme.' + a_name + 'to' + c_name + ‘()')
5. bewege(schritte, i-1, b_name, a_name, c_name)
6. return schritte
7.  
8. def algorithmus():
9. return bewege([], 6, 'A', 'B', 'C')
1. schritte = [
2. 'tuerme.AtoB()',  #[654321][][] -> [65432][1][]
3. 'tuerme.AtoC()',  #[65432][1][] -> [6543][1][2]
4. 'tuerme.BtoC()',  #[6543][1][2] -> [6543][][21]
5. 'tuerme.AtoB()',  #[6543][][21] -> [654][3][21]
6. 'tuerme.CtoA()',  #[654][3][21] -> [6541][3][2]
7. 'tuerme.CtoB()',  #[6541][3][2] -> [6541][32][]
8. 'tuerme.AtoB()',  #[6541][32][] -> [654][321][]
9. 'tuerme.AtoC()',  #[654][321][] -> [65][321][4]
10. 'tuerme.BtoC()',  #[65][321][4] -> [65][32][41]
11. 'tuerme.BtoA()',  #[65][32][41] -> [652][3][41]
12. 'tuerme.CtoA()',  #[652][3][41] -> [6521][3][4]
13. 'tuerme.BtoC()',  #[6521][3][4] -> [6521][][43]
14. 'tuerme.AtoB()',  #[6521][][43] -> [652][1][43]
15. 'tuerme.AtoC()',  #[652][1][43] -> [65][1][432]
16. 'tuerme.BtoC()',  #[65][1][432] -> [65][][4321]
17. 'tuerme.AtoB()',  #[65][][4321] -> [6][5][4321]
18. 'tuerme.CtoA()',  #[6][5][4321] -> [61][5][432]
Türme von Hanoi
Manuell
Türme von Hanoi
Möglichkeiten
63
>2
9.223.372.036.854.775.808
Türme von Hanoi
Möglichkeiten
Türme von Hanoi
Möglichkeiten
292.471.208 Jahre
Türme von Hanoi
Automatisch?
Türme von Hanoi
Zielfunktion
1. def min_zielfunktion(tuerme): return (21 - sum(tuerme.C))
while (min_zielfunktion(loesung) > 0)
neue_loesung = addNextStep(loesung)
if (better(neue_loesung, loesung))
loesung = neue_loesung
DEMO
Türme von Hanoi
Stochastischer Bergsteigeralgorithmus
Türme von Hanoi
Stochastischer Bergsteigeralgorithmus
['tuerme.AtoC()'] -> [65432][][1], Anzahl Schritte: 1, Zielwert: 20
while (min_zielfunktion(loesung) > 0)
neue_loesung = addNextStep(loesung)
if (better(neue_loesung, loesung))
loesung = neue_loesung
nach_1000_versuchen_neustarten:
Türme von Hanoi
Suchraumlandschaft
while (min_zielfunktion(loesung) > 0)
neue_loesung = addNextStep(loesung)
if (better(neue_loesung, loesung)
loesung = neue_loesung
or 50/50_chance)
DEMO
Türme von Hanoi
Zufallsbewegung
[tuerme.AtoB(), tuerme.BtoC(), tuerme.CtoB(), tuerme.BtoA(), tuerme.AtoB(), ...] ->
[51][][6432], Anzahl Schritte: 2018, Zielwert: 6
Türme von Hanoi
Zufallsbewegung
while (min_zielfunktion(loesung) > 0)
neue_loesung = addNextStep(loesung)
if (better(neue_loesung, loesung)
loesung = neue_loesung
or 50/50_chance)or decreasing_chance)
Quelle: http://www.flickr.com/photos/51035774131@N01/27145468/in/photostream/
© crowbert
Türme von Hanoi
Simulierte Abkühlung
Mehrere Suchen gleichzeitig?
Quelle: https://www.youtube.com/watch?v=yJpLUP93pRo
loesungen = []
beste = get_beste(loesungen)
while (min_zielfunktion(beste) > 0)
neue_loesungen = addNextSteps(loesungen)
loesungen = getXBest(neue_loesungen)
beste = get_beste(loesungen)
loesungen = []
beste = get_beste(loesungen)
while (min_zielfunktion(beste) > 0)
neue_loesungen = addNextSteps(loesungen)
loesungen = getXBest(neue_loesungen)
beste = get_beste(loesungen)
Quelle: http://cnx.org/content/m47304/latest/
© Robert Bear and David Rintoul
Gen
Exon
Intron
Exon
loesungen = []
beste = get_beste(loesungen)
while (min_zielfunktion(beste) > 0)
neue_loesungen = crossover(loesungen)
neue_loesungen =
addNextSteps(neue_loesungen)
loesungen = getXBest(neue_loesungen)
beste = get_beste(loesungen)
DEMO
Türme von Hanoi
Genetischer Algorithmus
[tuerme.AtoB(), tuerme.AtoC(), tuerme.BtoA(), tuerme.AtoB(), tuerme.BtoA(), ...] -> [][][654321], Anzahl
Schritte: 1727, Zielwert: 0
Türme von Hanoi
Genetischer Algorithmus
Genetischer Algorithmus
Effizienz
66 Sekunden
statt
150 Mio. Jahre
Welche Fehler kann der Affe finden?
When is a bug not a bug?
When it’s a feature!
1. if (name[0] == '.') continue;
Is it a bug?
.
..
text.c
other.files
Is it a bug?
Is it a bug?
What is a bug?
Without specification, there are no bugs
— only surprises.
Brian Kernighan
“
What is a bug?
Spezifikation Code
Nutzererwartung Code
Modell Code
Monkey Testing
Spezifikation Code
Nutzererwartung Code
Modell Code
Wozu testen wir?
Nach
Implementierung?
1 + 1 = 3
2 + 2 = 4
Wozu testen wir?
Nach
Implementierung?
1 + 1 = 3
2 + 2 = 4
Nach
Änderung?
1 + 1 = 3
1 + 1 = 5
DIFFERENCE-TESTING
Wenn man nur einen Hammer hat
sieht alles aus wie ein Nagel…
High test/code ratio
is a symptom of high coupling in the code.
Or wasteful testing.
Kent Beck
“
GRUNDPROBLEM
Software ändert sich!
festes Set an Tests
zufallsbasiert
deterministisch
Monkey-Testing/
Genetischer Algorithmus
Testing/
Behavioral Diff
Mehr-Aufwand
Zeit
Einsparung
Capture/Replay
Golden Master
Versionskontrolle
+
+
= ReTest
Intelligenter Affe
Summary
Monkey-Testing:
billiger
schneller
besser
multipliziert manuelle Tests
Behavioral Diff
kein Pflegeaufwand
kein wasteful testing
trotzdem “vollständiges “ Testen
Ende 2016
www.retest.de
Machen Sie den Test!
www.retest.de

Mais conteúdo relacionado

Destaque

Multichannel analyse - AT Internet Marketing on Tour 2011
Multichannel analyse - AT Internet Marketing on Tour 2011Multichannel analyse - AT Internet Marketing on Tour 2011
Multichannel analyse - AT Internet Marketing on Tour 2011
AT Internet
 
Los métodos anticonceptivos
Los métodos anticonceptivosLos métodos anticonceptivos
Los métodos anticonceptivos
98111704007
 
KY NANG BAN HANG BUOI 3
KY NANG BAN HANG BUOI 3KY NANG BAN HANG BUOI 3
KY NANG BAN HANG BUOI 3
Vy Trần
 

Destaque (20)

Per Knopfdruck in die Cloud – Composite C1 mit dem Azure Publisher parallel i...
Per Knopfdruck in die Cloud – Composite C1 mit dem Azure Publisher parallel i...Per Knopfdruck in die Cloud – Composite C1 mit dem Azure Publisher parallel i...
Per Knopfdruck in die Cloud – Composite C1 mit dem Azure Publisher parallel i...
 
Rosales maria fernanda etica aplicada al derecho
Rosales maria fernanda etica aplicada al derechoRosales maria fernanda etica aplicada al derecho
Rosales maria fernanda etica aplicada al derecho
 
Women in Technology - darum sollten Sie sich bewerben
Women in Technology - darum sollten Sie sich bewerbenWomen in Technology - darum sollten Sie sich bewerben
Women in Technology - darum sollten Sie sich bewerben
 
Coloides
ColoidesColoides
Coloides
 
Tarea #3 costo y cobertura
Tarea #3 costo y coberturaTarea #3 costo y cobertura
Tarea #3 costo y cobertura
 
Bitácoras de tecnología
Bitácoras de tecnologíaBitácoras de tecnología
Bitácoras de tecnología
 
Hit2 l2s25
Hit2 l2s25Hit2 l2s25
Hit2 l2s25
 
EMarCon VHS Effizientes Social Media III
EMarCon VHS Effizientes Social Media IIIEMarCon VHS Effizientes Social Media III
EMarCon VHS Effizientes Social Media III
 
Multichannel analyse - AT Internet Marketing on Tour 2011
Multichannel analyse - AT Internet Marketing on Tour 2011Multichannel analyse - AT Internet Marketing on Tour 2011
Multichannel analyse - AT Internet Marketing on Tour 2011
 
Los métodos anticonceptivos
Los métodos anticonceptivosLos métodos anticonceptivos
Los métodos anticonceptivos
 
Jose maria velaz
Jose maria velazJose maria velaz
Jose maria velaz
 
Franquicias de alitas
Franquicias de alitasFranquicias de alitas
Franquicias de alitas
 
PUEBLOS MAGICOS *ZACATLAN DE LAS MANZANAS*
PUEBLOS MAGICOS *ZACATLAN DE LAS MANZANAS*PUEBLOS MAGICOS *ZACATLAN DE LAS MANZANAS*
PUEBLOS MAGICOS *ZACATLAN DE LAS MANZANAS*
 
EMarCon VHS Effizientes Social Media II aktualisiert am 2.5.15
EMarCon VHS Effizientes Social Media II aktualisiert am 2.5.15EMarCon VHS Effizientes Social Media II aktualisiert am 2.5.15
EMarCon VHS Effizientes Social Media II aktualisiert am 2.5.15
 
Las drogas en los jovenes
Las drogas en los jovenesLas drogas en los jovenes
Las drogas en los jovenes
 
Die Eco Brands kommen
Die Eco Brands kommenDie Eco Brands kommen
Die Eco Brands kommen
 
KY NANG BAN HANG BUOI 3
KY NANG BAN HANG BUOI 3KY NANG BAN HANG BUOI 3
KY NANG BAN HANG BUOI 3
 
Gem gg k
Gem gg kGem gg k
Gem gg k
 
Las drogas en los jovenes
Las drogas en los jovenesLas drogas en los jovenes
Las drogas en los jovenes
 
Virus y vscunas
Virus y vscunasVirus y vscunas
Virus y vscunas
 

Semelhante a Bei uns testen lauter Affen - Das Ende der Banensoftware

Differenzial Analyse in der Praxis (Florian Walther)
Differenzial Analyse in der Praxis (Florian Walther)Differenzial Analyse in der Praxis (Florian Walther)
Differenzial Analyse in der Praxis (Florian Walther)
GEEKcon
 
Einführung Software Testing und Qualitätssicherung
Einführung Software Testing und QualitätssicherungEinführung Software Testing und Qualitätssicherung
Einführung Software Testing und Qualitätssicherung
Christian Baranowski
 

Semelhante a Bei uns testen lauter Affen - Das Ende der Banensoftware (19)

Komponententests und Testabdeckung
Komponententests und TestabdeckungKomponententests und Testabdeckung
Komponententests und Testabdeckung
 
Explain explain
Explain explainExplain explain
Explain explain
 
Differenzial Analyse in der Praxis (Florian Walther)
Differenzial Analyse in der Praxis (Florian Walther)Differenzial Analyse in der Praxis (Florian Walther)
Differenzial Analyse in der Praxis (Florian Walther)
 
Battle of the Languages: Java und Python im Wettstreit beim Lösen von Program...
Battle of the Languages: Java und Python im Wettstreit beim Lösen von Program...Battle of the Languages: Java und Python im Wettstreit beim Lösen von Program...
Battle of the Languages: Java und Python im Wettstreit beim Lösen von Program...
 
Unit testing mit Javascript
Unit testing mit JavascriptUnit testing mit Javascript
Unit testing mit Javascript
 
Warum ECMAScript 6 die Welt ein Stückchen besser macht
Warum ECMAScript 6 die Welt ein Stückchen besser machtWarum ECMAScript 6 die Welt ein Stückchen besser macht
Warum ECMAScript 6 die Welt ein Stückchen besser macht
 
Reaktive Programmierung In Java. Warum? Wie?
Reaktive Programmierung In Java. Warum? Wie?Reaktive Programmierung In Java. Warum? Wie?
Reaktive Programmierung In Java. Warum? Wie?
 
Clean Test Code (Clean Code Days)
Clean Test Code (Clean Code Days)Clean Test Code (Clean Code Days)
Clean Test Code (Clean Code Days)
 
nagiosplugin - eine Python-Biblioth­ek für Monitoring-Plug­ins
nagiosplugin - eine Python-Biblioth­ek für Monitoring-Plug­ins nagiosplugin - eine Python-Biblioth­ek für Monitoring-Plug­ins
nagiosplugin - eine Python-Biblioth­ek für Monitoring-Plug­ins
 
Best Practices für TDD in JavaScript
Best Practices für TDD in JavaScriptBest Practices für TDD in JavaScript
Best Practices für TDD in JavaScript
 
Funktionale Programmierung und mehr mit Scala
Funktionale Programmierung und mehr mit ScalaFunktionale Programmierung und mehr mit Scala
Funktionale Programmierung und mehr mit Scala
 
Microbenchmarks - Wer nicht weiß, was er misst misst Mist
Microbenchmarks - Wer nicht weiß, was er misst misst MistMicrobenchmarks - Wer nicht weiß, was er misst misst Mist
Microbenchmarks - Wer nicht weiß, was er misst misst Mist
 
Testing tools
Testing toolsTesting tools
Testing tools
 
Praesentation TYPO3Camp Berlin Speed mit Extbase
Praesentation TYPO3Camp Berlin Speed mit ExtbasePraesentation TYPO3Camp Berlin Speed mit Extbase
Praesentation TYPO3Camp Berlin Speed mit Extbase
 
Mögen die Tests mit dir sein
Mögen die Tests mit dir seinMögen die Tests mit dir sein
Mögen die Tests mit dir sein
 
Woher kommen Software-Fehler?
Woher kommen Software-Fehler?Woher kommen Software-Fehler?
Woher kommen Software-Fehler?
 
SOLID Prinzipien, Designgrundlagen objektorientierter Systeme
SOLID Prinzipien, Designgrundlagen objektorientierter SystemeSOLID Prinzipien, Designgrundlagen objektorientierter Systeme
SOLID Prinzipien, Designgrundlagen objektorientierter Systeme
 
Einführung Software Testing und Qualitätssicherung
Einführung Software Testing und QualitätssicherungEinführung Software Testing und Qualitätssicherung
Einführung Software Testing und Qualitätssicherung
 
SEROM 2018 - 11/14/17/20 - C++ gestern heute und morgen
SEROM 2018 - 11/14/17/20 - C++ gestern heute und morgenSEROM 2018 - 11/14/17/20 - C++ gestern heute und morgen
SEROM 2018 - 11/14/17/20 - C++ gestern heute und morgen
 

Mais de SAP SE

Mais de SAP SE (13)

Informationstechnik
InformationstechnikInformationstechnik
Informationstechnik
 
Managing bias in data
Managing bias in dataManaging bias in data
Managing bias in data
 
Testing without assertions - #HUSTEF2019
Testing without assertions - #HUSTEF2019Testing without assertions - #HUSTEF2019
Testing without assertions - #HUSTEF2019
 
Testing Without Assertions
Testing Without AssertionsTesting Without Assertions
Testing Without Assertions
 
Testing without Assertions
Testing without AssertionsTesting without Assertions
Testing without Assertions
 
recheck and the Sorcerer's Stone: Turning Selenium into Adamantium
recheck and the Sorcerer's Stone: Turning Selenium into Adamantiumrecheck and the Sorcerer's Stone: Turning Selenium into Adamantium
recheck and the Sorcerer's Stone: Turning Selenium into Adamantium
 
Lightning Talk: When will AI take my Job as a Tester
Lightning Talk: When will AI take my Job as a TesterLightning Talk: When will AI take my Job as a Tester
Lightning Talk: When will AI take my Job as a Tester
 
Testing ohne assertions
Testing ohne assertionsTesting ohne assertions
Testing ohne assertions
 
How to apply AI to Testing
How to apply AI to TestingHow to apply AI to Testing
How to apply AI to Testing
 
When will ai take my job as a tester
When will ai take my job as a testerWhen will ai take my job as a tester
When will ai take my job as a tester
 
AI and the End of the World
AI and the End of the WorldAI and the End of the World
AI and the End of the World
 
Wie man KI ins Testing bringt
Wie man KI ins Testing bringtWie man KI ins Testing bringt
Wie man KI ins Testing bringt
 
Isolating Failure Causes through Test Case Generation
Isolating Failure Causes through Test Case GenerationIsolating Failure Causes through Test Case Generation
Isolating Failure Causes through Test Case Generation
 

Bei uns testen lauter Affen - Das Ende der Banensoftware