Тестирование с помощью Python

Содержание
Введение
Документация
Подготовка рабочей среды
Учебный пример
Реальный пример 1
Фреймворки: Unittest, PyTest
Связанные статьи

Введение

Про выполнение запросов к API с помощью Python вы можете прочитать в статье «Тестирование API с помощью Python»

В этой статье Вы узнаете о том как можно тестировать ПО с помощью Python .

Я начну с подготовки рабочей среды, затем перейдём к простым заданиям, которые могут поручить начинающему тестировщику.

На следующем этапе рассмотрим библиотеку unittest и изучим немного теории.

Статья рассчитана на начинающих тестировщиков. Для лучшего понимания некоторых частей желательно базовое знание Python

Статья нуждается в переработке, так как этот питон устраивал меня в самом начале, но сейчас уже страшно смотреть на код.

Использование Python для тестирования ПО.

docs.python-requests

programcreek.com/python

Подготовка рабочей среды

Чтобы отправлять POST , GET и другие HTTP запросы с помощью python нужно в текст программы добавить строчку import requests. Request сперва нужно установить, для этого нужен pipenv, а для установки pipenv нужен pip

sudo apt install python-pip

Если нужно обновить pip

pip install --upgrade pip

Устанавливаем pipenv

pip install pipenv

Прежде чем устанавливать что-либо кроме pip убедитесь в том, что Вы знакомы с работой в виртуальном окружении .

Устанавливаем requests

pipenv install requests

Теперь наше python окружение готово к тестированию интерфейсов .

На вашем компьютере может быть установлено несколько версий Python. Чтобы узнать какую версию используют ваши программы перейдтие по ссылке

Примеры программ

Создаем файл post.py и пишем следующий код

import requests r = requests.post('http://url.html', data = {'site':'andreyolegovich.ru'})

Запускаем скрипт

python post.py

Реальный пример 1

Задача

Есть сервер, на котором отображаются подключённые устройства. Назовем его Менеджер_Устройств

Задача - заселить сервер новыми устройствами, количество - 1000 устройств.

Нужно, чтобы у каждого устройства был уникальный ID. Иначе получим ошибку.

Познакомившись с API этого сервера можно узнать, что запрос, которым добавляется новое устройство, выглядит следующим образом:

Метод: PUT

Endpoint: http://devm.com:4880/manager/rest/control/devices/Unique_ID/apps/Client_Name/status/$timestamp=Some_value

Также из API известно, что в этом запросе передаётся JSON

payload = { "status": { "clientStatusData": { "message": "Everything is OK", "status": "OK" }, "itemsStatuses": [{ "message": "URN.SU Server simulated", "status": "ENABLED", "name": "Connection", "Number": "0" }, { "message": "TopBicycle.RU Power: 250[mW], Session: 1", "status": "OK", "name": "AndreyOlegovih.ru", "Number": "1" }], "runningStatus": { "restarted": "true", "uptimeMSec": 10000 } }, "clientInfo": { "applicationInfo": { "applicationVersion": "19.61.04.12" }, "deviceInfo": { "itemDescription": "Good Device Number 1", "itemModelId": "Model ID 1", "statusUpdateIntervalMSec": "30000" } } }

По заданию: itemModelId, itemDescription и uptime нужно делать уникальными.

Таким образом уникальных величины должно быть четыре.

Можно, конечно, посылать запросы из SOAP UI по одному, вручную изменяя Unique_ID, но это будет очень долго.

Решение. Часть 1 - Комментарии

Пишем скрипт на Python, используя знания, полученные в начале этой статьи и в статье Python. Сначала импортируем нужные библиотеки.

Затем делим URL на три части: первая и третья остаются неизменными, а между ними мы будем вставлять переменую.

После этого запускаем цикл от 1 до 1000. Значения переменной i мы будем использовать для создания уникальных ID. С этой целью создадим три переменные: для наглядности они все будут заканчиваться на _var а затем я выделю их зелёным цветом.

И, наконец, создаём переменную json_string, в которую запишем нужный нам JSON с небольшими изменениями. Вместо статичных itemModelId, itemDescription, uptime вставляем переменные заданные на предыдущем шаге.

Внимательно следим за отступами, т.к. отступ обозначает тело цикла.

Решение. Часть 2 - Код

import requests import json import urllib2 import uuid headers = {"Content-Type": "application/json"} base_url = 'http://device_manager.com:4880/manager/rest/control/devices/' end_url = '/apps/Client_Name/status/$timestamp=1529086249' for i in range(1,1000): c = str(i) item_model_var = "AASuperDevice" + c item_description_var = "Andrei" + c uptime_var = i * 50 Unique_ID_var = "Unique_ID" + c url = base_url+str(Unique_ID_var) + end_url json_string = {"status": {"clientStatusData": {"message":"Everything is OK", "status":"OK" }, "itemsStatuses": [{ "message":"URN.SU Server simulated", "status":"ENABLED", "name":"Connection", "Number":"0" }, { "message":"TopBicycle.RU Power: 250[mW], Session: 1", "status":"OK", "name":"AndreyOlegovih.ru", "Number":"1" }], "runningStatus": { "restarted":"true", "uptimeMSec":uptime_var} }, "clientInfo": { "applicationInfo":{"applicationVersion":"19.61.04.12" }, "deviceInfo": {"itemDescription": item_description_var, "itemModelId":item_model_var, "statusUpdateIntervalMSec":"30000" } }, } data_json=json.dumps(json_string) r=requests.put(url, data=data_json, headers=headers)

Debugging

Если что-то пошло не так можно попробовать простейший способ отследить в какой момент появляется ошибка - добавить в конец кода

print("i =", i) print("i string=", c) print(item_model_var) print(u) print(uptime_var) print(r.text)

Но имейте в виду, что в серьёзном софте лучше делать отладку дебаггером.

Фреймворки
unittest
Теория unittest
pytest