mock introduction

31
Mock

Upload: tim-hsu

Post on 08-Sep-2014

341 views

Category:

Technology


2 download

DESCRIPTION

I introduce the python mock library in Taipei.py http://meetup.com/Taipei-py/

TRANSCRIPT

Page 1: Mock Introduction

Mock

Page 2: Mock Introduction

Abstract

• Start to Write Test

• Start to Use Mock

• Tips

Page 3: Mock Introduction

• You think quality is important

Page 4: Mock Introduction

the first thing

• pip install nose

• you will get a tool called nosetests

Page 5: Mock Introduction

A very simple test

def add(left,right): return left+right !

def test_add(): assert add(4,5) == 9

Page 6: Mock Introduction

Finding, Running, Report in one shoot

nosetests sample.py

Ran 1 test in 0.001s !

OK

Page 7: Mock Introduction

if you meet problem

def add(left,right): return left+right+1 !

def test_add(): assert add(4,5) == 9 !

Page 8: Mock Introduction

trigger pdb as fail

nosetests sample_fail.py --pdb

assert add(4,5) == 9 (Pdb) p add(4,5) 10 (Pdb)

Page 9: Mock Introduction

What nose do

• cooperate with doctest, unittest2

• add an additional function baed test case

• a test discover, test runner,

• plugin integration

Page 10: Mock Introduction

unittest.TestCaseimport unittest !

def add(left,right): return left+right !

class addTestCase(unittest.TestCase): def test_add(self): self.assertEqual(5, add(5,5))

Page 11: Mock Introduction

what else

• test fixture preparation

• setUP, tearDown

• setUp will be called before test method

• tearDown will be called after test method

Page 12: Mock Introduction

what if

• if a function called erase_disk , how can I test it?

• if a function will get a JSON from google, how can I test it

Page 13: Mock Introduction

Time to Introduce Mock

• python3.3 builtin

• pip install mock with python2.7

• it is a library

• it helps you to provide a fake object for spy

Page 14: Mock Introduction

all-mighty In : import mock !

In : m = mock.Mock() !

In : m.dock.dog.bark() Out: <Mock name='mock.dock.dog.bark()' id='4320364368'>

Page 15: Mock Introduction

obey your orderIn: dog = mock.Mock( return_value="bark") !

In: dog() Out: ‘bark’ !

In: dog.bark.return_value = u"WW" !

In: dog.bark() Out: u'WW' !

Page 16: Mock Introduction

mock tell you his storyIn [9]: def reset_file(fs): ...: fs.seek(0) ...: !

In: m = mock.Mock() !

In: reset_file(m) !

In: m.seek.assert_called_with(0)

Page 17: Mock Introduction

like python objectIn : m = mock.MagicMock() !

In : m['key'] Out: <MagicMock name='mock.__getitem__()' id=‘4311227728'> !

In: m.__getitem__.return_value = 10 !

In: m[3] Out: 10 !

Page 18: Mock Introduction

magic mock assertion

In: m.__getitem__.assert_called_with(3)

Page 19: Mock Introduction

read specIn : fake_str = mock.Mock(str) !

In : fake_str.lower() Out: <Mock name='mock.lower()' id='4321150160'> !

In : fake_str.LOWER --------- AttributeError

Page 20: Mock Introduction

General UsageIn : def count(fs): ...: return len(fs.read()) ...:In : fakefs = mock.Mock()

In : fakefs.read.return_value = "xx"

In : assert count(fakefs) == 2

Page 21: Mock Introduction

Add Testability

• dependency should always pass from out side

• your design need to consider testability

Page 22: Mock Introduction

Inversion of control

# not this def to_be_test(): db = Database() return db.all() !

# write this def to_be_test(db): return db.all()

Page 23: Mock Introduction

from mock import * from StringIO import * def do_print(): # hard to IoC print "hi" def test_print(): os = StringIO() with patch('sys.stdout', new=os): do_print() actual = os.getvalue() expect = "hi" assert expect in actual

Page 24: Mock Introduction

Tips

• Q: How to maintain test case?

• refactor you test infrastructure often

• duplicated test code make you will feel tired after interface changed

Page 25: Mock Introduction

• Q: how much should I test?

• test the interface, not the implementation

• don’t test private method

• test public method

Page 26: Mock Introduction

• Q: Test is slow, I don’t want to test

• write quick test

• mock time consuming object

• don’t execute time consuming test every time

• run failed test only while you meet error

Page 27: Mock Introduction

Add test now

• My Project has no test …

• add test for new added code

• old code can add test latter

Page 28: Mock Introduction

mock needs manage

• Mock is awesome, I want to mock every thing

• mock’s behavior may has error

• mock object tell you what you want to hear

• mock dependency is okay

• share mock among test modules

Page 29: Mock Introduction

finding test utility

• Django mocks some service while testing

• GAE also provide mock while testing

• if you are using ORM, there a package that help you mock ORM

Page 30: Mock Introduction

After we have tests

• don’t forget to run test before you push codes

• nose can provide report

• nose can integration coverage report

Page 31: Mock Introduction

Recap• Nose is a good test driver

• unittest provide awesome test infrastructure

• any one want to share doctest?

• test and doc are combined !

• mock is used to fake a dependency, not every thing