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

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

Jul 18, 2020

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas <mgedmin@b4net.lt>  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 <mgedmin@b4net.lt>  2006 ruduo

Programas reikia testuoti

Page 3: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas <mgedmin@b4net.lt>  2006 ruduo

Programą pakeitus reikia

ją testuoti iš naujo

Page 4: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas <mgedmin@b4net.lt>  2006 ruduo

Rankomis kartoti tuos pačius testus

sunku ir nuobodu

Page 5: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas <mgedmin@b4net.lt>  2006 ruduo

Automatizuotas testavimas

Page 6: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas <mgedmin@b4net.lt>  2006 ruduo

$ python test.pyRan 120 tests in 3 seconds.

OK

Page 7: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas <mgedmin@b4net.lt>  2006 ruduo

Kokie būna testai?

Page 8: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas <mgedmin@b4net.lt>  2006 ruduo

Modulių testai

Sistemos testai

Page 9: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas <mgedmin@b4net.lt>  2006 ruduo

Modulių testai:

kiekviena funkcija testuojama

atskirai

Page 10: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas <mgedmin@b4net.lt>  2006 ruduo

Sistemos testai:

testuojama visa programa

Page 11: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas <mgedmin@b4net.lt>  2006 ruduo

import unittest

Page 12: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas <mgedmin@b4net.lt>  2006 ruduo

Funkcija

Page 13: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas <mgedmin@b4net.lt>  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 <mgedmin@b4net.lt>  2006 ruduo

Funkcijos testai

Page 15: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas <mgedmin@b4net.lt>  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 <mgedmin@b4net.lt>  2006 ruduo

Testų rinkinys

Page 17: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas <mgedmin@b4net.lt>  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 <mgedmin@b4net.lt>  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 <mgedmin@b4net.lt>  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 <mgedmin@b4net.lt>  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 <mgedmin@b4net.lt>  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 <mgedmin@b4net.lt>  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 <mgedmin@b4net.lt>  2006 ruduo

Testai pirma

(Test Driven Development)

Page 24: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas <mgedmin@b4net.lt>  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 <mgedmin@b4net.lt>  2006 ruduo

TDD nauda:

testų rinkinys yra pilnas

Page 26: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas <mgedmin@b4net.lt>  2006 ruduo

TDD nauda:

kodas bus toks, kokį lengva naudoti

Page 27: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas <mgedmin@b4net.lt>  2006 ruduo

Realesnis pavyzdys

sprendžiam kvadratines lygtis

Page 28: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas <mgedmin@b4net.lt>  2006 ruduo

1. Įvedimas

2. Sprendimas

3. Išvedimas

Page 29: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas <mgedmin@b4net.lt>  2006 ruduo

2. Sprendimas

Page 30: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas <mgedmin@b4net.lt>  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 <mgedmin@b4net.lt>  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 <mgedmin@b4net.lt>  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 <mgedmin@b4net.lt>  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 <mgedmin@b4net.lt>  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 <mgedmin@b4net.lt>  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 <mgedmin@b4net.lt>  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 <mgedmin@b4net.lt>  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 <mgedmin@b4net.lt>  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 <mgedmin@b4net.lt>  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 <mgedmin@b4net.lt>  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 <mgedmin@b4net.lt>  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 <mgedmin@b4net.lt>  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 <mgedmin@b4net.lt>  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 <mgedmin@b4net.lt>  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 <mgedmin@b4net.lt>  2006 ruduo

1. Įvedimas

Page 46: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas <mgedmin@b4net.lt>  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 <mgedmin@b4net.lt>  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 <mgedmin@b4net.lt>  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 <mgedmin@b4net.lt>  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 <mgedmin@b4net.lt>  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 <mgedmin@b4net.lt>  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 <mgedmin@b4net.lt>  2006 ruduo

3. Išvedimas

Page 53: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas <mgedmin@b4net.lt>  2006 ruduo

Praktiškai tas pats.

StringIO modulis naudingas!

Page 54: Programavimo kalba Python - Gedmin · Programavimo kalba Python penktoji paskaita Marius Gedminas <mgedmin@b4net.lt>  2006 ruduo

Jei liko laiko: daugiau pavyzdžių