101
BEI UNS TESTEN LAUTER AFFEN Das Ende der Bananensoftware Dr. Jeremias Rößler JUG-Saxony Day 2016

Bei uns testen lauter Affen - Das Ende der Banensoftware

  • Upload
    retest

  • View
    38

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Bei uns testen lauter Affen - Das Ende der Banensoftware

BEI UNS TESTEN LAUTER AFFEN

Das Ende der Bananensoftware

Dr. Jeremias Rößler

JUG-Saxony Day 2016

Page 2: Bei uns testen lauter Affen - Das Ende der Banensoftware

Änderung

Fehler

Testen

Page 3: Bei uns testen lauter Affen - Das Ende der Banensoftware

Wer hat manuell regressionsgetestet?

Wer hat manuell getestet?

Wem hat das Spaß gemacht?

UMFRAGE

Page 4: Bei uns testen lauter Affen - Das Ende der Banensoftware

UMFRAGE

Warum haben Sie nicht automatisch getestet?

Page 5: Bei uns testen lauter Affen - Das Ende der Banensoftware
Page 6: Bei uns testen lauter Affen - Das Ende der Banensoftware
Page 7: Bei uns testen lauter Affen - Das Ende der Banensoftware
Page 8: Bei uns testen lauter Affen - Das Ende der Banensoftware

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());

}

Page 9: Bei uns testen lauter Affen - Das Ende der Banensoftware
Page 10: Bei uns testen lauter Affen - Das Ende der Banensoftware

AUTOMATISCH

Page 11: Bei uns testen lauter Affen - Das Ende der Banensoftware

Mehr-Aufwand

Zeit

Einsparung

Page 12: Bei uns testen lauter Affen - Das Ende der Banensoftware

Automatisierung

keine Zeit

keine

automatische

Automatisierung!

Page 13: Bei uns testen lauter Affen - Das Ende der Banensoftware
Page 14: Bei uns testen lauter Affen - Das Ende der Banensoftware

SW Entwicklung

13

Testen

Programmieren +

Rest

Page 15: Bei uns testen lauter Affen - Das Ende der Banensoftware

gute

Software !=

gutgetestetnach jeder

Änderung

Page 16: Bei uns testen lauter Affen - Das Ende der Banensoftware

Infinite-Monkey-Theorem:Wenn eine Affe nur lange genug auf einer

Schreibmaschine tippt, schreibt er irgendwann alle Werke von Shakespeare.

Page 17: Bei uns testen lauter Affen - Das Ende der Banensoftware

Wir ersetzen die Schreibmaschine mit einem Computer...

Page 18: Bei uns testen lauter Affen - Das Ende der Banensoftware

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.

Page 19: Bei uns testen lauter Affen - Das Ende der Banensoftware

Infinite Monkey

DEMO

Page 20: Bei uns testen lauter Affen - Das Ende der Banensoftware
Page 21: Bei uns testen lauter Affen - Das Ende der Banensoftware
Page 22: Bei uns testen lauter Affen - Das Ende der Banensoftware

Aufwand pro Fehler

Qualität

100%= 0 Fehler

Page 23: Bei uns testen lauter Affen - Das Ende der Banensoftware
Page 24: Bei uns testen lauter Affen - Das Ende der Banensoftware

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.

Page 25: Bei uns testen lauter Affen - Das Ende der Banensoftware

Intelligenter Affe

DEMO

Page 26: Bei uns testen lauter Affen - Das Ende der Banensoftware
Page 27: Bei uns testen lauter Affen - Das Ende der Banensoftware

Intelligenter Affe

Page 28: Bei uns testen lauter Affen - Das Ende der Banensoftware

gremlins.js

Open Source Produkte

UI/Application Exerciser Monkey

NetFlix Chaos Monkey

Page 29: Bei uns testen lauter Affen - Das Ende der Banensoftware

Intelligenter Affe

?

Page 30: Bei uns testen lauter Affen - Das Ende der Banensoftware
Page 31: Bei uns testen lauter Affen - Das Ende der Banensoftware
Page 32: Bei uns testen lauter Affen - Das Ende der Banensoftware
Page 33: Bei uns testen lauter Affen - Das Ende der Banensoftware

Problemraum

Problemraum

Page 34: Bei uns testen lauter Affen - Das Ende der Banensoftware
Page 35: Bei uns testen lauter Affen - Das Ende der Banensoftware
Page 36: Bei uns testen lauter Affen - Das Ende der Banensoftware
Page 37: Bei uns testen lauter Affen - Das Ende der Banensoftware
Page 38: Bei uns testen lauter Affen - Das Ende der Banensoftware
Page 39: Bei uns testen lauter Affen - Das Ende der Banensoftware

Türme von Hanoi

© André Karwath aka Aka

Quelle: http://en.wikipedia.org/wiki/File:Tower_of_Hanoi_4.gif

Page 40: Bei uns testen lauter Affen - Das Ende der Banensoftware

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))

Page 41: Bei uns testen lauter Affen - Das Ende der Banensoftware

Türme von HanoiRekursiv

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')

Page 42: Bei uns testen lauter Affen - Das Ende der Banensoftware

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]19. 'tuerme.CtoB()', \ #[61][5][432] -> [61][52][43]

Türme von HanoiManuell

Page 43: Bei uns testen lauter Affen - Das Ende der Banensoftware

Türme von HanoiMöglichkeiten

63>2

Page 44: Bei uns testen lauter Affen - Das Ende der Banensoftware

9.223.372.036.854.775.808

Türme von HanoiMöglichkeiten

Page 45: Bei uns testen lauter Affen - Das Ende der Banensoftware

Türme von HanoiMöglichkeiten

292.471.208 Jahre

Page 46: Bei uns testen lauter Affen - Das Ende der Banensoftware

Türme von HanoiAutomatisch?

Page 47: Bei uns testen lauter Affen - Das Ende der Banensoftware

Türme von HanoiZielfunktion

1. def min_zielfunktion(tuerme): return (21 - sum(tuerme.C))

Page 48: Bei uns testen lauter Affen - Das Ende der Banensoftware

while (min_zielfunktion(loesung) > 0)neue_loesung = addNextStep(loesung)if (better(neue_loesung, loesung))loesung = neue_loesung

Page 49: Bei uns testen lauter Affen - Das Ende der Banensoftware

DEMO

Türme von HanoiStochastischer Bergsteigeralgorithmus

Page 50: Bei uns testen lauter Affen - Das Ende der Banensoftware

Türme von HanoiStochastischer Bergsteigeralgorithmus

['tuerme.AtoC()'] -> [65432][][1], Anzahl Schritte: 1, Zielwert: 20

Page 51: Bei uns testen lauter Affen - Das Ende der Banensoftware

while (min_zielfunktion(loesung) > 0)neue_loesung = addNextStep(loesung)if (better(neue_loesung, loesung))loesung = neue_loesung

nach_1000_versuchen_neustarten:

Page 52: Bei uns testen lauter Affen - Das Ende der Banensoftware

Türme von HanoiSuchraumlandschaft

Page 53: Bei uns testen lauter Affen - Das Ende der Banensoftware

while (min_zielfunktion(loesung) > 0)neue_loesung = addNextStep(loesung)if (better(neue_loesung, loesung)

loesung = neue_loesungor 50/50_chance)

Page 54: Bei uns testen lauter Affen - Das Ende der Banensoftware

DEMO

Türme von HanoiZufallsbewegung

Page 55: Bei uns testen lauter Affen - Das Ende der Banensoftware

[tuerme.AtoB(), tuerme.BtoC(), tuerme.CtoB(), tuerme.BtoA(), tuerme.AtoB(), ...] -> [51][][6432], Anzahl Schritte: 2018, Zielwert: 6

Türme von HanoiZufallsbewegung

Page 56: Bei uns testen lauter Affen - Das Ende der Banensoftware

while (min_zielfunktion(loesung) > 0)neue_loesung = addNextStep(loesung)if (better(neue_loesung, loesung)

loesung = neue_loesungor 50/50_chance)or decreasing_chance)

Page 57: Bei uns testen lauter Affen - Das Ende der Banensoftware

Quelle: http://www.flickr.com/photos/51035774131@N01/27145468/in/photostream/

© crowbert

Türme von HanoiSimulierte Abkühlung

Page 58: Bei uns testen lauter Affen - Das Ende der Banensoftware

Mehrere Suchen gleichzeitig?

Page 59: Bei uns testen lauter Affen - Das Ende der Banensoftware

Quelle: https://www.youtube.com/watch?v=yJpLUP93pRo

Page 60: Bei uns testen lauter Affen - Das Ende der Banensoftware

loesungen = []beste = get_beste(loesungen)while (min_zielfunktion(beste) > 0)

neue_loesungen = addNextSteps(loesungen)loesungen = getXBest(neue_loesungen)beste = get_beste(loesungen)

Page 61: Bei uns testen lauter Affen - Das Ende der Banensoftware
Page 62: Bei uns testen lauter Affen - Das Ende der Banensoftware

loesungen = []beste = get_beste(loesungen)while (min_zielfunktion(beste) > 0)

neue_loesungen = addNextSteps(loesungen)loesungen = getXBest(neue_loesungen)beste = get_beste(loesungen)

Page 63: Bei uns testen lauter Affen - Das Ende der Banensoftware
Page 64: Bei uns testen lauter Affen - Das Ende der Banensoftware

Quelle: http://cnx.org/content/m47304/latest/

© Robert Bear and David Rintoul

Page 65: Bei uns testen lauter Affen - Das Ende der Banensoftware

Gen

Exon

Intron

Exon

Page 66: Bei uns testen lauter Affen - Das Ende der Banensoftware

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)

Page 67: Bei uns testen lauter Affen - Das Ende der Banensoftware

DEMO

Türme von HanoiGenetischer Algorithmus

Page 68: Bei uns testen lauter Affen - Das Ende der Banensoftware

[tuerme.AtoB(), tuerme.AtoC(), tuerme.BtoA(), tuerme.AtoB(), tuerme.BtoA(), ...] -> [][][654321], Anzahl Schritte: 1727, Zielwert: 0

Türme von HanoiGenetischer Algorithmus

Page 69: Bei uns testen lauter Affen - Das Ende der Banensoftware

Genetischer AlgorithmusEffizienz

66 Sekundenstatt

150 Mio. Jahre

Page 70: Bei uns testen lauter Affen - Das Ende der Banensoftware
Page 71: Bei uns testen lauter Affen - Das Ende der Banensoftware

Welche Fehler kann der Affe finden?

Page 72: Bei uns testen lauter Affen - Das Ende der Banensoftware

When is a bug not a bug?

When it’s a feature!

Page 73: Bei uns testen lauter Affen - Das Ende der Banensoftware

1. if (name[0] == '.') continue;

Is it a bug?

.

.. text.c other.files

Page 74: Bei uns testen lauter Affen - Das Ende der Banensoftware

Is it a bug?

Page 75: Bei uns testen lauter Affen - Das Ende der Banensoftware

Is it a bug?

Page 76: Bei uns testen lauter Affen - Das Ende der Banensoftware

What is a bug?

Without specification, there are no bugs— only surprises.

Brian Kernighan“

Page 77: Bei uns testen lauter Affen - Das Ende der Banensoftware

What is a bug?

Spezifikation Code

Nutzererwartung Code

Modell Code

Page 78: Bei uns testen lauter Affen - Das Ende der Banensoftware

Monkey Testing

Spezifikation Code

Nutzererwartung Code

Modell Code

Page 79: Bei uns testen lauter Affen - Das Ende der Banensoftware

Wozu testen wir?

NachImplementierung?

1 + 1 = 32 + 2 = 4

Page 80: Bei uns testen lauter Affen - Das Ende der Banensoftware
Page 81: Bei uns testen lauter Affen - Das Ende der Banensoftware

Wozu testen wir?

NachImplementierung?

1 + 1 = 32 + 2 = 4

NachÄnderung?

1 + 1 = 31 + 1 = 5

Page 82: Bei uns testen lauter Affen - Das Ende der Banensoftware
Page 83: Bei uns testen lauter Affen - Das Ende der Banensoftware

DIFFERENCE-TESTING

Page 84: Bei uns testen lauter Affen - Das Ende der Banensoftware
Page 85: Bei uns testen lauter Affen - Das Ende der Banensoftware

Wenn man nur einen Hammer hat

sieht alles aus wie ein Nagel…

Page 86: Bei uns testen lauter Affen - Das Ende der Banensoftware

High test/code ratiois a symptom of high coupling in the code.

Or wasteful testing.

Kent Beck

Page 87: Bei uns testen lauter Affen - Das Ende der Banensoftware

GRUNDPROBLEM

Software ändert sich!

Page 88: Bei uns testen lauter Affen - Das Ende der Banensoftware
Page 89: Bei uns testen lauter Affen - Das Ende der Banensoftware
Page 90: Bei uns testen lauter Affen - Das Ende der Banensoftware
Page 91: Bei uns testen lauter Affen - Das Ende der Banensoftware
Page 92: Bei uns testen lauter Affen - Das Ende der Banensoftware

festes Set an Tests

zufallsbasiert

deterministisch

Page 93: Bei uns testen lauter Affen - Das Ende der Banensoftware

Monkey-Testing/Genetischer Algorithmus

Testing/Behavioral Diff

Page 94: Bei uns testen lauter Affen - Das Ende der Banensoftware

Mehr-Aufwand

Zeit

Einsparung

Page 95: Bei uns testen lauter Affen - Das Ende der Banensoftware

Capture/ReplayGolden MasterVersionskontrolle

++= ReTest

Page 96: Bei uns testen lauter Affen - Das Ende der Banensoftware
Page 97: Bei uns testen lauter Affen - Das Ende der Banensoftware

Intelligenter Affe

Summary

Monkey-Testing:billigerschnellerbessermultipliziert manuelle Tests

Behavioral Diffkein Pflegeaufwandkein wasteful testingtrotzdem “vollständiges “ Testen

Page 98: Bei uns testen lauter Affen - Das Ende der Banensoftware
Page 99: Bei uns testen lauter Affen - Das Ende der Banensoftware

Ende 2016

Page 100: Bei uns testen lauter Affen - Das Ende der Banensoftware

www.retest.de

Page 101: Bei uns testen lauter Affen - Das Ende der Banensoftware

Machen Sie den Test!

www.retest.de