2. Погружаемся в инструментарий и библиотеки - qa-guru/knowledge-base GitHub Wiki

Как создать репозиторий на GitHub

Для создания репозитория на GitHub у вас уже должен быть создан профиль на платформе. Пройти процесс регистрации можно на официальном сайте GitHub.

После этого необходимо перейти на свою страницу GitHub и переключиться на вкладку «Repositories».

После нажать на зеленую кнопку «New».

В открывшемся меню необходимо указать имя репозитория, описание (по желанию), выбрать настройки приватности (публичный или закрытый репозиторий) и добавить вспомогательные файлы (README-файл, gitignore и лицензию).

После того как поля страницы будут заполнены, необходимо нажать на зеленую кнопку «Create repository». Новый репозиторий будет создан.

Как клонировать репозиторий с помощью PyCharm

После создания нового пустого репозитория пользователя обычно встречает страница самого репозитория с кратким руководство по работе с ним. В этот момент репозиторий хранится удаленно на серверах 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

Чтобы реализовать 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/")
⚠️ **GitHub.com Fallback** ⚠️