Egenskapsbasert Testing

Table of Contents

Trykk T for å starte presentasjonen

Egenskapsbasert Testing   slide

figure.svg

Jean Niklas L'orange

@hyPiRion

 17. mars 2014

Hva er Egenskapsbasert Testing?   slide

  • Tester egenskaper ved funksjoner og oppførsel
    • Ikke det samme som å teste et spesifikt input mot et spesifikt output
  • Kan erstatte mange, men ikke alle, enhetstester
  • Genererer input basert på egenskapene du spesifiserer
    • Og tester egenskapene med mange tilfeldige genererte input
  • Kan gjøres i så og si alle programmeringsspråk

Recap Enhetstesting   slide

  • Tester at et spesifikt input gir et spesifikt output
  • For å teste mer må du spesifisere flere input/output
  • Kjekt som regresjonstester
    • Dvs. sjekke at ting fremdeles fungerer som forventet
  • Ikke praktisk for å finne bugs i ny funksjonalitet (generelt sett)

Hva skal vi teste?   slide

Kommer til å benytte følgende funksjoner som eksempel:

  • rev(lst) returnerer en reversert versjon av inputlisten
  • remove_all(lst, x) returnerer en liste der alle x i lst er fjernet

Eksempel på Enhetstesting   slide

import unittest

class TestSequenceFunctions(unittest.TestCase):
  def test_rev(self):
    self.assertEqual(rev([1,2,3]), [3, 2, 1])
    self.assertEqual(rev([65, 7, 10, 100]),
                         [100, 10, 7, 65]) # osv...

  def test_remove_all(self):
    self.assertEqual(remove_all([1, 2, 42], 42), [1, 2])
    self.assertEqual(remove_all([1, 100, 59], 100),
                                [1, 59]) # osv...

(Ikke nødvendigvis idiomatisk Python)

Egenskapsbasert Testing   slide

Som tidligere nevnt handler egenskapsbasert testing om egenskaper.

Hvilke egenskaper har rev(lst) og remove_all(lst, x)?

Egenskapsbasert Testing   slide

Som tidligere nevnt handler egenskapsbasert testing om egenskaper.

Hvilke egenskaper har rev(lst) og remove_all(lst, x)?

  • Om du reverserer en liste to ganger, får du tilbake den samme listen
  • Fjerner du et element i en liste, vil ikke elementet eksistere i listen

Egenskapsbasert Testing i Python   slide

Her er pseudo-Python hvor vi anvender disse egenskapene:

import generative_test as gen

class TestSequenceFunctions(gen.TestCase):
  def test_rev(self): # kjøres flere ganger
    lst = gen.listOf(gen.int).generateOne()
    self.assertEqual(rev(rev(lst)), lst)

  def test_remove_all(self): # kjøres flere ganger
    lst = gen.listOf(gen.int).generateOne()
    x = gen.element(lst).generateOne()
    self.assertTrue(not x in remove_all(lst, x))

Egenskapsbasert Testing – pt. 2   slide

Egenskapene nevnt her er ikke nok for å være 100% sikker på at rev(lst) og remove_all(lst, x) fungerer som forventet. Om vi ønsker, kan vi teste flere egenskaper. For eksempel:

  • Det siste elementet i en reversert liste, er det første i den originale listen
  • Om vi tar et tilfeldig element y fra lst, så vil alltid remove_lst(lst, x) inneholde y hvis x og y er forskjellige

Andre Kuriositeter   slide

  • Kan spesialisere det man genererer
    • Kommer eksempel på neste slide
  • Hvis en test feiler, prøver test-biblioteket å minimere caset som feiler (kalt shrinking)
  • Veldig godt egnet for å
    1. Teste optimaliseringer
    2. Sjekke at enkoding → dekoding fungerer

Generering av input   slide

Går an å spesialisere inputgenerering veldig, uten mye arbeid.

Trykk på enten 3, 6 eller 9. Gjerne flere ganger!

Ressurser   slide

Author: Jean Niklas L'orange

Created: 2014-03-22 Sat 16:27

Emacs 24.3.50.1 (Org mode 8.2.5c)

Validate