11. what else
• test fixture preparation
• setUP, tearDown
• setUp will be called before test method
• tearDown will be called after test method
12. 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
13. 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
14. all-mighty
In : import mock
!
In : m = mock.Mock()
!
In : m.dock.dog.bark()
Out: <Mock
name='mock.dock.dog.bark()'
id='4320364368'>
15. obey your order
In: dog = mock.Mock(
return_value="bark")
!
In: dog()
Out: ‘bark’
!
In: dog.bark.return_value = u"WW"
!
In: dog.bark()
Out: u'WW'
!
16. mock tell you his story
In [9]: def reset_file(fs):
...: fs.seek(0)
...:!
In: m = mock.Mock()
!
In: reset_file(m)
!
In: m.seek.assert_called_with(0)
17. like python object
In : m = mock.MagicMock()
!
In : m['key']
Out: <MagicMock
name='mock.__getitem__()'
id=‘4311227728'>
!
In: m.__getitem__.return_value = 10
!
In: m[3]
Out: 10
22. Inversion of control
# not this
def to_be_test():
db = Database()
return db.all()
!
# write this
def to_be_test(db):
return db.all()
23. 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
24. Tips
• Q: How to maintain test case?
• refactor you test infrastructure often
• duplicated test code make you will feel tired
after interface changed
25. • Q: how much should I test?
• test the interface, not the implementation
• don’t test private method
• test public method
26. • 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
27. Add test now
• My Project has no test …
• add test for new added code
• old code can add test latter
28. 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
29. 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
30. After we have tests
• don’t forget to run test before you push codes
• nose can provide report
• nose can integration coverage report
31. 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