├── .gitignore ├── API Test Automation ├── README.md ├── Task_1_SQL.md ├── Task_2_SQL.md ├── api_requests.py ├── configuration.py ├── data.py ├── tests └── test_order.py ├── Александр Самсонов, 24-я когорта - дипломный проект.docx ├── Вторая часть_1 Задание_SQL запрос_1.1.jpg ├── Вторая часть_1 Задание_SQL запрос_1.2.jpg ├── Вторая часть_2 Задание_SQL запрос_2.jpg ├── Вторая часть_Автоматизация теста к API.jpg └── Запуск теста в PyCharm.jpg /.gitignore: -------------------------------------------------------------------------------- 1 | .pytest/ 2 | venv/ 3 | .idea/ 4 | .pytest_cache/ 5 | __pycache__/ -------------------------------------------------------------------------------- /API Test Automation: -------------------------------------------------------------------------------- 1 | Автоматизация теста к API 2 | Теперь автоматизируй сценарий, который подготовили коллеги-тестировщики: 3 | Клиент создает заказ. 4 | Проверяется, что по треку заказа можно получить данные о заказе. 5 | Шаги автотеста: 6 | Выполнить запрос на создание заказа. 7 | Сохранить номер трека заказа. 8 | Выполнить запрос на получения заказа по треку заказа. 9 | Проверить, что код ответа равен 200. 10 | 11 | Технические примечания: 12 | К проекту добавь файлы .gitignore и README.MD . 13 | Логи лежат в файле error.log в папке /var/www/backend/logs. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # СПРИНТ 12 2 | 3 | ## Финальный проект 4 | 5 | ✨Яндекс Практикум ✨ 6 | ### Задания 7 | #### Теоретический блок 8 | ##### Видео 9 | Первая часть теоретического блока — это девять вопросов, на которые предстоит ответить в формате видео. Эту часть нужно выполнить на платформе VCV. 10 | - Выдели на задание полчаса, зарегистрируйся по ссылке и следуй инструкциям. 11 | - У тебя будет около 20 секунд, чтобы прочитать каждый вопрос и подумать над ответом. Затем включится автоматическая запись. 12 | - Перезаписать видео не выйдет. 13 | - Ревьюер даст тебе обратную связь, когда проверит весь дипломный проект целиком. 14 | ##### Текст 15 | Вторая часть теоретического блока — текстовая. Ответы на десять вопросов в отчёте: "Александр Самсонов, 24-я когорта - дипломный проект" 16 | 17 | #### Практический блок: первая часть 18 | ##### 1. Тестирование функциональности веб-приложения 19 | Чек лист в отчёте (Александр Самсонов, 24-я когорта - дипломный проект) 20 | 21 | ##### 2. Ретест багов в мобильном приложении 22 | В отчёте (Александр Самсонов, 24-я когорта - дипломный проект) 23 | 24 | ##### 3. Регрессионное тестирование мобильного приложения по готовым тест-кейсам 25 | В отчёте (Александр Самсонов, 24-я когорта - дипломный проект) 26 | 27 | #### Практический блок: вторая часть 28 | ##### Работа с базой данных 29 | Задание 1 30 | Представь: тебе нужно проверить, отображается ли созданный заказ в базе данных. 31 | Для этого: выведи список логинов курьеров с количеством их заказов в статусе «В доставке» (поле inDelivery = true). 32 | 33 | ```py 34 | SELECT c.login, COUNT(o.id) AS "deliveryCount" 35 | FROM "Couriers" AS c 36 | LEFT JOIN "Orders" AS o ON c.id = o."courierId" AND o."inDelivery" = true 37 | GROUP BY c.login; 38 | ``` 39 | Задание 2 40 | Ты тестируешь статусы заказов. Нужно убедиться, что в базе данных они записываются корректно. 41 | Для этого: выведи все трекеры заказов и их статусы. 42 | Статусы определяются по следующему правилу: 43 | Если поле finished == true, то вывести статус 2. 44 | Если поле canсelled == true, то вывести статус -1. 45 | Если поле inDelivery == true, то вывести статус 1. 46 | Для остальных случаев вывести 0. 47 | 48 | ```py 49 | SELECT 50 | track, 51 | CASE 52 | WHEN finished THEN 2 53 | WHEN cancelled THEN -1 54 | WHEN inDelivery THEN 1 55 | ELSE 0 56 | END AS status 57 | FROM "Orders"; 58 | ``` 59 | 60 | ##### Автоматизация теста к API 61 | Теперь автоматизируй сценарий, который подготовили коллеги-тестировщики: 62 | 1. Клиент создает заказ. 63 | 2. Проверяется, что по треку заказа можно получить данные о заказе. 64 | 65 | Шаги автотеста: 66 | 1. Выполнить запрос на создание заказа. 67 | 2. Сохранить номер трека заказа. 68 | 3. Выполнить запрос на получения заказа по треку заказа. 69 | 4. Проверить, что код ответа равен 200. 70 | 71 | ### Стек для выполнения проекта 72 | * PyCharm 73 | * GitHub 74 | * requests 75 | * pytest -------------------------------------------------------------------------------- /Task_1_SQL.md: -------------------------------------------------------------------------------- 1 | # Александр Самсонов, 24-я когорта — Финальный проект. Инженер по тестированию плюс 2 | 3 | # Подключение к серверу: 4 | var = ssh - rsa 5 | AAAAB3NzaC1yc2EAAAADAQABAAABgQDfBwQK2yfu1iZvOvHdp6S32MIMs0LostJovFNvbsRSdG10lOw8I / UlN9DtCmMLKcQA5BBbKyuTEGLxvdiy5QzWwVEvj / u7tRlde7LKdUMpIYK / zU6GKqxgPAs4P4Z27y6wQhq + IomVxs2KA4xMSF49just5PuOwIBpbhWLtl3E1OK412QNYIyd21cHkEvIZcSpao1jMVyeN1A0EdR8EdQI0Vb / GjoUTR7QRRzSf98bFtnoh0ukbHuLClmxXg3NwylYFT65wY8Jp8mFrU9W1Z4vue3X / 4 6 | XwXIu6sy5XzonSZQAWmuhK3fsza / Tja / Zn3SHCgyZzpmLSwlsgOyIf41o3EqQXUBxS / 4 7 | PzdTO8Y2UuM7o5mHrK2Z2AbbVwskvl5CHLVd2O + GaSXPN25gq2uKV4 + StoOfPeuNXlaiqhposYFGe7532lEs9n9 / q8w + W + XvYDR5tSLusyW27bfJ7ErJAI0D3DPNjsmzd0yYplTw9uBOoVmLcQ2iLNF5mckS5Kr7E = 79528 @ xaMep 8 | 9 | ssh <имя пользователя>@<хост> -p <порт> 10 | ssh bef65cda-5bcd-449f-98f7-ce552302c095@serverhub.praktikum-services.ru -p 4554 11 | # Доступ к базе осуществляется с помощью команды psql -U morty -d scooter_rent, пароль: smith. 12 | 13 | ## Задание 1 14 | # Представь: тебе нужно проверить, отображается ли созданный заказ в базе данных. 15 | # Для этого: выведи список логинов курьеров с количеством их заказов в статусе «В доставке» (поле inDelivery = true). 16 | # Для проверки создам 2 курьера в Postman {{stend}}/api/v1/courier: 17 | { 18 | "login": "barack", 19 | "password": "4444", 20 | "firstName": "abama" 21 | } 22 | #Создаём 3 заказа (в теле меняем дату, метро чтобы не перепутать) {{stend}}/api/v1/orders: 23 | var = { 24 | "firstName": "Абдурахмангаджи", 25 | "lastName": "Убдурахмангаджи", 26 | "address": "Центральный проезд Хорошёвского Серебряного Бора 2", 27 | "metroStation": 3, 28 | "phone": "+34916123451", 29 | "rentTime": 1, 30 | "deliveryDate": "2024-12-04", 31 | "comment": "Привет, Абдурахмангаджи!", 32 | "color": [ 33 | "BLACK" 34 | ] 35 | } 36 | 37 | # SQL запрос 38 | SELECT c.login, COUNT(o.id) AS "deliveryCount" 39 | FROM "Couriers" AS c 40 | LEFT JOIN "Orders" AS o ON c.id = o."courierId" 41 | WHERE o."inDelivery" = true 42 | GROUP BY c.login; 43 | 44 | # Работа запроса: 45 | # SELECT c.login, COUNT(o.id) AS "deliveryCount": Извлекает логин курьера и количество заказов, связанных с этим курьером. 46 | # FROM "Couriers" AS c: Работает с таблицей курьеров (сокращение AS c используется для удобства). 47 | # LEFT JOIN "Orders" AS o ON c.id = o."courierId": Соединяет таблицы Couriers и Orders по идентификатору курьера. 48 | # LEFT JOIN обеспечивает, что даже если у курьера нет заказов, он всё равно будет присутствовать в результате. 49 | # WHERE o."inDelivery" = true: Фильтрует заказы, которые находятся в статусе "в доставке" (inDelivery = true). 50 | # Это условие применяется только к заказам, которые соответствуют LEFT JOIN. 51 | # GROUP BY c.login: Группирует результаты по логинам курьеров, чтобы подсчитать количество доставляемых заказов для каждого из них. 52 | 53 | # Замечание: Если у курьера нет заказов, то с использованием текущего WHERE условие полностью исключит этого курьера из результата. 54 | # Чтобы отобразить курьеров с нулевым количеством заказов, условие o."inDelivery" = true лучше перенести в часть ON: 55 | 56 | SELECT c.login, COUNT(o.id) AS "deliveryCount" 57 | FROM "Couriers" AS c 58 | LEFT JOIN "Orders" AS o ON c.id = o."courierId" AND o."inDelivery" = true 59 | GROUP BY c.login; 60 | 61 | # Чтобы увидеть количеством их заказов в статусе «В доставке», нужно "Принять" заказ Курьерами. Захожу в 62 | # Android Studio и на эмуляторы принимаю 1 заказ первым курером и 2 заказа втормы курьером. 63 | # Заказов в 2 раза больше у каждого курьера чем мы приняли в работу так как есть БАГ, ранее его фиксировали. -------------------------------------------------------------------------------- /Task_2_SQL.md: -------------------------------------------------------------------------------- 1 | # Александр Самсонов, 24-я когорта — Финальный проект. Инженер по тестированию плюс 2 | 3 | ## Задание 2 4 | # Ты тестируешь статусы заказов. Нужно убедиться, что в базе данных они записываются корректно. 5 | # Для этого: выведи все трекеры заказов и их статусы. 6 | # Статусы определяются по следующему правилу: 7 | # Если поле finished == true, то вывести статус 2. 8 | # Если поле canсelled == true, то вывести статус -1. 9 | # Если поле inDelivery == true, то вывести статус 1. 10 | # Для остальных случаев вывести 0. 11 | 12 | # Технические примечания: 13 | # Доступ к базе осуществляется с помощью команды psql -U morty -d scooter_rent. Пароль: smith. 14 | # У psql есть особенность: если таблица в базе данных с большой буквы, то её в запросе нужно брать в кавычки. Например, select * from “Orders”. 15 | 16 | # Создал ещё 2 заказа в Postman чтобы вывести заказы со статусом 0. 17 | 18 | # 1.Выводимый столбец track: 19 | # Из таблицы "Orders" выбирается поле track, которое содержит идентификаторы или трекеры заказов. 20 | 21 | # 2.Логика определения статусов с помощью CASE: 22 | 23 | # CASE позволяет определить значение нового столбца status на основе условий: 24 | # Если finished = true, то выводится статус 2 (заказ завершён). 25 | # Если cancelled = true, то статус равен -1 (заказ отменён). 26 | # Если "inDelivery" = true, то статус становится 1 (заказ в доставке). 27 | # Для всех остальных случаев возвращается статус 0 (неопределённый или другой статус). 28 | 29 | # 3.Результирующий вывод: 30 | # Таблица, где для каждого track отображается его статус в зависимости от полей finished, cancelled и "inDelivery". 31 | 32 | SELECT 33 | track, 34 | CASE 35 | WHEN finished THEN 2 36 | WHEN cancelled THEN -1 37 | WHEN inDelivery THEN 1 38 | ELSE 0 39 | END AS status 40 | FROM "Orders"; 41 | 42 | # Булевы значения не требуют явного сравнения (= TRUE), так как проверяются напрямую. -------------------------------------------------------------------------------- /api_requests.py: -------------------------------------------------------------------------------- 1 | # Александр Самсонов, 24-я когорта — Финальный проект. Инженер по тестированию плюс 2 | 3 | # Импорт модуля requests для отправки HTTP-запросов 4 | import requests 5 | # Импорт конфигурационного файла, который содержит настройки URL 6 | import configuration 7 | # Импорт данных запроса из модуля data, в котором определены заголовки и тело запроса 8 | from data import order_body # Импортируем данные из data.py 9 | 10 | # Запрос на создание заказа. 11 | # Определение функции create_order для отправки POST-запроса на создание нового заказа 12 | def create_order(order_data): 13 | # Выполнение POST-запроса с использованием URL из конфигурационного файла, тела запроса и заголовков 14 | # URL_SERVICE и CREAT_ORDERS объединяются для формирования полного URL для запроса 15 | # json=body используется для отправки данных пользователя в формате JSON 16 | response = requests.post(configuration.URL_SERVICE + configuration.CREATE_ORDERS, 17 | json=order_data) 18 | return response 19 | 20 | # Выполняет запрос на получение заказа по трек-номеру. 21 | # Определение функции для отправки GET-запроса получение номера заказа. С параметром track_number. 22 | def get_order_by_track(track_number): 23 | get_order_url = f"{configuration.URL_SERVICE}{configuration.GET_ORDER_BY_TRACK}" 24 | # Вызов функции requests.get с телом запроса для создания нового заказа из модуля data 25 | response = requests.get(get_order_url, params={"t": track_number}) 26 | return response -------------------------------------------------------------------------------- /configuration.py: -------------------------------------------------------------------------------- 1 | # URL_SERVICE хранит базовый URL веб-сервиса, который используется для доступа к API или 2 | # другим ресурсам. 3 | # Значение должно быть скопировано из настроек или документации сервиса, 4 | # к которому предоставляется доступ. 5 | # Пример значения: "https://api.example.com" 6 | URL_SERVICE = "https://83711cae-65fc-436c-b566-5299fd524dc8.serverhub.praktikum-services.ru" 7 | 8 | # CREATE_ORDERS хранит путь к API-методу для создания нового заказа. 9 | # Этот путь будет использоваться для формирования полного URL-адреса в сочетании с базовым URL сервиса, 10 | # когда необходимо выполнить запрос на создание заказа. 11 | CREATE_ORDERS = "/api/v1/orders" 12 | 13 | # GET_ORDER_BY_TRACK хранит путь к API-методу для получения нового заказа. 14 | # Этот путь будет использоваться для формирования полного URL-адреса в сочетании с базовым URL сервиса, 15 | # когда необходимо выполнить запрос на получение заказа. 16 | GET_ORDER_BY_TRACK = "/orders/track" -------------------------------------------------------------------------------- /data.py: -------------------------------------------------------------------------------- 1 | # данные заказа для создания новой записи заказа в системе 2 | 3 | order_body = { 4 | "firstName": "Naruto", 5 | "lastName": "Uchiha", 6 | "address": "Konoha, 142 apt.", 7 | "metroStation": 4, 8 | "phone": "+7 800 355 35 35", 9 | "rentTime": 5, 10 | "deliveryDate": "2020-06-06", 11 | "comment": "Saske, come back to Konoha", 12 | "color": [ 13 | "BLACK" 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /tests/test_order.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import os 3 | sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) 4 | from api_requests import create_order, get_order_by_track 5 | 6 | from data import order_body 7 | 8 | def test_order_creation_and_tracking(): 9 | # Создание заказа 10 | create_response = create_order(order_body) # Используем import из data.py 11 | assert create_response.status_code == 201, "Не удалось создать заказ" 12 | 13 | # Сохранение трек-номера 14 | track_number = create_response.json().get("track") 15 | #print("Заказ создан. Номер трека:", track_number) 16 | assert track_number, "Трек-номер не получен" 17 | 18 | # Получение заказа по трек-номеру 19 | get_response = get_order_by_track(track_number) 20 | # Проверка статуса ответа 21 | assert get_response.status_code == 200, "Заказ не найден" 22 | #print("Тест успешно пройден. Код 200.") -------------------------------------------------------------------------------- /Александр Самсонов, 24-я когорта - дипломный проект.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ManMaxMotivation/Autotests_Python_and_SQL/f5c0c202eb7f14adb123c28a061e4c7ed1c339d6/Александр Самсонов, 24-я когорта - дипломный проект.docx -------------------------------------------------------------------------------- /Вторая часть_1 Задание_SQL запрос_1.1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ManMaxMotivation/Autotests_Python_and_SQL/f5c0c202eb7f14adb123c28a061e4c7ed1c339d6/Вторая часть_1 Задание_SQL запрос_1.1.jpg -------------------------------------------------------------------------------- /Вторая часть_1 Задание_SQL запрос_1.2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ManMaxMotivation/Autotests_Python_and_SQL/f5c0c202eb7f14adb123c28a061e4c7ed1c339d6/Вторая часть_1 Задание_SQL запрос_1.2.jpg -------------------------------------------------------------------------------- /Вторая часть_2 Задание_SQL запрос_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ManMaxMotivation/Autotests_Python_and_SQL/f5c0c202eb7f14adb123c28a061e4c7ed1c339d6/Вторая часть_2 Задание_SQL запрос_2.jpg -------------------------------------------------------------------------------- /Вторая часть_Автоматизация теста к API.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ManMaxMotivation/Autotests_Python_and_SQL/f5c0c202eb7f14adb123c28a061e4c7ed1c339d6/Вторая часть_Автоматизация теста к API.jpg -------------------------------------------------------------------------------- /Запуск теста в PyCharm.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ManMaxMotivation/Autotests_Python_and_SQL/f5c0c202eb7f14adb123c28a061e4c7ed1c339d6/Запуск теста в PyCharm.jpg --------------------------------------------------------------------------------