Рубрики
Без рубрики

Джанго тестирование – лучшие практики и примеры

Узнайте, как работает тестирование в Django – лучшие практики и примеры. Tagged с Django, тестирование, Python, Codequality.

Первоначально опубликовано на мой блог

Введение

Django является структурой высокого уровня для создания масштабируемых веб -приложений. Django используется такими компаниями, как Google, Facebook, Pinterest, НАСА и т. Д.

Качество кода очень важно в разработке программного обеспечения. Тестирование – одна из лучших практик хорошего разработчика, реальность такова, что все говорят об этом Но в реальном словом не все пишут тесты 😁

У нас много типов тестов, но в этом уроке я расскажу о двух из них:

  • Модульные тесты Является уровнем тестирования программного обеспечения, когда раздел (единица) приложения соответствует требованиям, он фокусируется на одной конкретной функции.
  • Интеграционные тесты Является уровнем тестирования программного обеспечения, где отдельные разделы объединяются и тестируются как группа, он объединил несколько фрагментов кода и функциональности.

Когда и зачем запускать тесты

  • Тестирование помогает нам структурировать хороший код, поддерживать большую кодовую базу и найти ошибки.
  • Хорошо написанные тесты делают ваш код – легко отлаживать, интегрировать и развернуть.
  • Хорошо написанные тесты спасают нас много раз.
  • Независимо от того, что вы, сольный разработчик, или работаете в команде, вы должны написать тесты.

Лучшие практики

  • Если это может сломаться, это должно быть проверено. Это включает в себя модели, представления, формы, шаблоны, валидаторы и т. Д. Каждый тест, как правило, должен тестировать только одну функцию.
  • Будь проще. Вы не хотите писать тесты поверх других тестов.
  • Запустите тесты всякий раз, когда код вытаскивается или выталкивается из репо и в стационарной среде, прежде чем подталкивать к производству.
  • При обновлении до более новой версии Django:
  • обновлять локально,
  • Запустите свой тестовый набор,
  • Исправить ошибки,
  • Подтолкнуть репо и постановка, а затем
  • Проверьте снова в постановке перед доставкой кода.

Узнайте больше здесь

Настраивать

Вы можете найти окончательный исходный код здесь

pipenv shell
(phonebook_rest_api-9zIZds3o) ╭─username@username-Latitude-7480
  • Запустить миграции
python manage.py migrate
Operations to perform:
 Apply all migrations: admin, auth, contact, contenttypes, sessions
  • Запустите приложение
python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
April 21, 2020 - 18:37:31
Django version 3.0.2, using settings 'phonebook.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

Откройте свой браузер в http://localhost: 8000/

Уверяем, что все работает правильно.

Структура

По умолчанию все новые приложения в проекте Django поставляются с файлом tests.py. Любой тест в этом файле, который начинается с _test__, будет проведен тестовым бегуном Django. Убедитесь, что все тестовые файлы начинаются с _test__.

По мере того, как приложения растут в сложности, рекомендуется удалить этот исходный файл tests.py и заменить его на уровне приложения Тесты Папка, которая содержит отдельные тестирование файлов для каждой области функциональности.

В приложении в реальном мире у вас должно быть что -то вроде этого:

├── contact
│   ├── admin.py
│   ├── api.py
│   ├── apps.py
│   ├── __init__.py
│   ├── migrations
│   │   ├── 0001_initial.py
│   │   └── __init__.py
│   ├── models.py
│   ├── serializers.py
│   ├── tests # new
│   │   ├── __init__.py
│   │   ├── test_forms.py # new
│   │   ├── test_models.py # new
│   │   └── test_views.py # new
│   ├── urls.py
│   └── views.py

В этой статье я буду держать это просто.

Прежде чем написать какие -либо тесты, мы создадим новое приложение Django и назвали его Страницы Он будет содержать наши статические страницы (дома и около)

python manage.py startapp pages

Зарегистрируйте приложение здесь

# Application definition

INSTALLED_APPS = [
   'django.contrib.admin',
   'django.contrib.auth',
   'django.contrib.contenttypes',
   'django.contrib.sessions',
   'django.contrib.messages',
   'django.contrib.staticfiles',
   'rest_framework',  # add this
   'contact'  # add this
   'pages' # new
]

Обновление страниц views.py

# pages views.py
from django.shortcuts import render
from django.views.generic import TemplateView


class HomePageView(TemplateView):
   template_name = 'pages/home.html'


class AboutPageView(TemplateView):
   template_name = 'pages/about.html'

Создать urls.py Внутри страниц

touch pages/urls.py
# pages/urls.py
from django.urls import path

from .views import HomePageView, AboutPageView

urlpatterns = [
   path('', HomePageView.as_view(), name='home'),
   path('about/', AboutPageView.as_view(), name='about'),
]

И, наконец, обновите свой основной urls.py

from django.contrib import admin
from django.urls import path, include  # add this

urlpatterns = [
   path('admin/', admin.site.urls),
   path("", include("contact.urls")),  # add this
   path("", include("accounts.urls")),  # add this
   path("", include("pages.urls"))  # new
]

Создайте свои шаблоны

mkdir templates/pages
touch templates/pages/home.html
touch templates/pages/about.html

Давайте добавим немного HTML -контента


Homepage

About page

Запустите свой сервер, чтобы гарантировать, что все работает правильно.

python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
April 22, 2020 - 06:46:31
Django version 3.0.2, using settings 'phonebook.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
[22/Apr/2020 06:46:33] "GET / HTTP/1.1" 200 2268

Откройте свой браузер, затем перейдите к URL -адреса домашней страницы

Простой тестовый приход

Теперь мы будем тестировать наши статические страницы без участия в базе данных. Давайте проверим домашнюю страницу

# pages/tests.py

from django.http import HttpRequest
from django.test import SimpleTestCase
from django.urls import reverse

from . import views


class HomePageTests(SimpleTestCase):

   def test_home_page_status_code(self):
       response = self.client.get('/')
       self.assertEquals(response.status_code, 200)

   def test_view_url_by_name(self):
       response = self.client.get(reverse('home'))
       self.assertEquals(response.status_code, 200)

   def test_view_uses_correct_template(self):
       response = self.client.get(reverse('home'))
       self.assertEquals(response.status_code, 200)
       self.assertTemplateUsed(response, 'pages/home.html')

   def test_home_page_contains_correct_html(self):
       response = self.client.get('/')
       self.assertContains(response, '

Homepage

') def test_home_page_does_not_contain_incorrect_html(self): response = self.client.get('/') self.assertNotContains( response, 'Hi there! No data found.')

Теперь запустите тесты

python manage.py test
System check identified no issues (0 silenced).
.....
---------------------------------------------------------------------------
Ran 5 tests in 0.015s

OK

Он работает правильно

Давайте сделаем то же самое для страницы

# pages/tests.py
class AboutPageTests(SimpleTestCase):

   def test_about_page_status_code(self):
       response = self.client.get('/about/')
       self.assertEquals(response.status_code, 200)

   def test_view_url_by_name(self):
       response = self.client.get(reverse('about'))
       self.assertEquals(response.status_code, 200)

   def test_view_uses_correct_template(self):
       response = self.client.get(reverse('about'))
       self.assertEquals(response.status_code, 200)
       self.assertTemplateUsed(response, 'pages/about.html')

   def test_about_page_contains_correct_html(self):
       response = self.client.get('/about/')
       self.assertContains(response, '

About page

') def test_about_page_does_not_contain_incorrect_html(self): response = self.client.get('/') self.assertNotContains( response, 'Hi there! I should not be on the page.')

затем бежать

python manage.py test

System check identified no issues (0 silenced).
..........
---------------------------------------------------------------------------
Ran 10 tests in 0.023s

OK

Это работает нормально

Прецедент

Testcase является наиболее распространенным классом для написания теста в Django, он дает нам возможность издеваться над вопросами в базе данных.

Давайте протестируем нашу контактную модель базы данных

# contact/tests.py
from django.test import TestCase
from django.urls import reverse

from .models import Contact


class ContactTests(TestCase):

   def setUp(self):
       Contact.objects.create(
           first_name='Ousseynou',
           last_name="Diop",
           phone="779929900",
           email="hello@me.com"
       )

   def test_email_content(self):
       contact = Contact.objects.get(id=1)
       expected_object_name = f'{contact.email}'
       self.assertEquals(expected_object_name, 'hello@me.com')

   def test_contact_list_view(self):
       response = self.client.get(reverse('contacts'))
       self.assertEqual(response.status_code, 200)
       self.assertContains(response, 'hello@me.com')
       self.assertTemplateUsed(response, 'contact/contact_list.html')

затем бежать

python manage.py test

System check identified no issues (0 silenced).
..........
---------------------------------------------------------------------------
Ran 10 tests in 0.023s

OK

Это работает нормально! Давайте сломаем код.

# contact/tests.py
from django.test import TestCase
from django.urls import reverse

from .models import Contact


class ContactTests(TestCase):

   def setUp(self):
       Contact.objects.create(
           first_name='Ousseynou',
           last_name="Diop",
           phone="779929900",
           email="hello@me.com"
       )

   def test_email_content(self):
       contact = Contact.objects.get(id=1)
       expected_object_name = f'{contact.email}'
       self.assertEquals(expected_object_name, 'hello@gmail.com') # new

   def test_contact_list_view(self):
       response = self.client.get(reverse('contacts'))
       self.assertEqual(response.status_code, 200)
       self.assertContains(response, 'hello@me.com')
       self.assertTemplateUsed(response, 'contact/contact_list.html')

Затем снова запустите тест

python manage.py test
System check identified no issues (0 silenced).
.F..........
======================================================================
FAIL: test_email_content (contact.tests.ContactTests)
---------------------------------------------------------------------------
Traceback (most recent call last):
 File "/home/username/projects/phonebook_rest_api/contact/tests.py", line 20, in test_email_content
   self.assertEquals(expected_object_name, 'hello@gmail.com')
AssertionError: 'hello@me.com' != 'hello@gmail.com'
- hello@me.com
?        ^
+ hello@gmail.com
?       + ^^^


---------------------------------------------------------------------------
Ran 12 tests in 0.030s

FAILED (failures=1)
Destroying test database for alias 'default'...

Наши тесты не удались.

Теперь вы понимаете, как тесты важны в разработке программного обеспечения.

Вывод

В этой статье мы узнали, как писать тесты для нашего проекта Django. Следующие шаги – написать TDD, настроить CI/CD для поддержания качества кода.

Спасибо за чтение 😍 Увидимся в следующей статье.

Оригинал: “https://dev.to/xarala221/django-testing-best-practices-and-examples-20k4”