Эта статья была впервые опубликована на:Уокер ИИ
В процессе тестирования автоматизации интерфейсов есть не только одноинтерфейсные тесты, но и тесты сценариев.В результате возникает проблема передачи значений между интерфейсами.Давайте представим, как обрабатывать передачу значений интерфейса в рамках pytest.
Общие данные интерфейса можно разделить на предобработку и постобработку:
Предварительная обработка: некоторые фиксированные значения или вызовы фиксированных методов
Постобработка: требуется тело (параметр) и ответ (ответ) в первых нескольких запросах
1. Подготовка данных
Предварительная обработка:
Предварительная обработка отмечена и [] (разметка может быть изменена в соответствии с вашими потребностями)
Когда обычные совпадающие данные содержат эти два тега, прочитайте и вызовите метод в methlib.py или config.py, какое фиксированное значение или метод для вызова, вызовите в соответствии с параметрами, записанными в теге, и замените данные. Где используется для обозначения фиксированных значений, [] используется для обозначения фиксированных методов;
Постобработка:
Постобработка помечается символами &&, {}, ==, ## (маркеры можно менять по своему усмотрению)
Если обычные совпадающие данные содержат такие теги, прочитайте данные в requestmsg.txt, прочитайте, какую строку данных следует прочитать, оцените данные связанного столбца и замените данные. Где && используется для обозначения тела предыдущего шага, {} используется для обозначения ответа предыдущего шага, == используется для обозначения тела предыдущего шага, ## используется для обозначения ответа предыдущего шага. шаг;
Примечание: ① Данные параметров варианта использования на листе Excel должны быть записаны в виде словаря. ② Добавьте связанный столбец к данным таблицы, чтобы определить параметр или ответ числа запросов для чтения. ③ Для некоторых интерфейсов, которые необходимо зашифровать, добавьте столбец шифрования в данные таблицы, чтобы определить, зашифрованы ли параметры интерфейса.
2. Процесс тестирования
Предварительная обработка:
Прочитанные данные таблицы excel - это данные модуля. После обработки pytest данные нескольких интерфейсов (списки) в модуле будут переданы на один интерфейс. Это данные, полученные без какого-либо запроса, поэтому они размещены в отдельном обработка данных. Ниже приведен только процесс предварительной обработки;
Постобработка:
Данные, полученные через запрос или ответ предыдущих интерфейсов, поэтому они должны быть размещены перед запросом запроса, и каждый раз, когда отправляется запрос интерфейса, тело и ответ запроса должны быть записаны в запросе.Последний интерфейс использовал. Ниже приведен процесс только постобработки;
Ниже приведен процесс тестирования интерфейса после предварительной и последующей обработки.
3. Реализация кода
Реализация препроцессинга: Препроцессинг не имеет ничего общего с параметрами и ответами других запросов, поэтому может обрабатываться всем модулем.
def param_method(dic_param):
"""
固定值、取方法(不需要上一步的body和response)
:param dic_param: 必须是个字典(data里面的参数)
:return:
"""
temp_mobile_ = []
temp_email_ = []
temp_pid_ = []
for j in dic_param.keys():
value__ = dic_param[j]
_ = re.findall(r'\<(.*?)>', str(value__)) # 固定值
__ = re.findall(r'\[(.*?)]', str(value__)) # 取方法
if _: # 判断是否存在apk固定传值
dic_param[j] = param[f'{_[0]}']
if __:
if j == 'mobile' or 'phone' or 'phoneNum':
dic_param[j] = mobile()
temp_mobile_.append(dic_param[j])
if j == 'email':
dic_param[j] = email()
temp_email_.append(dic_param[j])
if j == 'pid':
dic_param[j] = pid()
temp_pid_.append(dic_param[j])
if j == 'app_order_id':
dic_param[j] = get_random_str(30)
return dic_param
Реализация постобработки:Постобработка связана с параметрами и ответами других запросов, поэтому ее необходимо обрабатывать перед каждым запросом.Ниже показан метод постобработки.Поскольку код слишком длинный,только часть поста - показана обработка кода.
def prev_body_res(dic_param, relevance=None):
'''
取上步body、取上步response,当relevance不为空时取上几步body、response
:param dic_param: 必须是字典格式
:return:
'''
request_file = r'./requestsmsg.txt'
for j in dic_param.keys():
value__ = dic_param[j]
___ = re.findall(r'\&(.*?)&', str(value__)) # 取上步body
____ = re.findall(r'\{(.*?)}', str(value__)) # 取上步response
_____ = re.findall(r'\#(.*?)#', str(value__)) # 取前几步的response
______ = re.findall(r'\=(.*?)=', str(value__)) # 取前几步的body
if ___:
request_res = readtxt(request_file)
request_body = request_res[1]
key = ___[0]
res_data = request_body[f'{key}']
dic_param[j] = str(res_data)
if ____:
request_response = readtxt(request_file)
request_response = request_response[0]
key = ____[0]
res_data = request_response['data']
if res_data:
if isinstance(res_data, list):
temp_value = get_dict_value(request_response['data'][0], key)
dic_param[j] = temp_value[0]
temp_value.clear()
else:
temp_value = request_response['data'][f'{key}']
dic_param[j] = str(temp_value)
Конкретное применение постобработки: Поскольку постобработка требует завершения предыдущего запроса для получения желаемых данных, конкретная постобработка помещается перед обработкой каждого запроса.Ниже показано применение конкретного запроса.
else: # 传值
line_data = prev_body_res(line_data, relevance_no)
if i['encryption'] == '0': # 不加密
if header['Content-Type'] == 'application/json':
response = requests.request(f'{request_type}', url=url, headers=header, data=json.dumps(line_data))
write_request(response.json(), no, line_data)
logger.info(f'response:{response.json()},no:{no},body:{line_data}')
Обработка значений модуля на основе pytest: в качестве примера возьмем модуль входа в почтовый ящик при подготовке данных: декоратор параметризации может отправлять данные всего модуля в методы, определенные ниже, один за другим.
@allure.story('邮箱登录')
@pytest.mark.qa
@pytest.mark.formal
@pytest.mark.parametrize('excel_data', change_data(module_data('邮箱登录'), len(module_data('邮箱登录'))))
def test_login_email(self, excel_data):
response = decide_value_relevance(excel_data)
judge_result(response, '邮箱登录')
title = excel_data['title']
allure.dynamic.title(f'邮箱登录:{title}')
4. Резюме
На основе pytest мы можем собрать сценарии, которые нам нужно протестировать, в виде модулей, а затем использовать передачу значений для создания нескольких различных нормальных и ненормальных сценариев для увеличения корреляции; использование таблиц для построения данных также увеличивает скрипт построения. ; на более позднем этапе еще много оптимизаций, и я надеюсь обсудить их с вами.
PS: Для получения дополнительной технической галантереи, пожалуйста, обратите внимание на [Публичный аккаунт | xingzhe_ai] и обсудите с ходоками!