28
How to write test Shunsuke Hida 飛田 俊介 in Django

How to write test in Django

Embed Size (px)

Citation preview

Page 1: How to write test in Django

How to write test

Shunsuke Hida飛田 俊介

in Django

Page 2: How to write test in Django

Geekhouse

Page 3: How to write test in Django

Shinjuku

Akihabara

Page 4: How to write test in Django

Castalia

Page 5: How to write test in Django

Goocus

Page 6: How to write test in Django

Django 1.7

Python 3. 4. 2

Page 7: How to write test in Django

Structure of test

Page 8: How to write test in Django

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__)

Page 9: How to write test in Django

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__)

Page 10: How to write test in Django

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__)

Page 11: How to write test in Django

What can you test?

Page 12: How to write test in Django

Request

Response

What can you test?

urls.py

Model

View

Template

View HTML etc…

url

Context

get, save

renderdispatch

Data

Page 13: How to write test in Django

Request

Response

What can you test?

urls.py

Model

View

Template

View HTML etc…

url

Context

get, save

renderdispatch

Data

Page 14: How to write test in Django

Request

Response

What can you test?

urls.py

Model

View

Template

View HTML etc…

url

Context

get, save

renderdispatch

Data

Page 15: How to write test in Django

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')

Page 16: How to write test in Django

Request

Response

What can you test?

urls.py

Model

View

Template

View HTML etc…

url

Context

get, save

renderdispatch

Data

Page 17: How to write test in Django

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')

Page 18: How to write test in Django

Mockunittest.mock (new in Python 3.3)

Page 19: How to write test in Django

Request

Response

What can you test?

urls.py

Model

View

Template

View HTML etc…

url

Context

get, save

renderdispatch

Data

Page 20: How to write test in Django

Mock - return_valueclass Chapter(models.Model): name = models.CharField(max_length=255) def get_name(self): return 'chapter ' + self.name

ChapterViewget_name

Page 21: How to write test in Django

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’

Page 22: How to write test in Django

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 ' )

Page 23: How to write test in Django

Mock

Mocked ChapterView

get_name

assert_called_with

return_value

Page 24: How to write test in Django

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

Page 25: How to write test in Django

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__

Page 26: How to write test in Django

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)

Page 27: How to write test in Django

import import class class

. ---------------------------------------------------------------------- Ran 1 test in 0.000s

OK

Page 28: How to write test in Django

Thank you!