Быстрая проверка приложения Django
При завершении написания кода вам нужно проверить, что ваш код выполнил то, что от него требовалось.
Ручное тестирование вашего кода может быть по умолчанию.
- Вы просматриваете пользовательский интерфейс и имитируете процессы, которым должны следовать пользователи.
- Вы используете некоторые операторы печати для проверки вводов и выходов.
- Если процесс зависит от некоторых элементов базы данных, вы создаете фиктивные объекты.
- После всего этого вы отправляете свое приложение.
После этого вы думаете, что закончили проект. В большинстве случаев вы ошибались! Это либо скрытая ошибка, либо нужно добавить новую функцию! - Вы работаете над тем, что есть, и снова отправляете приложение.
- Внезапно вы обнаружите, что интерфейс, который вы тестировали и написали много операторов печати, не сработал!
Вы видите, к чему я клоню:
-Вы проводите ручное тестирование снова и снова, и цикл продолжается без остановки!
Автоматическое тестирование
- Вы пишете тест
- Вы запускаете тест
- Вы отправляете приложение.
Необходимость в модификации…? - Вы изменяете
- Вы запускаете тест
- Вы отправляете приложение.
Необходимость в новой функции…? - Вы добавляете функцию
- Вы запускаете тест
- Вы отправляете приложение.
Вы пишете тест для своего модуля один раз и можете запускать его множество раз.
Уменьшение тестирования
Документация Django расширяет возможности написания тестов
Создание фиктивных данных в ваших тестовых функциях может показаться пугающим и утомительным, особенно когда вам нужно заполнить базу данных. Один из способов быстрого тестирования – использовать https://model-bakery.readthedocs.io/en/latest/index.html . Это создает приспособления, необходимые для тестирования вашего приложения, в то время как вы концентрируетесь на написании тестов .
Как пользоваться моделью
Предположим, у нас есть приложение с книгами
в файле models.py:
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=250)
joined = models.DateField(auto_now_add=True)
def __str__(self):
return self.name
def book_list(self):
return self.book_set.all()
def active_book_list(self):
return self.book_set.filter(published=True)
class Book(models.Model):
author = models.ForeignKey(Author, on_delete=models.CASCADE)
title = models.CharField(max_length=250)
synopsis = models.TextField()
published = models.BooleanField()
pages = models.IntegerField()
def __str__(self):
return f"{self.title} by {self.author.name}"
Чтобы использовать модель, запустите: pip install model_bakery
В вашем файле tests.py
from django.test import TestCase
from model_bakery import baker
from books.models import Author, Book
class AuthorTest(TestCase):
def setUp(self):
#create a dummy author
self.author = baker.make(Author)
#create published books by the author
self.published_books = baker.make(Book, author=self.author, _quantity=5)
#the first argument is the model of the object you want to create
#the second argument, which is optional, is the field(s) you want to #provide value for. It is necessary here because I want to test the #books written by self.author. If I do not set it, bakery will #autogenerate random author(s) for the book(s)
#the third argument, which is also optional, is the quantity of objects to #be created
self.unpublished_books = baker.make(Book, author=self.author, _quantity=5)
#to test that our active_book_list function works properly
def test_active_book_list(self):
author = self.author
published_books = self.author.active_book_list()
number_of_published_books = len(published_books)
self.assertEqual(number_of_pulished_books, 5)
#self.author has 10 books in total but we expect this function to give #return 5 books
Теперь запустите: python manage.py test
чтобы протестировать свой проект
Или запустите: python manage.py test books
чтобы протестировать только приложение с книгами
Вывод вашего терминала должен выглядеть примерно так:
Итак, каждый раз, когда вы исправляете ошибку или добавляете новые функции, запускайте: python manage.py test
для тестирования вашего проекта или запуска: python manage.py test books
для тестирования только вашего приложения с книгами, чтобы проверить, что ваш модуль active_book_list работает должным образом.