🏠 Домашнее задание 7: EmployeeApi
⚡ ДЗ 7 — кратко
Создать класс EmployeeApi по образцу CompanyApi из урока. Написать тесты для API управления сотрудниками: создать сотрудника, получить по ID, изменить данные.
- POST
/employee/create— создать сотрудника - GET
/employee/info?id=N— получить по ID - PATCH
/employee/change/{id}— изменить данные
Условие задания (из LMS)
ДЗ 7. Разработать автоматические тесты, которые проверяют корректность работы API для управления сотрудниками. Создайте класс
EmployeeApi для создания вспомогательных методов.
API-методы для работы
1. Создание нового сотрудника
- Метод: POST
- URL:
http://5.101.50.27:8000/employee/create - Описание: Создаёт нового сотрудника, принимает данные в JSON
2. Получение информации о сотруднике
- Метод: GET
- URL:
http://5.101.50.27:8000/employee/info - Описание: Получает данные о сотруднике по его ID
3. Изменение данных о сотруднике
- Метод: PATCH
- URL:
http://5.101.50.27:8000/employee/change - Описание: Позволяет изменить информацию о сотруднике по его ID
Подготовка окружения
1. Создание виртуального окружения
# Терминал (PowerShell)
# Создаём папку проекта и переходим в неё
mkdir hw07-employee-api
cd hw07-employee-api
# Создаём виртуальное окружение
python -m venv venv
# Активируем (PowerShell)
.\venv\Scripts\Activate.ps1
# Проверяем активацию: в приглашении появится (venv)
(venv) PS C:\hw07-employee-api>
2. Установка зависимостей
# Устанавливаем requests и pytest
pip install requests pytest
# Проверяем
pip show requests # Версия 2.x
pip show pytest # Версия 8.x
# (Опционально) сохраняем зависимости
pip freeze > requirements.txt
3. Структура проекта
hw07-employee-api/
├── venv/
├── employee_api.py # Класс EmployeeApi
├── test_employees.py # Тесты
└── requirements.txt
Пошаговое решение
Шаг 1: Изучить API через Swagger
Открой http://5.101.50.27:8000/docs в браузере. Найди раздел employee. Изучи:
- Какие поля требуются для создания сотрудника (обязательные и опциональные)
- Какой формат у ответа GET /employee/info
- Какие поля можно изменить через PATCH
⚠️ Проверить по документации: точные поля запросов employee/create и employee/change могут отличаться от company. Используй Swagger UI для верификации.
Шаг 2: Создать компанию для сотрудника
Сотрудник всегда принадлежит компании. Для тестирования нужно сначала создать компанию и получить её ID.
# employee_api.py
import requests
BASE_URL = "http://5.101.50.27:8000"
class EmployeeApi:
"""Клиент для работы с API сотрудников X-Clients"""
def __init__(self, url):
self.url = url
def get_token(self, username="harrypotter", password="expelliarmus"):
"""Получить токен авторизации"""
creds = {"username": username, "password": password}
resp = requests.post(self.url + "/auth/login", json=creds)
assert resp.status_code == 200, f"Ошибка авторизации: {resp.status_code}"
return resp.json()["user_token"]
Шаг 3: Добавить метод создания сотрудника
# employee_api.py — продолжение класса EmployeeApi
def create_employee(self, first_name, last_name, company_id,
phone="", email="", is_active=True):
"""Создать нового сотрудника"""
employee = {
"firstName": first_name,
"lastName": last_name,
"companyId": company_id,
"phone": phone,
"email": email,
"isActive": is_active
}
token = self.get_token()
resp = requests.post(
self.url + "/employee/create",
json=employee,
headers={"x-client-token": token} # Проверить в Swagger!
)
assert resp.status_code == 201, \
f"Ошибка создания сотрудника: {resp.status_code} — {resp.text}"
return resp.json()
Шаг 4: Добавить метод получения сотрудника
# employee_api.py — продолжение
def get_employee(self, employee_id):
"""Получить сотрудника по ID"""
resp = requests.get(
self.url + "/employee/info",
params={"id": employee_id}
)
assert resp.status_code == 200, \
f"Ошибка получения сотрудника: {resp.status_code}"
return resp.json()
Шаг 5: Добавить метод изменения сотрудника
# employee_api.py — продолжение
def change_employee(self, employee_id, last_name=None,
email=None, phone=None, is_active=None):
"""Изменить данные сотрудника"""
token = self.get_token()
update_data = {}
if last_name is not None:
update_data["lastName"] = last_name
if email is not None:
update_data["email"] = email
if phone is not None:
update_data["phone"] = phone
if is_active is not None:
update_data["isActive"] = is_active
resp = requests.patch(
self.url + f"/employee/change/{employee_id}",
json=update_data,
headers={"x-client-token": token}
)
assert resp.status_code == 200, \
f"Ошибка изменения сотрудника: {resp.status_code} — {resp.text}"
return resp.json()
Шаг 6: Написать тесты
# test_employees.py
import requests
import pytest
from employee_api import EmployeeApi
BASE_URL = "http://5.101.50.27:8000"
# Вспомогательная функция для создания тестовой компании
def create_test_company(base_url, name="Test Company for Employees"):
"""Создать компанию для тестов сотрудников"""
resp = requests.post(base_url + "/company/create",
json={"name": name, "description": "Test"})
assert resp.status_code == 201, f"Не удалось создать компанию: {resp.status_code}"
return resp.json()["id"]
def test_create_employee():
"""Тест: создание нового сотрудника"""
api = EmployeeApi(BASE_URL)
# 1. Создаём компанию для сотрудника
company_id = create_test_company(BASE_URL)
# 2. Создаём сотрудника
result = api.create_employee(
first_name="Ivan",
last_name="Petrov",
company_id=company_id,
phone="+79001234567",
email="ivan@example.com"
)
# 3. Проверяем результат
assert "id" in result, "В ответе нет поля 'id'"
print(f"Создан сотрудник с ID: {result['id']}")
def test_get_employee():
"""Тест: создать сотрудника и получить его по ID"""
api = EmployeeApi(BASE_URL)
company_id = create_test_company(BASE_URL)
# Создаём сотрудника и запоминаем ID
created = api.create_employee(
first_name="Anna",
last_name="Sidorova",
company_id=company_id
)
employee_id = created["id"]
# Получаем по ID и проверяем данные
employee = api.get_employee(employee_id)
assert employee["firstName"] == "Anna"
assert employee["lastName"] == "Sidorova"
assert employee["isActive"] is True
def test_change_employee():
"""Тест: изменить данные сотрудника"""
api = EmployeeApi(BASE_URL)
company_id = create_test_company(BASE_URL)
# Создаём сотрудника
created = api.create_employee(
first_name="Test",
last_name="Employee",
company_id=company_id
)
employee_id = created["id"]
# Изменяем фамилию
new_last_name = "Updated"
updated = api.change_employee(employee_id, last_name=new_last_name)
# Проверяем изменение
assert updated["lastName"] == new_last_name
Запуск тестов
Через терминал (PowerShell)
# Убедись, что виртуальное окружение активировано
(venv) PS C:\hw07-employee-api> pytest test_employees.py -v
# Ожидаемый вывод:
# test_employees.py::test_create_employee PASSED
# test_employees.py::test_get_employee PASSED
# test_employees.py::test_change_employee PASSED
# 3 passed in 3.45s
Запуск через VS Code (F5 / Run and Debug)
- Открой
test_employees.pyв VS Code - Создай файл
.vscode/launch.jsonдля отладки pytest:
// .vscode/launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "pytest: текущий файл",
"type": "debugpy",
"request": "launch",
"module": "pytest",
"args": [
"${file}",
"-v",
"--tb=short"
],
"console": "integratedTerminal",
"justMyCode": true
}
]
}
- Поставь точку останова на строке с
result = api.create_employee(...) - Нажми F5 для запуска с отладчиком
- В панели Variables посмотри значение
result— там будет весь JSON-ответ
Связь с теорией и примерами
- Теория: клиент-серверная архитектура, HTTP-методы — объясняет зачем POST для создания и PATCH для изменения
- Примеры: класс CompanyApi — эталон для структуры EmployeeApi
- Справочник: параметры requests —
params=для GET /employee/info?id=N - Ошибки — не забудь
timeout=и проверкуstatus_code