🏠 Домашнее задание: EmployeeApi

← К оглавлению урока

⚡ ДЗ в двух словах

Разработать класс EmployeeApi и три теста: создание, получение, изменение сотрудника через XClients API.

# employee_api.py
import requests

class EmployeeApi:
    def __init__(self, url):
        self.url = url

    def create_employee(self, first_name, last_name, middle_name,
                        company_id, email, phone, birthdate, is_active=True):
        ...  # POST /employee/create

    def get_employee(self, employee_id):
        ...  # GET /employee/info?id=...

    def update_employee(self, employee_id, **kwargs):
        ...  # PATCH /employee/change?id=...
Это не LMS-ДЗ. Summary session 7 — урок-повторение, отдельного ДЗ в LMS нет. Здесь разобрано задание из лекции (слайды «Домашнее задание»), которое выдавалось в конце занятия как практическая работа.

Условие задания (из лекции)

Разработать автоматические тесты, которые проверяют корректность работы API для управления сотрудниками. Создать класс EmployeeApi для вспомогательных методов.

API-методы (из лекции)

МетодHTTPURLОписание
Создание сотрудникаPOST/employee/createСоздаёт нового сотрудника, принимает данные в JSON
Получение сотрудникаGET/employee/infoПолучает данные по ID через query-параметр ?id=...
Изменение сотрудникаPATCH/employee/changeИзменяет данные по ID через query-параметр ?id=...

Подготовка окружения

1. Виртуальное окружение (PowerShell)

# Создать виртуальное окружение в папке проекта
python -m venv venv

# Активировать
venv\Scripts\Activate.ps1

# Установить зависимости
pip install requests pytest

2. Структура файлов проекта

api_tests/
├── venv/
├── employee_api.py        # класс EmployeeApi
└── test_employees.py      # тесты

Шаг 1: создать файл employee_api.py

# employee_api.py
import requests


class EmployeeApi:
    """Класс для работы с API сотрудников."""

    def __init__(self, url):
        self.url = url

    def create_employee(self, first_name, last_name, middle_name,
                        company_id, email, phone, birthdate, is_active=True):
        """Создание нового сотрудника."""
        employee_data = {
            "first_name": first_name,
            "last_name": last_name,
            "middle_name": middle_name,
            "company_id": company_id,
            "email": email,
            "phone": phone,
            "birthdate": birthdate,
            "is_active": is_active
        }
        resp = requests.post(f"{self.url}/employee/create", json=employee_data)
        assert resp.status_code == 201, \
            f"Ошибка: ожидался статус 201, получен {resp.status_code}. Тело: {resp.text}"
        return resp.json()

    def get_employee(self, employee_id):
        """Получение информации о сотруднике по ID."""
        resp = requests.get(f"{self.url}/employee/info?id={employee_id}")
        assert resp.status_code == 200, \
            f"Ошибка: ожидался статус 200, получен {resp.status_code}. Тело: {resp.text}"
        return resp.json()

    def update_employee(self, employee_id, **kwargs):
        """Изменение данных сотрудника (передаются только изменяемые поля)."""
        update_data = {key: value for key, value in kwargs.items() if value is not None}
        resp = requests.patch(
            f"{self.url}/employee/change?id={employee_id}",
            json=update_data
        )
        assert resp.status_code == 200, \
            f"Ошибка: ожидался статус 200, получен {resp.status_code}. Тело: {resp.text}"
        return resp.json()

Шаг 2: создать файл test_employees.py

# test_employees.py
from employee_api import EmployeeApi

BASE_URL = "http://5.101.50.27:8000"
api = EmployeeApi(BASE_URL)


def test_create_employee():
    """Тест: создание нового сотрудника."""
    # 1. Создаём сотрудника
    employee = api.create_employee(
        first_name="John",
        last_name="Doe",
        middle_name="Edward",
        company_id=1,
        email="johndoe@example.com",
        phone="+1234567890",
        birthdate="1990-01-15",
        is_active=True
    )

    # 2. Проверяем наличие ID в ответе
    assert "id" in employee, "Ожидалось наличие ключа 'id' в ответе"

    # 3. Проверяем, что данные соответствуют отправленным
    assert employee["first_name"] == "John"
    assert employee["last_name"] == "Doe"
    assert employee["middle_name"] == "Edward"
    assert employee["company_id"] == 1
    assert employee["email"] == "johndoe@example.com"
    assert employee["phone"] == "+1234567890"
    assert employee["is_active"] is True


def test_get_employee_info():
    """Тест: получение информации о сотруднике."""
    # 1. Создаём нового сотрудника
    employee = api.create_employee(
        first_name="Alice",
        last_name="Brown",
        middle_name="Marie",
        company_id=2,
        email="alicebrown@example.com",
        phone="+9876543210",
        birthdate="1988-05-22",
        is_active=True
    )
    employee_id = employee["id"]

    # 2. Запрашиваем информацию о сотруднике
    retrieved = api.get_employee(employee_id)

    # 3. Проверяем, что данные совпадают
    assert retrieved["id"] == employee_id
    assert retrieved["first_name"] == "Alice"
    assert retrieved["last_name"] == "Brown"
    assert retrieved["email"] == "alicebrown@example.com"


def test_update_employee():
    """Тест: изменение данных о сотруднике."""
    # 1. Создаём сотрудника
    employee = api.create_employee(
        first_name="Bob",
        last_name="Smith",
        middle_name="James",
        company_id=3,
        email="bobsmith@example.com",
        phone="+1357924680",
        birthdate="1985-07-30",
        is_active=True
    )
    employee_id = employee["id"]

    # 2. Обновляем данные
    updated = api.update_employee(
        employee_id,
        first_name="Robert",
        email="robertsmith@example.com",
        is_active=False
    )

    # 3. Проверяем, что данные изменились
    assert updated["first_name"] == "Robert"
    assert updated["email"] == "robertsmith@example.com"
    assert updated["is_active"] is False

Шаг 3: запуск тестов

Запуск через PowerShell

# Перейти в папку проекта
cd api_tests

# Активировать окружение
venv\Scripts\Activate.ps1

# Запустить все тесты
pytest test_employees.py -v

# Запустить конкретный тест
pytest test_employees.py::test_create_employee -v

# Запустить с выводом print
pytest test_employees.py -v -s

Ожидаемый вывод при успешном прохождении

collected 3 items

test_employees.py::test_create_employee    PASSED
test_employees.py::test_get_employee_info  PASSED
test_employees.py::test_update_employee    PASSED

========================= 3 passed in 2.51s =========================

Шаг 4: проверка в VS Code

Запуск через F5 (Debug)

Создай .vscode/launch.json в папке проекта:

// .vscode/launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "pytest: test_employees",
            "type": "debugpy",
            "request": "launch",
            "module": "pytest",
            "args": ["test_employees.py", "-v"],
            "cwd": "${workspaceFolder}"
        }
    ]
}

Точки останова для отладки

Поставь точку останова на строке employee_id = employee["id"] в test_get_employee_info, запусти через F5. В панели «Variables» увидишь содержимое словаря employee — можно изучить полный ответ API.

Связь с теорией