Первые тесты Django

категория: Django
По просьбам читателей, попробую как-то более доступно объяснить, что же это такое за страшное слово "тестирование", и зачем этот пугающий файл tests.py в только что созданном приложении django. По поводу целесообразности написания тестов могу сказать одно: каждый уважающий себя "говнокодер" не тратит время на тесты и я тоже :) Так что думаю Вам тесты писать надо, и тогда не будет страшно за завтрашний день. К примеру вы написали блог со статьями, сейчас напишем для него первые тесты. Допустим есть модель Post, приложение home и ссылка:
url(r'^$', 'blog.views.home', name='home'),
Заходим в tests.py, а там магия! django уже написал за вас первый тест:
self.assertEqual(1 + 1, 2)
Давайте проверим равно ли все-таки один плюс один двум :)
python manage.py test blog
А теперь ради фана поменяйте 2 на 3 и опять запустите тест, если выбило в консоли:
AssertionError: 2 != 3
- значит ваш интерпретатор умеет считать, а это уже пол дела :) Теперь можно уже все удалить. Импортируем классы TestCase и Client из django.test, заставим "клиента" проверить отображается ли главная страница, сравнивая код HTTP ответа сервера.
from django.test import TestCase, Client
#
#
class HomePageTest(TestCase):
#
    def test_homepage_available(self):
        c = Client()
        response = c.get('/')
        self.assertEquals(response.status_code, 200)
Думаю при запуске этого теста будет выведено долгожданное "OK", и я Вас поздравляю, Вы написали свой первый тест. А теперь проверим выводятся ли статьи на главной странице. Нужно наполнить базу какими-то тестовыми данными, в дальнейшем проще будет это делать через фикстуры. Добавим 20-ть статей в posts:
from blog.models import Post
#
#
class HomePageTest(TestCase):
#
def setUp(self):
    self.posts = []
    for i in range(20):
        post = Post.objects.create(
            title = "Hello %d" % i,
            body = "Text ... %d" % i
        )
        self.posts.append(post)
А теперь проверим, есть ли два последних заголовка статей в контенте главной страницы:
def test_homepage_contains_posts(self):
    c = Client()
    response = c.get('/')
    self.assertEquals(response.status_code, 200)
    self.assertIn(self.posts[-1].title, response.content)
    self.assertIn(self.posts[-2].title, response.content)
И так далее сочиняем в зависимости от потребности функционала, тестировать можно все, но где бы подчерпнуть на это вдохновение? :) Можете попробовать TDD, я пока не могу себя пересилить, просто лень. Я старался дать доступ в мир тестов, а дальше это дело творчества.


blog comments powered by Disqus