Тестирование с помощью pytest и selenium. Покрываем наш проект тестами #1
В этой небольшой статье хочу показать Вам, как сделать автоматическое тестирование наших приложений. Начнём с простого. Создадим папку itpavel_test в папке нашего проекта. Рядом с папками виртуального окружения (project_venv) и папка проекта (project). Не забываем запустить нашу виртуальную среду. Памятка: открываем терминал, заходим в папку project_venv/Scripts и выполняем activate. Когда наша среда активируется, установим selenium и pytest.
cd project_venv/Scripts activate cd ../.. pip freeze pip install selenium pip install pytest
Selenium — это инструмент для автоматизации действий веб-браузера. В большинстве случаев используется для тестирования Web-приложений.
PyTest - фреймворк python для тестирования.
Для работы selenium`a необходимо скачать драйвер браузера. Качаем хром chromedriver отсюда и кладём его в папку itpavel_test, предварительно достав из архива. Так же в этой папке (itpavel_test) создаём наш файл для тестов. Я назвал его red_test.py. Получается структура такая:
Папка проекта (ITPavel Project)
- Папка проекта (project)
- Папка виртуальной среды (project_venv)
- Папка с тестами (itpavel_test):
crome_driver_win32 (папка)
chromedriver.exe
red_test.py (файл с тестами)
В red_test импортируем webdriver из selenium и создаём функцию. Эта функция создаёт с помощью скачанного chrome_driver окно браузера (необходимо указать путь к .exe файлу), переходит по определённой ссылке и сравнивает заголовок окна (title, который мы задали в html). Если совпадение - тест пройден. Если нет - вызывается исключение. Полный код:
from selenium import webdriver
def test_title():
browser = webdriver.Chrome('chromedriver_win32\chromedriver.exe')
browser.get('http://127.0.0.1:8000/home/')
assert browser.title == 'ITPavel'
Теперь с помощью командной строки отдаём этот файл в pytest:
pytest -v red_test.py
Читаем результат:
C:\Users\admin\Desktop\ITPavel Project\itpavel_test>pytest -v red_test.py ====================================================================== test session starts ====================================================================== platform win32 -- Python 3.7.1, pytest-4.3.1, py-1.8.0, pluggy-0.9.0 -- d:\program files (x86)\python37-32\python.exe cachedir: .pytest_cache rootdir: C:\Users\admin\Desktop\ITPavel Project\itpavel_test, inifile: collected 1 item red_test.py::test_title DevTools listening on ws://127.0.0.1:58968/devtools/browser/5e45be58-5bd0-4e35-a277-fdf4eb5e3594 PASSED [100%] =================================================================== 1 passed in 2.33 seconds ====================================================================
rootdir - папка в которой находится фай
collected 1 item - число тестов, которые были найдены для выполнения
red_test.py::test_title - название текста
PASSED - тест пройден
И в конце сводка, за какое время, и сколько тестов мы прошли. (1 passed in 2.33 seconds)
Теперь попробуем изменить title, что бы тест завалился. Вот какой будет результат:
C:\Users\admin\Desktop\ITPavel Project\itpavel_test>pytest -v red_test.py
====================================================================== test session starts ======================================================================
platform win32 -- Python 3.7.1, pytest-4.3.1, py-1.8.0, pluggy-0.9.0 -- d:\program files (x86)\python37-32\python.exe
cachedir: .pytest_cache
rootdir: C:\Users\admin\Desktop\ITPavel Project\itpavel_test, inifile:
collected 1 item
red_test.py::test_title
DevTools listening on ws://127.0.0.1:60232/devtools/browser/c82c6f15-6842-460a-93ad-9291acb464cb
FAILED [100%]
=========================================================================== FAILURES ============================================================================
__________________________________________________________________________ test_title ___________________________________________________________________________
def test_title():
browser = webdriver.Chrome('chromedriver_win32\chromedriver.exe')
browser.get('http://127.0.0.1:8000/home/')
> assert browser.title == 'ITPavel1'
E AssertionError: assert 'ITPavel' == 'ITPavel1'
E - ITPavel
E + ITPavel1
E ? +
red_test.py:6: AssertionError
======================================================================= warnings summary ========================================================================
red_test.py:4
FAILED - тест завален
AssertionError - показывает что пошло не так. А именно, ITPavel не равно ITPavel1.
P. S. Я немного ошибся в предыдущей статье. Давайте поправим эту неточность в 2 действия:
1) В папке с приложением home_page есть папка templates. Мы положили наш home.html файл прямо в неё. Хотя рекомендуется класть .html файл по такому адресу home_page/templates/home_page/. Поэтому создаём в папке templates папку с названием нашего приложение (home_page) и перетаскиваем в неё наш html файл.
2) Всё, теперь всё правильно. Вот только сайт не открывается. Всё потому что во views.py, в папке приложение home_page указан старый адрес:
def home(request):
return render(request, 'home.html')
Меняем на адрес с созданной нами папкой:
def home(request):
return render(request, 'home_page/home.html')
Теперь всё шикарно работает!
Для тех кто запутался, прилагаю скриншот со структурой проекта: