python
March 27, 2019

Тестирование с помощью 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')

Теперь всё шикарно работает!

Для тех кто запутался, прилагаю скриншот со структурой проекта: