How to write test in Django

Preview:

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!