Upload
shunsuke-hida
View
59
Download
1
Embed Size (px)
Citation preview
How to write test
Shunsuke Hida飛田 俊介
in Django
Geekhouse
Shinjuku
Akihabara
Castalia
Goocus
Django 1.7
Python 3. 4. 2
Structure of test
1. Preparedef test_de_lorean_get_people_back_to_the_future(self): de_lorean = DeLorean() brown, marty, jeniffer = Brown(), Marty(), Jeniffer() de_lorean.passengers = [brown, marty, jeniffer] de_lorean.run() self.assertIn(brown, __future__) self.assertIn(marty, __future__) self.assertIn(jeniffer, __future__)
2. Rundef test_de_lorean_get_people_back_to_the_future(self): de_lorean = DeLorean() brown, marty, jeniffer = Brown(), Marty(), Jeniffer() de_lorean.passengers = [brown, marty, jeniffer] de_lorean.run() self.assertIn(brown, __future__) self.assertIn(marty, __future__) self.assertIn(jeniffer, __future__)
3. Assertdef test_de_lorean_get_people_back_to_the_future(self): de_lorean = DeLorean() brown, marty, jeniffer = Brown(), Marty(), Jeniffer() de_lorean.passengers = [brown, marty, jeniffer] de_lorean.run() self.assertIn(brown, __future__) self.assertIn(marty, __future__) self.assertIn(jeniffer, __future__)
What can you test?
Request
Response
What can you test?
urls.py
Model
View
Template
View HTML etc…
url
Context
get, save
renderdispatch
Data
Request
Response
What can you test?
urls.py
Model
View
Template
View HTML etc…
url
Context
get, save
renderdispatch
Data
Request
Response
What can you test?
urls.py
Model
View
Template
View HTML etc…
url
Context
get, save
renderdispatch
Data
RequestFactory
class HelloWorldTestCase(TestCase): def test_hello_world_template(self): factory = RequestFactory() request = factory.get('/') response = render( request, template_name='sample_app/hello_world.html', dictionary=dict(message='hello') ) self.assertContains(response, 'hello')
Request
Response
What can you test?
urls.py
Model
View
Template
View HTML etc…
url
Context
get, save
renderdispatch
Data
TestCase.client
class HelloWorldTestCase(TestCase): def test_hello_world_view(self): response = self.client.get('/sample_app/hello_world/') self.assertTemplateUsed(response, 'sample_app/hello_world.html') self.assertEqual(response.context['message'], 'Hello World')
Mockunittest.mock (new in Python 3.3)
Request
Response
What can you test?
urls.py
Model
View
Template
View HTML etc…
url
Context
get, save
renderdispatch
Data
Mock - return_valueclass Chapter(models.Model): name = models.CharField(max_length=255) def get_name(self): return 'chapter ' + self.name
ChapterViewget_name
Mock - return_value
@mock.patch('sample_app.models.Chapter.get_name') def test_get_name(self, mock_get_name): mock_get_name.return_value = ‘abc' chapter = ChapterFactory() # chapter.get_name() == ‘abc’
Mock - assert_called_with
@mock.patch('sample_app.models.Chapter.get_name', autospec=True) def test_chapter_get_name_is_called(self, mock_get_name): chapter = ChapterFactory() # call chapter.get_name() somewhere mock_get_name.assert_called_with( chapter, prefix='chapter ' )
Mock
Mocked ChapterView
get_name
assert_called_with
return_value
See Also
Obey the Testing Goat!(Test Driven Development with Python)http://www.obeythetestinggoat.com/
Test of Django itselfhttps://github.com/django/django/tree/master/tests
Can they go back to the future?
def test_de_lorean_get_people_back_to_the_future(self): de_lorean = DeLorean() brown, marty, jeniffer = Brown(), Marty(), Jeniffer() de_lorean.passengers = [brown, marty, jeniffer] de_lorean.run() self.assertIn(brown, __future__) self.assertIn(marty, __future__) self.assertIn(jeniffer, __future__)
TypeError: argument of type 'module' is not iterable__future__
import typesimport __future__class IterableModule(types.ModuleType): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.people = [] def __iter__(self): return iter(self.people) class DeLorean(object): def __init__(self): self.passengers = [] def run(self): future = globals()['__future__'] = IterableModule('__future__') for passenger in self.passengers: future.people.append(passenger)
import import class class
. ---------------------------------------------------------------------- Ran 1 test in 0.000s
OK
Thank you!