🏠 Домашнее задание: 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-методы (из лекции)
| Метод | HTTP | URL | Описание |
|---|---|---|---|
| Создание сотрудника | 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.
Связь с теорией
- Теория: класс CompanyApi — аналогичная структура, на которой основан EmployeeApi
- Примеры: тест с CompanyApi — паттерн создания объекта + получения по ID
- Ошибки — типичные проблемы при работе с requests