2. Погружаемся в инструментарий и библиотеки - qa-guru/knowledge-base GitHub Wiki
Для создания репозитория на GitHub у вас уже должен быть создан профиль на платформе. Пройти процесс регистрации можно на официальном сайте GitHub.
После этого необходимо перейти на свою страницу GitHub и переключиться на вкладку «Repositories».
После нажать на зеленую кнопку «New».
В открывшемся меню необходимо указать имя репозитория, описание (по желанию), выбрать настройки приватности (публичный или закрытый репозиторий) и добавить вспомогательные файлы (README-файл, gitignore и лицензию).
После того как поля страницы будут заполнены, необходимо нажать на зеленую кнопку «Create repository». Новый репозиторий будет создан.
После создания нового пустого репозитория пользователя обычно встречает страница самого репозитория с кратким руководство по работе с ним. В этот момент репозиторий хранится удаленно на серверах GitHub и доступ к нему может получить его владелец и круг его доверенных лиц.
Репозиторий можно клонировать на локальную машину и работать с его содержимым на своем компьютере. Актуальные изменения можно синхронизировать с удаленным репозиторием и всеми его участниками.
Для клонирования репозитория с помощью PyCharm для начала необходимо скопировать ссылку на репозиторий, которую можно получить на начальной странице репозитория.
Далее переходим в PyCharm, переключаемся на вкладку «VCS» и выбираем пункт «Get from Version Control».
Вставляем ссылку в поле URL и нажимаем кнопку «Clone».
После того как мы внесли изменения в проект, их необходимо зафиксировать в нашем репозитории. Для этого на боковой панели слева есть вкладка «Commit». Переходим в нее, выбираем файлы для коммита и указываем осмысленное сообщение к коммиту, такое, чтобы новый человек в проекте мог понять суть и необходимость совершенного коммита.
Коммит и все изменения должны оказаться на удаленном репозитории. Для этого необходимо перейти во вкладку «Git» и выбрать пункт «Push».
Зависимости в Python можно задавать вручную, но в больших проектах с огромным количеством библиотек это бывает неудобно и долго. Поэтому нужно создать специальный файл, прописать в нем все зависимости и система сама все подключит.
Для это создаем в проекте файл requirements.txt
и на каждой новой строке прописываем отдельную зависимость. После заполнения файла PyCharm сам поймет, что мы хотим сделать и предложит установить библиотеки. Для этого следует нажать кнопку «Install requirements».
Важно отметить: В этом случаем система установит последнюю доступную версию. Если необходимо установить специальную версию или ту, у которой не было официально релиза, то это необходимо указать в файле
requirements.txt
вручную. Для этого необходимо указать имя библиотеки и через знак==
версию, которую необходимо установить. К примеру,selene==2.0.0rc7
. Также можно указать версию с помощью знака>=
. К примеру,selene>=2.0.0rc7
, это означает что система установит последнюю версию библиотеки, которая не ниже2.0.0rc7
включая версию которая указана после равно.
Если зависимостей много и не отображается кнопка «Install requirements», то можно воспользоваться командой pip install -r requirements.txt
которую необходимо ввести в терминал проекта. Эта команда установит все зависимости из файла requirements.txt
.
Важно: в Pytest есть некоторые правила, которые необходимо соблюдать, чтобы корректно запускались тесты.
Все файлы, в которых написаны тесты, должны начинаться или заканчиваться на словоtest
. К примеру,test_google.py
илиgoogle_test.py
.
Все функции с тестами должны начинаться с префиксаtest
. К примеру,def test_first()
.
Простой тест на Pytest, который просто запускается и ничего не делает, выглядит следующим образом:
def test_first():
pass
Чтобы запустить, тест необходимо нажать на зеленую стрелку рядом с названием функции. В открывшемся окне выбрать Run 'pytest in test_something'
.
Если не отображается зеленая стрелка, то нужно перейти в настройки проекта и в разделе Tools
выбрать Python Integrated Tools
. В открывшемся окне в разделе Testing
выбрать Default test runner
и в выпадающем списке выбрать pytest
. И далее нажать Apply
и Ok
.
После запуска, результат теста будет отображен в консоли. Если тест не падает, то в консоли будет сообщение Process finished with exit code 0
.
Также можно запустить тесты через терминал, для этого необходимо в терминале ввести команду pytest
. Команда pytest
запустит все тесты в проекте. Если необходимо запустить только один тест, то нужно указать его название через двоеточие. К примеру, pytest test_google.py::test_first
.
Если его запустить, то в терминале появится подробное сообщение с информацией о запуске теста.
Если мы напишем тест, который будет падать, то система подробно расскажет обо всех ошибках. И выделит конкретные строчки, на которых тест падает.
def test_sum():
a = 5
b = 10
assert a == b
Следующим образом можно выводить в консоль сообщения во время падения теста:
def test_first():
assert 1 == 1
def test_second():
assert 1 == 2, "Единица не должна быть равна двойке"
Текст в кавычках будет выведен в консоль вместе с сообщением об ошибке. Это может быть полезно для быстрого понимания, что пошло не так. Текст в кавычках это просто текст который не изменяется в зависимости от того, что произошло в тесте.
Фикстуры в Pytest — это функции, которые могут вызываться перед тестом или после него. Фикстуры могут быть полезны для подготовки тестовых данных или окружения.
Все фикстуры должны быть описаны в файле conftest.py
.
Для того чтобы создать фикстуру необходимо создать функцию с декоратором @pytest.fixture()
. Внутри функции можно указать необходимые действия, которые будут выполняться при вызове фикстуры.
Синтаксис фикстур:
@pytest.fixture()
def before_each():
print("Called before each test")
def test_first(before_each):
assert 1 == 1
Для того чтобы увидеть дерево вызовов фикстур можно воспользоваться командой pytest fixtures.py ----setup-plan
, где fixtures.py название файла с тестами. В консоли будет выведено дерево вызовов фикстур.
import pytest
@pytest.fixture
def login_page(browser):
print("Логин пейдж!")
@pytest.fixture
def user():
print("Юзер!")
return "username", "password"
def test_login(login_page, user):
username, password = user
assert username == "username"
assert password == "password"
def test_logout(login_page, user):
username, password = user
assert username == "username"
assert password == "password"
Чтобы реализовать teardown, необходимо использовать ключевое слово yield
. Все что будет после yield
будет выполняться после теста.
Разница между yield
и return
в том, что yield
позволяет выполнить код после теста, а return
нет, так как после return
выполнение функции прекращается. Return можно использовать, для того чтобы вернуть значение из фикстуры.
import pytest
@pytest.fixture(scope="function")
def browser_settings():
print("Браузер!")
yield
print("Закрываем браузер!")
При запуске теста в консоли видно, что сначала вызывается фикстура browser_settings_
, которая печатает Браузер!
, затем вызывается тест, и после теста вызывается снова фикстура browser_settings
, которая печатает Закрываем браузер!
.
В фикстурах используются scope, который позволяет указать, когда будет вызываться фикстура. Возможные значения:
-
function
— фикстура будет вызываться перед каждым тестом. Это значение по умолчанию и можно не указывать его явно. -
class
— фикстура будет вызываться перед всеми тестами в классе. И если в классе несколько тестов, то фикстура будет вызываться один раз перед всеми тестами в классе и один раз после всех тестов в классе. -
module
— фикстура будет вызываться перед всеми тестами в модуле. Будет вызываться один раз перед всеми тестами в модуле и один раз после всех тестов в модуле. -
session
— фикстура будет вызываться перед всеми тестами в сессии. Будет вызываться один раз перед всеми тестами в сессии и один раз после всех тестов в сессии. -
package
— фикстура будет вызываться перед всеми тестами в пакете. Будет вызываться один раз перед всеми тестами в пакете и один раз после всех тестов в пакете.
Пример использования scope(нажать, чтобы раскрыть)
Пример для scope="function"
:
import pytest
@pytest.fixture(scope="function")
def my_fixture():
# ...
def test_foo(my_fixture):
# ...
def test_bar(my_fixture):
# ...
Пример для scope="class"
:
import pytest
@pytest.fixture(scope="class")
def my_fixture():
# ...
class TestClass:
def test_foo(self, my_fixture):
# ...
def test_bar(self, my_fixture):
# ...
Пример для scope="module"
:
import pytest
@pytest.fixture(scope="module")
def my_fixture():
# ...
def test_foo(my_fixture):
# ...
def test_bar(my_fixture):
# ...
Пример для scope="session"
:
import pytest
@pytest.fixture(scope="session")
def my_fixture():
# ...
def test_foo(my_fixture):
# ...
def test_bar(my_fixture):
# ...
Пример для scope="package"
:
import pytest
@pytest.fixture(scope="package")
def my_fixture():
# ...
def test_foo(my_fixture):
# ...
def test_bar(my_fixture):
# ...
Смотрите только когда не можете понять что делать(нажать, чтобы раскрыть)
Вам нужно написать фикстуру в которой будут заданы размеры экрана браузера и передать ее в тест.
Синтаксис для задания размера окна браузера и закрытия браузера:
browser.config.window_height = 1080 # задает высоту окна браузера
browser.config.window_width = 1920 # задает ширину окна браузера
browser.quit() # закрывает браузер после выполнения теста
Для этого вам нужно создать файл conftest.py
и в нем написать фикстуру:
@pytest.fixture()
def setting_browser():
# задаем размер окна браузера (вместо этого комментария нужно подставить код из примера выше как задать размер окна браузера)
yield
# закрываем браузер после выполнения теста (вместо этого комментария нужно подставить код из примера выше как закрыть браузер)
Дальше вам нужно в тесты передать фикстуру setting_browser
. Для этого вам нужно в тестах в качестве параметра указать setting_browser
:
def test_first(setting_browser):
browser.open("https://www.google.com/")
def test_second(setting_browser):
browser.open("https://www.google.com/")
Если в фикстуре указать autouse=True
то фикстура будет запускаться перед каждым тестом автоматически и в тестах не нужно будет указывать setting_browser
в качестве параметра:
Пример фикстуры с autouse=True
:
@pytest.fixture(autouse=True)
def setting_browser():
# задаем размер окна браузера (вместо этого комментария нужно подставить код из примера выше как задать размер окна браузера)
yield
# закрываем браузер после выполнения теста (вместо этого комментария нужно подставить код из примера выше как закрыть браузер)
И в тестах тогда будет достаточно указать:
def test_first():
browser.open("https://www.google.com/")
def test_second():
browser.open("https://www.google.com/")