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/t...
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 ...
Wir ersetzen die Schreibmaschine
mit einem Computer...
Infinite Monkey
public static void main(String... args) throws Exception {
Robot robot = new Robot();
while (true) {
robot....
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();
driv...
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 A...
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_nam...
1. schritte = [
2. 'tuerme.AtoB()',  #[654321][][] -> [65432][1][]
3. 'tuerme.AtoC()',  #[65432][1][] -> [6543][1][2]
4. '...
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 = neu...
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 = neu...
Türme von Hanoi
Suchraumlandschaft
while (min_zielfunktion(loesung) > 0)
neue_loesung = addNextStep(loesung)
if (better(neue_loesung, loesung)
loesung = neue...
DEMO
Türme von Hanoi
Zufallsbewegung
[tuerme.AtoB(), tuerme.BtoC(), tuerme.CtoB(), tuerme.BtoA(), tuerme.AtoB(), ...] ->
[51][][6432], Anzahl Schritte: 2018, Z...
while (min_zielfunktion(loesung) > 0)
neue_loesung = addNextStep(loesung)
if (better(neue_loesung, loesung)
loesung = neue...
Quelle: http://www.flickr.com/photos/51035774131@N01/27145468/in/photostream/
© crowbert
Türme von Hanoi
Simulierte Abkühlu...
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)
l...
loesungen = []
beste = get_beste(loesungen)
while (min_zielfunktion(beste) > 0)
neue_loesungen = addNextSteps(loesungen)
l...
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...
DEMO
Türme von Hanoi
Genetischer Algorithmus
[tuerme.AtoB(), tuerme.AtoC(), tuerme.BtoA(), tuerme.AtoB(), tuerme.BtoA(), ...] -> [][][654321], Anzahl
Schritte: 1727, Z...
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 Pfle...
Ende 2016
www.retest.de
Machen Sie den Test!
www.retest.de
Bei uns testen lauter Affen - Das Ende der Banensoftware
Bei uns testen lauter Affen - Das Ende der Banensoftware
Bei uns testen lauter Affen - Das Ende der Banensoftware
Bei uns testen lauter Affen - Das Ende der Banensoftware
Bei uns testen lauter Affen - Das Ende der Banensoftware
Bei uns testen lauter Affen - Das Ende der Banensoftware
Bei uns testen lauter Affen - Das Ende der Banensoftware
Bei uns testen lauter Affen - Das Ende der Banensoftware
Bei uns testen lauter Affen - Das Ende der Banensoftware
Bei uns testen lauter Affen - Das Ende der Banensoftware
Bei uns testen lauter Affen - Das Ende der Banensoftware
Bei uns testen lauter Affen - Das Ende der Banensoftware
Bei uns testen lauter Affen - Das Ende der Banensoftware
Bei uns testen lauter Affen - Das Ende der Banensoftware
Bei uns testen lauter Affen - Das Ende der Banensoftware
Bei uns testen lauter Affen - Das Ende der Banensoftware
Bei uns testen lauter Affen - Das Ende der Banensoftware
Bei uns testen lauter Affen - Das Ende der Banensoftware
Bei uns testen lauter Affen - Das Ende der Banensoftware
Bei uns testen lauter Affen - Das Ende der Banensoftware
Bei uns testen lauter Affen - Das Ende der Banensoftware
Bei uns testen lauter Affen - Das Ende der Banensoftware
Bei uns testen lauter Affen - Das Ende der Banensoftware
Bei uns testen lauter Affen - Das Ende der Banensoftware
Bei uns testen lauter Affen - Das Ende der Banensoftware
Bei uns testen lauter Affen - Das Ende der Banensoftware
Bei uns testen lauter Affen - Das Ende der Banensoftware
Bei uns testen lauter Affen - Das Ende der Banensoftware
Bei uns testen lauter Affen - Das Ende der Banensoftware
Nächste SlideShare
Wird geladen in …5
×

Bei uns testen lauter Affen - Das Ende der Banensoftware

66 Aufrufe

Veröffentlicht am

Wer hat den Teufelskreis aus Testing und Debugging noch nicht erlebt:
In zwei Wochen ist Release-Date und die Tester finden täglich neue Fehler.
Jeder Fehler führt zu einer Änderung im Programm.
Und jede Änderung kann selbst wieder Fehler verursachen und muss deshalb getestet werden...

Software-Fehler kosten die deutsche Wirtschaft bis zu 10 Mrd Euro im Jahr. Deshalb macht Testen derzeit ca. 20% der Kosten einer neuen Software aus, Tendenz steigen. Alleine für Java-Software sind das in Deutschland ca. 3,4 Mrd. Euro im Jahr. Diese Kosten entstehen hauptsächlich durch manuelles Testen bzw. manuelle Testfallerstellung. Der Automatisierungsgrad beim Testen liegt derzeit bei ca. 15%. Was wenn man automatisch Testen könnte? Und d.h. nicht manuell erstellte Tests (die will sowieso keiner erstellen und erst recht keiner pflegen) automatisch ablaufen lassen, sondern wirklich vollautomatisch Testen?

Monkey-Testing bezeichnet zufallsbasiertes Testen von Software über die Benutzeroberfläche, und findet vollautomatisch und kostengünstig Fehler. In diesem Vortrag zeige ich, wie jeder Anwesende mit ein paar Zeilen Code einen eigenen primitiven Affen zum automatischen Testen programmieren kann. Davon ausgehend zeige ich Ansätze und Konzepte, wie man diesen Affen (u.a. mit genetischen Algorithmen) immer weiter verbessern kann, bis er teilweise bessere Ergebnisse als menschliche Tester bringt. Dazu gibt es Demos und Erfahrungsberichte aus großen Projekten.

Veröffentlicht in: Software
0 Kommentare
0 Gefällt mir
Statistik
Notizen
  • Als Erste(r) kommentieren

  • Gehören Sie zu den Ersten, denen das gefällt!

Keine Downloads
Aufrufe
Aufrufe insgesamt
66
Auf SlideShare
0
Aus Einbettungen
0
Anzahl an Einbettungen
1
Aktionen
Geteilt
0
Downloads
1
Kommentare
0
Gefällt mir
0
Einbettungen 0
Keine Einbettungen

Keine Notizen für die Folie

Bei uns testen lauter Affen - Das Ende der Banensoftware

  1. 1. BEI UNSTESTEN LAUTER AFFEN Das Ende der Bananensoftware Dr. Jeremias Rößler JUG-Saxony Day 2016
  2. 2. Änderung Fehler Testen
  3. 3. Wer hat manuell regressionsgetestet? Wer hat manuell getestet? Wem hat das Spaß gemacht? UMFRAGE
  4. 4. UMFRAGE Warum haben Sie nicht automatisch getestet?
  5. 5. 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()); }
  6. 6. AUTOMATISCH
  7. 7. Mehr-Aufwand Zeit Einsparung
  8. 8. Automatisierung keine Zeit keine automatische Automatisierung!
  9. 9. SW Entwicklung 1 3 Testen Programmieren + Rest
  10. 10. gute Software! = gut getestet nach jeder Änderung
  11. 11. Infinite-Monkey-Theorem: Wenn eine Affe nur lange genug auf einer Schreibmaschine tippt, schreibt er irgendwann alle Werke von Shakespeare.
  12. 12. Wir ersetzen die Schreibmaschine mit einem Computer...
  13. 13. 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.
  14. 14. Infinite Monkey DEMO
  15. 15. Aufwand pro Fehler Qualität 100% = 0 Fehler
  16. 16. 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.
  17. 17. Intelligenter Affe DEMO
  18. 18. Intelligenter Affe
  19. 19. gremlins.js Open Source Produkte UI/Application Exerciser Monkey NetFlix Chaos Monkey
  20. 20. Intelligenter Affe ?
  21. 21. Problemraum Problem raum
  22. 22. Türme von Hanoi © André Karwath aka Aka Quelle: http://en.wikipedia.org/wiki/File:Tower_of_Hanoi_4.gif
  23. 23. 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))
  24. 24. 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')
  25. 25. 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
  26. 26. Türme von Hanoi Möglichkeiten 63 >2
  27. 27. 9.223.372.036.854.775.808 Türme von Hanoi Möglichkeiten
  28. 28. Türme von Hanoi Möglichkeiten 292.471.208 Jahre
  29. 29. Türme von Hanoi Automatisch?
  30. 30. Türme von Hanoi Zielfunktion 1. def min_zielfunktion(tuerme): return (21 - sum(tuerme.C))
  31. 31. while (min_zielfunktion(loesung) > 0) neue_loesung = addNextStep(loesung) if (better(neue_loesung, loesung)) loesung = neue_loesung
  32. 32. DEMO Türme von Hanoi Stochastischer Bergsteigeralgorithmus
  33. 33. Türme von Hanoi Stochastischer Bergsteigeralgorithmus ['tuerme.AtoC()'] -> [65432][][1], Anzahl Schritte: 1, Zielwert: 20
  34. 34. while (min_zielfunktion(loesung) > 0) neue_loesung = addNextStep(loesung) if (better(neue_loesung, loesung)) loesung = neue_loesung nach_1000_versuchen_neustarten:
  35. 35. Türme von Hanoi Suchraumlandschaft
  36. 36. while (min_zielfunktion(loesung) > 0) neue_loesung = addNextStep(loesung) if (better(neue_loesung, loesung) loesung = neue_loesung or 50/50_chance)
  37. 37. DEMO Türme von Hanoi Zufallsbewegung
  38. 38. [tuerme.AtoB(), tuerme.BtoC(), tuerme.CtoB(), tuerme.BtoA(), tuerme.AtoB(), ...] -> [51][][6432], Anzahl Schritte: 2018, Zielwert: 6 Türme von Hanoi Zufallsbewegung
  39. 39. while (min_zielfunktion(loesung) > 0) neue_loesung = addNextStep(loesung) if (better(neue_loesung, loesung) loesung = neue_loesung or 50/50_chance)or decreasing_chance)
  40. 40. Quelle: http://www.flickr.com/photos/51035774131@N01/27145468/in/photostream/ © crowbert Türme von Hanoi Simulierte Abkühlung
  41. 41. Mehrere Suchen gleichzeitig?
  42. 42. Quelle: https://www.youtube.com/watch?v=yJpLUP93pRo
  43. 43. loesungen = [] beste = get_beste(loesungen) while (min_zielfunktion(beste) > 0) neue_loesungen = addNextSteps(loesungen) loesungen = getXBest(neue_loesungen) beste = get_beste(loesungen)
  44. 44. loesungen = [] beste = get_beste(loesungen) while (min_zielfunktion(beste) > 0) neue_loesungen = addNextSteps(loesungen) loesungen = getXBest(neue_loesungen) beste = get_beste(loesungen)
  45. 45. Quelle: http://cnx.org/content/m47304/latest/ © Robert Bear and David Rintoul
  46. 46. Gen Exon Intron Exon
  47. 47. 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)
  48. 48. DEMO Türme von Hanoi Genetischer Algorithmus
  49. 49. [tuerme.AtoB(), tuerme.AtoC(), tuerme.BtoA(), tuerme.AtoB(), tuerme.BtoA(), ...] -> [][][654321], Anzahl Schritte: 1727, Zielwert: 0 Türme von Hanoi Genetischer Algorithmus
  50. 50. Genetischer Algorithmus Effizienz 66 Sekunden statt 150 Mio. Jahre
  51. 51. Welche Fehler kann der Affe finden?
  52. 52. When is a bug not a bug? When it’s a feature!
  53. 53. 1. if (name[0] == '.') continue; Is it a bug? . .. text.c other.files
  54. 54. Is it a bug?
  55. 55. Is it a bug?
  56. 56. What is a bug? Without specification, there are no bugs — only surprises. Brian Kernighan “
  57. 57. What is a bug? Spezifikation Code Nutzererwartung Code Modell Code
  58. 58. Monkey Testing Spezifikation Code Nutzererwartung Code Modell Code
  59. 59. Wozu testen wir? Nach Implementierung? 1 + 1 = 3 2 + 2 = 4
  60. 60. Wozu testen wir? Nach Implementierung? 1 + 1 = 3 2 + 2 = 4 Nach Änderung? 1 + 1 = 3 1 + 1 = 5
  61. 61. DIFFERENCE-TESTING
  62. 62. Wenn man nur einen Hammer hat sieht alles aus wie ein Nagel…
  63. 63. High test/code ratio is a symptom of high coupling in the code. Or wasteful testing. Kent Beck “
  64. 64. GRUNDPROBLEM Software ändert sich!
  65. 65. festes Set an Tests zufallsbasiert deterministisch
  66. 66. Monkey-Testing/ Genetischer Algorithmus Testing/ Behavioral Diff
  67. 67. Mehr-Aufwand Zeit Einsparung
  68. 68. Capture/Replay Golden Master Versionskontrolle + + = ReTest
  69. 69. Intelligenter Affe Summary Monkey-Testing: billiger schneller besser multipliziert manuelle Tests Behavioral Diff kein Pflegeaufwand kein wasteful testing trotzdem “vollständiges “ Testen
  70. 70. Ende 2016
  71. 71. www.retest.de
  72. 72. Machen Sie den Test! www.retest.de

×