unit testing and python - github pages · import unittest import rpn class...

20
Unit Testing and Python Pat Pannuto / Marcus Darden

Upload: others

Post on 14-Jul-2020

20 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Unit Testing and Python - GitHub Pages · import unittest import rpn class TestBasics(unittest.TestCase): def test_add(self): result = rpn.calculate("1 1 +") self.assertEqual(2, result)

UnitTestingandPython

PatPannuto/MarcusDarden

Page 2: Unit Testing and Python - GitHub Pages · import unittest import rpn class TestBasics(unittest.TestCase): def test_add(self): result = rpn.calculate("1 1 +") self.assertEqual(2, result)

TestDrivenDevelopment(TDD)

Page 3: Unit Testing and Python - GitHub Pages · import unittest import rpn class TestBasics(unittest.TestCase): def test_add(self): result = rpn.calculate("1 1 +") self.assertEqual(2, result)

TestDrivenDevelopment(TDD)

Page 4: Unit Testing and Python - GitHub Pages · import unittest import rpn class TestBasics(unittest.TestCase): def test_add(self): result = rpn.calculate("1 1 +") self.assertEqual(2, result)

"Strictlyspeaking"

1. Addatest2. Runthetestsuite

Note:Thisshouldfail!3. Writetheminimumcodetopass

tests4. Runtestsuite5. Refactor&repeat

Thepragmatist'sview:

AddtestsRuntestsWrite/fixcode

TDDMethodology

Page 5: Unit Testing and Python - GitHub Pages · import unittest import rpn class TestBasics(unittest.TestCase): def test_add(self): result = rpn.calculate("1 1 +") self.assertEqual(2, result)

"Strictlyspeaking"

1. Addatest2. Runthetestsuite

Note:Thisshouldfail!3. Writetheminimumcodetopass

tests4. Runtestsuite5. Refactor&repeat

Thepragmatist'sview:

AddtestsRuntestsWrite/fixcode

TDDMethodology

TDDcanunfairlyfocuson"micro-tests"Moretests!=bettertests,anddomeanmoremaintenance

Page 6: Unit Testing and Python - GitHub Pages · import unittest import rpn class TestBasics(unittest.TestCase): def test_add(self): result = rpn.calculate("1 1 +") self.assertEqual(2, result)

BehaviorDrivenDevelopment

Page 7: Unit Testing and Python - GitHub Pages · import unittest import rpn class TestBasics(unittest.TestCase): def test_add(self): result = rpn.calculate("1 1 +") self.assertEqual(2, result)

WritingunittestsinPythonPython??

Page 8: Unit Testing and Python - GitHub Pages · import unittest import rpn class TestBasics(unittest.TestCase): def test_add(self): result = rpn.calculate("1 1 +") self.assertEqual(2, result)

Gettingstarted,createrpn.py#!/usr/bin/envpython3

defcalculate(arg):

pass

defmain():

whileTrue:

calculate(input("rpncalc>"))

if__name__=='__main__':#Note:that's"underscoreunderscorename..."

main()

$python3rpn.py

rpncalc>typeanythinghereandhitenter

rpncalc>

Page 9: Unit Testing and Python - GitHub Pages · import unittest import rpn class TestBasics(unittest.TestCase): def test_add(self): result = rpn.calculate("1 1 +") self.assertEqual(2, result)

QuickrefresheronRPNcalculatorsAlsoa"stack-based"calculatorrpncalc>11+

2.0

rpncalc>11+2*

4.0

rpncalc>123+

Error:Malformedexpression

Page 10: Unit Testing and Python - GitHub Pages · import unittest import rpn class TestBasics(unittest.TestCase): def test_add(self): result = rpn.calculate("1 1 +") self.assertEqual(2, result)

Createtest_rpn.pyimportunittest

importrpn

classTestBasics(unittest.TestCase):

deftest_add(self):

result=rpn.calculate("11+")

self.assertEqual(2,result)

Thenamematters!Notethat test_rpn.py tests rpn.py

$python3-munittest

F

======================================================================

FAIL:test_add(test_rpn.TestBasics)

----------------------------------------------------------------------

Traceback(mostrecentcalllast):

File"/home/marcus/rpn_calc/test_rpn.py",line8,intest_add

self.assertEqual(2,result)

AssertionError:2!=None

----------------------------------------------------------------------

Ran1testin0.000s

Page 11: Unit Testing and Python - GitHub Pages · import unittest import rpn class TestBasics(unittest.TestCase): def test_add(self): result = rpn.calculate("1 1 +") self.assertEqual(2, result)

Don'tforgetgit !$wc-l*py

11rpn.py

8test_rpn.py

19total

#Thisis19linesofqualitycodehere!

Yes,we'recommittingbeforeanythingworks

ThestructureisgoodThetestharnessworks

Page 12: Unit Testing and Python - GitHub Pages · import unittest import rpn class TestBasics(unittest.TestCase): def test_add(self): result = rpn.calculate("1 1 +") self.assertEqual(2, result)

Andlet'snotforgetmake whilewe'reatitBecausewhytype19letterswhenyoucouldtype4?

test:

python3-munittest

.PHONY:test

Page 13: Unit Testing and Python - GitHub Pages · import unittest import rpn class TestBasics(unittest.TestCase): def test_add(self): result = rpn.calculate("1 1 +") self.assertEqual(2, result)

LivecodingPLEASEstopmeandaskquestionsifyou'reconfused

PLEASEyellatmetoslowdownifIgotoofast

ImplementaddNeedastackforthecalculatorNeedtotokenizetheinputNeedtoprocesstokens

Page 14: Unit Testing and Python - GitHub Pages · import unittest import rpn class TestBasics(unittest.TestCase): def test_add(self): result = rpn.calculate("1 1 +") self.assertEqual(2, result)

LivecodingPLEASEstopmeandaskquestionsifyou'reconfused

PLEASEyellatmetoslowdownifIgotoofast

Implementadd

NeedastackforthecalculatorNeedtotokenizetheinputNeedtoprocesstokens

Addtestforsubtract

Page 15: Unit Testing and Python - GitHub Pages · import unittest import rpn class TestBasics(unittest.TestCase): def test_add(self): result = rpn.calculate("1 1 +") self.assertEqual(2, result)

LivecodingPLEASEstopmeandaskquestionsifyou'reconfused

PLEASEyellatmetoslowdownifIgotoofast

Implementadd

NeedastackforthecalculatorNeedtotokenizetheinputNeedtoprocesstokens

Addtestforsubtract

Implementsubtract

Page 16: Unit Testing and Python - GitHub Pages · import unittest import rpn class TestBasics(unittest.TestCase): def test_add(self): result = rpn.calculate("1 1 +") self.assertEqual(2, result)

LivecodingPLEASEstopmeandaskquestionsifyou'reconfused

PLEASEyellatmetoslowdownifIgotoofast

Implementadd

NeedastackforthecalculatorNeedtotokenizetheinputNeedtoprocesstokens

Addtestforsubtract

Implementsubtract

Testscanexpectfailure:malformedinput

Page 17: Unit Testing and Python - GitHub Pages · import unittest import rpn class TestBasics(unittest.TestCase): def test_add(self): result = rpn.calculate("1 1 +") self.assertEqual(2, result)

LivecodingPLEASEstopmeandaskquestionsifyou'reconfused

PLEASEyellatmetoslowdownifIgotoofast

Implementadd

NeedastackforthecalculatorNeedtotokenizetheinputNeedtoprocesstokens

Addtestforsubtract

Implementsubtract

Testscanexpectfailure:malformedinput

Onyourown:Testsandimplementationformultiply,divide

Page 18: Unit Testing and Python - GitHub Pages · import unittest import rpn class TestBasics(unittest.TestCase): def test_add(self): result = rpn.calculate("1 1 +") self.assertEqual(2, result)

SomefancyPythonandthebigrefactorMotivation:Unwieldyif-elsechaingoing

GetsworseasmoreoperandsareaddedAmodulardesignwillallowflexibility

Page 19: Unit Testing and Python - GitHub Pages · import unittest import rpn class TestBasics(unittest.TestCase): def test_add(self): result = rpn.calculate("1 1 +") self.assertEqual(2, result)

SomefancyPythonandthebigrefactorMotivation:Unwieldyif-elsechaingoing

GetsworseasmoreoperandsareaddedAmodulardesignwillallowflexibility

Goal:SimplifyparsercodeIsitanumber?ThenaddtostackElselookupoperatorandexecute

Page 20: Unit Testing and Python - GitHub Pages · import unittest import rpn class TestBasics(unittest.TestCase): def test_add(self): result = rpn.calculate("1 1 +") self.assertEqual(2, result)

Attendance:Pushyourcodetogitlab1. Gotohttps://gitlab.eecs.umich.edu2. Click"NewProject"3. Nameyourprojectexactly: c4cs-w17-rpn4. Setyourprojecttopublicallyvisible

5. ScrolldownandfollowthedirectionsforexistingfolderorGitrepository

Youshouldn'tneedtocreatearepo(wealreadydidthat)Makesureyou'vecommittedallyourchanges!gitremoteadd.....

gitpush-uoriginmaster

Yourusernameisyouruniqname,andpasswordisyourumich.edupassword