54
Programavimo kalba Python penktoji paskaita Marius Gedminas <[email protected]> http://mg.b4net.lt/python/ 2006 ruduo

Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas 2006 ruduo

  • Upload
    others

  • View
    48

  • Download
    3

Embed Size (px)

Citation preview

Page 1: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

Programavimo kalba

Pythonpenktoji paskaita

Marius Gedminas<[email protected]>

http://mg.b4net.lt/python/

2006 ruduo

Page 2: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

Programas reikia testuoti

Page 3: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

Programą pakeitus reikia

ją testuoti iš naujo

Page 4: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

Rankomis kartoti tuos pačius testus

sunku ir nuobodu

Page 5: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

Automatizuotas testavimas

Page 6: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

$ python test.pyRan 120 tests in 3 seconds.

OK

Page 7: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

Kokie būna testai?

Page 8: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

Modulių testai

Sistemos testai

Page 9: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

Modulių testai:

kiekviena funkcija testuojama

atskirai

Page 10: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

Sistemos testai:

testuojama visa programa

Page 11: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

import unittest

Page 12: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

Funkcija

Page 13: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

# fact.py

def fact(n): f = 1 for i in range(n): f *= i return f

Page 14: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

Funkcijos testai

Page 15: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

class TestFact(unittest.TestCase):

def test(self): self.assertEquals(fact(0), 1) self.assertEquals(fact(1), 1) self.assertEquals(fact(2), 2) self.assertEquals(fact(3), 6) self.assertEquals(fact(4), 24)

Page 16: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

Testų rinkinys

Page 17: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

import unittestfrom fact import fact

class TestFact(unittest.TestCase): ...

if __name__ == '__main__': unittest.main()

Page 18: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

$ python test.pyF====================================FAIL: test (__main__.TestFact)------------------------------------------------------------------Traceback (most recent call last): File "test.py", line 8, in test self.assertEquals(fact(1), 1)AssertionError: 0 != 1

------------------------------------------------------------------Ran 1 test in 0.001s

FAILED (failures=1)

Page 19: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

# fact.py

def fact(n): f = 1 for i in range(1, n): f *= i return f

Page 20: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

$ python test.pyF====================================FAIL: test (__main__.TestFact)------------------------------------------------------------------Traceback (most recent call last): File "test.py", line 9, in test self.assertEquals(fact(2), 2)AssertionError: 1 != 2

------------------------------------------------------------------Ran 1 test in 0.001s

FAILED (failures=1)

Page 21: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

# fact.py

def fact(n): f = 1 for i in range(1, n + 1): f *= i return f

Page 22: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

$ python test.py.------------------------------------------------------------------Ran 1 test in 0.001s

OK

Page 23: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

Testai pirma

(Test Driven Development)

Page 24: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

1. Rašai naują testą

2. Leidi testų rinkini

(naujas testas nepraeina)

3. Rašai kodą, kad testas veiktų

4. Leidi testų rinkinį

(testas praeina)

5. Kartoji

Page 25: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

TDD nauda:

testų rinkinys yra pilnas

Page 26: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

TDD nauda:

kodas bus toks, kokį lengva naudoti

Page 27: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

Realesnis pavyzdys

sprendžiam kvadratines lygtis

Page 28: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

1. Įvedimas

2. Sprendimas

3. Išvedimas

Page 29: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

2. Sprendimas

Page 30: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

# qeq.py

def solve(a, b, c): """Solve ax**2 + bx + c = 0.

Returns a list of solutions. """ raise NotImplementedError

Page 31: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

# test.py

class TestSolve(unittest.TestCase):

def test_no_solutions(self): # x**2 + 4 = 0 self.assertEquals( solve(1, 0, 4), [])

Page 32: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

$ python test.py

====================================ERROR: test_no_solutions (__main__.TestSolve)------------------------------------------------------------------Traceback (most recent call last): File "test.py", line 10, in test_no_solutions self.assertEquals( File "qeq.py", line 8, in solve raise NotImplementedErrorNotImplementedError

FAILED (errors=1)

Page 33: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

# qeq.py

def solve(a, b, c): """Solve ax**2 + bx + c = 0.

Returns a list of solutions. """ return []

Page 34: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

$ python test.py

...

Ran 1 test in 0.001s

OK

Page 35: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

# test.py

def test_two_solutions(self): # (x - 3)(x + 2) = 0 # x**2 - x - 6 = 0 self.assertEquals( solve(1, -1, -6), [-2, 3])

Page 36: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

$ python test.py

====================================ERROR: test_two_solutions (__main__.TestSolve)------------------------------------------------------------------Traceback (most recent call last): File "test2.py", line 18, in test_two_solutions [-2, 3])AssertionError: [] != [-2, 3]

FAILED (failures=1)

Page 37: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

# qeq.pyfrom math import sqrtdef solve(a, b, c): d = b ** 2 - 4 * a * c x1 = (-b - sqrt(d)) / (2 * a) x2 = (-b + sqrt(d)) / (2 * a) return [x1, x2]

Page 38: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

$ python test.py====================================ERROR: test_no_solutions (__main__.TestSolve)------------------------------------------------------------------Traceback (most recent call last): File "test.py", line 10, in test_no_solutions self.assertEquals( File "qeq.py", line 11, in solve x1 = (-b - sqrt(d)) / (2 * a)ValueError: math domain error

Ran 2 tests in 0.001s

FAILED (errors=1)

Page 39: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

# qeq.pyfrom math import sqrtdef solve(a, b, c): d = b ** 2 - 4 * a * c if d < 0: return [] x1 = (-b - sqrt(d)) / (2 * a) x2 = (-b + sqrt(d)) / (2 * a) return [x1, x2]

Page 40: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

$ python test.py

...

Ran 2 tests in 0.001s

OK

Page 41: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

# test.py

def test_one_solution(self): # (x - 5)**2 = 0 # x**2 - 10x + 25 = 0 self.assertEquals( solve(1, -10, 25), [5])

Page 42: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

$ python test.py====================================ERROR: test_one_solution (__main__.TestSolve)------------------------------------------------------------------Traceback (most recent call last): File "test2.py", line 25, in test_one_solution [5])AssertionError: [5.0, 5.0] != [5]

Ran 3 tests in 0.001s

FAILED (failures=1)

Page 43: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

# qeq.pydef solve(a, b, c): d = b ** 2 - 4 * a * c if d < 0: return [] x1 = (-b - sqrt(d)) / (2 * a) if d == 0: return [x1] x2 = (-b + sqrt(d)) / (2 * a) return [x1, x2]

Page 44: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

$ python test.py

...

Ran 3 tests in 0.001s

OK

Page 45: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

1. Įvedimas

Page 46: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

# test.py

class TestInput(unittest.TestCase): sampleinput = [ '3, 4, 5', '1, -3, 22', '0.5, -.16, 42.3' ]

Page 47: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

# test.py

def test_input(self): self.assertEquals( readInput(self.sampleinput), [(3, 4, 5), (1, -3, 22), (.5, -0.16, 42.3)])

Page 48: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

# qeq.py

def readInput(f): """Read input from a file object.

Each line is of the form a, b, c

Returns a list of (a, b, c) tuples. """ raise NotImplementedError

Page 49: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

$ python test.py====================================ERROR: test_input (__main__.TestInput)------------------------------------------------------------------Traceback (most recent call last): File "test2.py", line 37, in test_input self.assertEquals( File "qeq.py", line 28, in readInput raise NotImplementedErrorNotImplementedError

Ran 4 tests in 0.001s

FAILED (errors=1)

Page 50: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

# qeq.py

import csvdef readInput(f): results = [] for a, b, c in csv.reader(f): results.append((float(a),float(b), float(c))) return results

Page 51: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

$ python test.py.------------------------------------------------------------------Ran 4 tests in 0.001s

OK

Page 52: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

3. Išvedimas

Page 53: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

Praktiškai tas pats.

StringIO modulis naudingas!

Page 54: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas   2006 ruduo

Jei liko laiko: daugiau pavyzdžių