Посты с тэгом тесты


Рецепты от ПанГурмана

Хабы: Django, Я пиарюсь

Недавно запустили сервис по бронированию ресторанов ПанГурман. Внутри это более-менее типичный django-сайт. Попробую рассказать, как там что устроено (с картинками). В статье не будет ничего супер-хитрого, но, надеюсь, кому-нибудь пара трюков или идей покажутся полезными и как-то упростят жизнь.
Читать дальше →



assertRedirectsGentle

У django.test.TestCase есть хороший метод assertRedirects с такой вот сигнатурой:

assertRedirects(self, response, expected_url, status_code=302,
                        target_status_code=200, host=None)
Этот метод проверяет не только куда ведёт редирект и с каком кодом был выполнен редирект, но и код, который возвращает expected_url. Обычно такое поведение проблем не доставляет, но иногда нужно, чтобы код возврата expected_url не проверялся, потому что при его проверке изменяется содержимое сессии. Для этого у меня есть такой код:
from urlparse import urlsplit, urlunsplit
def assertRedirectsGentle(self, response, expected_url, status_code=302,
                          host=None):
        self.assertEqual(response.status_code, status_code,
            ("Response didn't redirect as expected: Response code was %d"
             " (expected %d)" % (response.status_code, status_code)))
        url = response['Location']
        scheme, netloc, path, query


Селекторы CSS и BeautifulSoup

Бывает нужно проверить наличие элемента на странице, узнать значение атрибута какого-то тега или сделать ещё что-то такое с HTML-документом (HTML, а не XML). Я для таких вещей использовал BeautifulSoup - он работает примерно так, и делает это хорошо.

>>> html = '<html lang="ru">...</html>'
>>> from BeautifulSoup import BeautifulSoup
>>> soup = BeautifulSoup(html)
>>> soup.find("html").get("lang")
ru

Но jQuery приучил к тому, что должна быть возможность адресоваться к элементам с помощью CSS нотации. Видимо, не меня одного.

soupselect добавляет нужную функциональность.
>>> html = '<html lang="ru"><div class="title"><h3>foo</h3></div></html>'
>>> from BeautifulSoup import BeautifulSoup as Soup
>>> from soupselect import select
>>> select(soup, 'div.title h3')
[<h3>foo<


Как заменить tests.py пакетом.

В Django есть соглашение относительно расположения тестов в приложениях. По нему в tests.py живут тесты, работающие с unittest. Однажды я задумался о размещении тестов в отдельных файлах, то есть о преобразовании модуля tests в пакет tests.
Почитал django/test/simple.py. Получилось, что если в модуле tests определяется callable переменная suite, то значение, возвращенное suite, добавляется к уже обнаруженным тестам. Если такой переменной не обнаружено, то из модуля tests пытаются загрузить тесты стандартным лоадером unittest.defaultTestLoader.loadTestsFromModule. Спросил в django-russian. Предложенное решение немного не устроило - в каждый новый пакет tests кладётся адаптированный test_all.py, из которого и