Архив с файлами готового проекта:
Протестируйте проект Yatube
Большую часть заданий вы выполнили в течение уроков, все они будут проверены. Если вы что-то не успели сделать — самое время этим заняться.Ниже перечислены все тесты, которые нужно было сделать в уроках и отмечено, какие ещё тесты нужно написать.
Тестирование Models: «Unittest в Django: тестирование моделей»
Протестируйте модели приложения posts в Yatube.
Добавьте в классы Post и Group метод __str__
(если его ещё нет):
- для класса Post — первые пятнадцать символов поста: **
post.text[:15]
; - для класса Group — название группы.
Протестируйте, правильно ли отображается значение поля __str__
в объектах моделей.
Тестирование URLs: «Unittest в Django: тестирование URLs»
Проверьте доступность страниц и названия шаблонов приложения Posts проекта Yatube. Проверка должна учитывать права доступа.
Проверьте, что запрос к несуществующей странице вернёт ошибку 404.
Подсказки
- Если заранее соберёте страницы в списки и прогоните однотипные тесты через
subTest
— будете совсем молодец. - Подумайте перед составлением словаря с шаблонами и адресами. Некоторые шаблоны использованы дважды для разных адресов. Возможно, в качестве ключей словаря будет выгоднее использовать адреса страниц, а не названия шаблонов, как описано в теории.
Проверка namespase:name и шаблонов: «Unittest в Django: тестирование Views»
Напишите тесты, проверяющие, что во view-функциях используются правильные html-шаблоны.
Тестирование контекста: «Unittest в Django: тестирование views»
Проверьте, соответствует ли ожиданиям словарь context
, передаваемый в шаблон при вызове.
Дополнительная проверка при создании поста: : «Unittest в Django: тестирование Views»
Проверьте, что если при создании поста указать группу, то этот пост появляется
- на главной странице сайта,
- на странице выбранной группы,
- в профайле пользователя.
Проверьте, что этот пост не попал в группу, для которой не был предназначен.
Тестирование Forms: «Unittest в Django: тестирование Forms»
В проекте Yatube напишите тесты, которые проверяют, что
- при отправке валидной формы со страницы создания поста
reverse('posts:create_post')
создаётся новая запись в базе данных; - при отправке валидной формы со страницы редактирования поста
reverse('posts:create_post', args=('post_id',))
происходит изменение поста сpost_id
в базе данных.
Рекомендации
Ваша задача — написать работающие и оптимизированные тесты.
По возможности применяйте методы setUp
или setUpClass
.
Однотипные тесты пишите через subTest
.
Необязательные задания:
Models
Добавьте в модель posts.Post
атрибуты verbose_name
и help_text
и протестируйте их:
class Post(models.Model):
text = models.TextField(
'Текст поста',
help_text='Введите текст поста'
)
pub_date = models.DateTimeField(
'Дата публикации',
auto_now_add=True
)
author = models.ForeignKey(
User,
on_delete=models.CASCADE,
verbose_name='Автор'
)
group = models.ForeignKey(
Group,
on_delete=models.SET_NULL,
related_name='posts',
blank=True,
null=True,
verbose_name='Группа',
help_text='Выберите группу'
)
Обычно тесты verbose_name
и help_text
пишут только в приступе сильной coverage-зависимости или в учебных целях. Выбирайте, с кем вы!
URLs
Задание 1
Попробуйте использовать в тестах описания из HTTPStatus вместо кодов состояния.
Задание 2
В проекте Yatube есть приложения users и about. Протестируйте их urls.
Подсказки
В простых случаях (например, в приложении about всего два адреса) нет нужды в сложной структуре папки с тестами. Тесты можно писать в фале tests.py, автоматически сгенерированном при создании приложения.
Views
- Проверьте
namespase:name
в приложениях user и about.
Адресreverse('users:signup')
должен обрабатыватьusers/signup.html
- Если шаблоны в сценарии восстановления пароля через email не были переопределены — проверять их
namespase:name
не нужно. Если шаблоны переопределены — проверьте соответствиеnamespase:name
. - Проверьте, что на страницу
reverse('users:signup')
в контексте передаётся форма для создания нового пользователя.
Forms
Проверьте, что при отправке валидной формы reverse('users:signup')
создаётся новый пользователь.