Интерфейс автоматической обработки передачи значений

Python

Эта статья была впервые опубликована на:Уокер ИИ

В процессе тестирования автоматизации интерфейсов есть не только одноинтерфейсные тесты, но и тесты сценариев.В результате возникает проблема передачи значений между интерфейсами.Давайте представим, как обрабатывать передачу значений интерфейса в рамках pytest.

Общие данные интерфейса можно разделить на предобработку и постобработку:

Предварительная обработка: некоторые фиксированные значения или вызовы фиксированных методов

Постобработка: требуется тело (параметр) и ответ (ответ) в первых нескольких запросах

1. Подготовка данных

Предварительная обработка:

Предварительная обработка отмечена и [] (разметка может быть изменена в соответствии с вашими потребностями)

Когда обычные совпадающие данные содержат эти два тега, прочитайте и вызовите метод в methlib.py или config.py, какое фиксированное значение или метод для вызова, вызовите в соответствии с параметрами, записанными в теге, и замените данные. Где используется для обозначения фиксированных значений, [] используется для обозначения фиксированных методов;

前置处理_excel

Постобработка:

Постобработка помечается символами &&, {}, ==, ## (маркеры можно менять по своему усмотрению)

Если обычные совпадающие данные содержат такие теги, прочитайте данные в requestmsg.txt, прочитайте, какую строку данных следует прочитать, оцените данные связанного столбца и замените данные. Где && используется для обозначения тела предыдущего шага, {} используется для обозначения ответа предыдущего шага, == используется для обозначения тела предыдущего шага, ## используется для обозначения ответа предыдущего шага. шаг;

后置处理_excel

Примечание: ① Данные параметров варианта использования на листе 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] и обсудите с ходоками!