From f0bd0e262d50b080aab91025e3e2d0eb36ba0168 Mon Sep 17 00:00:00 2001 From: floraachy <1622042529@qq.com> Date: Tue, 14 Nov 2023 14:13:20 +0800 Subject: [PATCH] =?UTF-8?q?data=5Fhanle=E4=B8=AD=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=AF=B9RequestsCookieJar=E7=9A=84=E5=A4=84=E7=90=86=EF=BC=8C?= =?UTF-8?q?=E9=81=BF=E5=85=8Dsource=E9=87=8C=E9=9D=A2=E5=AD=98=E5=9C=A8Req?= =?UTF-8?q?uestsCookieJar=EF=BC=8C=20=E5=A4=84=E7=90=86=E5=AE=8C=E6=88=90?= =?UTF-8?q?=E5=90=8E=EF=BC=8C=E6=95=B0=E6=8D=AE=E6=A0=BC=E5=BC=8F=E4=B8=8D?= =?UTF-8?q?=E6=AD=A3=E7=A1=AE=E7=9A=84=E9=97=AE=E9=A2=98.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- case_utils/requests_utils/data_handle.py | 94 +++++++++++++++++-- .../requests_utils/request_data_handle.py | 3 - test_case/conftest.py | 8 +- 3 files changed, 90 insertions(+), 15 deletions(-) diff --git a/case_utils/requests_utils/data_handle.py b/case_utils/requests_utils/data_handle.py index a4d7d34..523977d 100644 --- a/case_utils/requests_utils/data_handle.py +++ b/case_utils/requests_utils/data_handle.py @@ -7,16 +7,21 @@ # 标准库导入 import random +import json import re, uuid from datetime import datetime, date, timedelta # 第三方库导入 +from loguru import logger from faker import Faker from string import Template +from requests.cookies import RequestsCookieJar +from requests.utils import dict_from_cookiejar class FakerData: """ 测试数据生成类 + 官方文档:https://faker.readthedocs.io/en/master/index.html """ def __init__(self): @@ -85,7 +90,7 @@ class FakerData: def generate_name(self, lan="en") -> str: """ - + 生成人名 :return: 人名 """ if lan == "zh": @@ -94,6 +99,66 @@ class FakerData: name = self.faker.name() return name + def generate_company_name(self, lan: str = "en", fix: str = None) -> str: + """ + 生成公司名 + :param lan: 语言类型,可选:en, zh; zh表示中文,en表示英文,默认是en + :param fix: 前后缀,可选pre, suf; pre表示公司前缀,suf标识公司后缀 + :return: 公司名 + """ + if lan == "zh": + if fix == "pre": + name = self.fk_zh.company_prefix() + elif fix == "suf": + name = self.fk_zh.company_suffix() + else: + name = self.fk_zh.company() + else: + if fix == "pre": + name = self.faker.company_prefix() + elif fix == "suf": + name = self.faker.company_suffix() + else: + name = self.faker.company() + + return name + + def generate_paragraph(self, lan: str = "en", nb: int = 3) -> str: + """ + 生成段落 + :param lan: 语言类型,可选:en, zh; zh表示中文,en表示英文,默认是en + :param nb: 段落个数,默认是3个 + """ + if lan == "zh": + text = self.fk_zh.paragraph(nb_sentences=nb, variable_nb_sentences=True, ext_word_list=None) + else: + text = self.faker.paragraph(nb_sentences=nb, variable_nb_sentences=True, ext_word_list=None) + + return text + + def generate_words(self, lan: str = "en", nb: int = 1) -> str: + + """ + 生成词语 + :param lan: 语言类型,可选:en, zh; zh表示中文,en表示英文,默认是en + :param nb: 词语个数,默认是1个 + """ + if lan == "zh": + if nb == 1 or nb < 1: + text = self.fk_zh.word(ext_word_list=None) + else: + res = self.fk_zh.words(nb=nb, ext_word_list=None) + text = "-".join(res) + + else: + if nb == 1 or nb < 1: + text = self.faker.word(ext_word_list=None) + else: + res = self.faker.words(nb=nb, ext_word_list=None) + text = "-".join(res) + + return text + def generate_email(self, lan="en") -> str: """ @@ -184,6 +249,21 @@ class DataHandle: except Exception: return data + def process_cookie_jar(self, data): + """ + 将任意数据里的RequestsCookieJar,转成dict,再转换成JSON 格式的字符串(序列化) + :param data: 待处理的数据 + """ + if isinstance(data, dict): + for key, value in data.items(): + data[key] = self.process_cookie_jar(value) + elif isinstance(data, list): + for i, item in enumerate(data): + data[i] = self.process_cookie_jar(item) + elif isinstance(data, RequestsCookieJar): + data = json.dumps(dict_from_cookiejar(data)) + return data + def replace_and_store_placeholders(self, pattern, text): """ 提取字符串中符合正则表达式的元素,同时用一个唯一的uuid来替换原有字符串 @@ -213,8 +293,13 @@ class DataHandle: func = {} keys = {} if not source or not isinstance(source, dict): - # print("source为空或者source不是字典格式,都将认为是:{}") + logger.debug("source为空或者source不是字典格式,都将认为是:{}") source = {} + + # 处理一下source,检测到里面存在RequestsCookieJar,转成dict,再转换成JSON 格式的字符串(序列化)。 + # 避免传递过来一个RequestsCookieJar,替换后变成了'RequestsCookieJar',导致cookies无法使用的问题 + source = self.process_cookie_jar(data=source) + # 如果进来的是字符串,先将各种类型的表达式处理完 if isinstance(obj, str): # 先把python表达式找出来存着,这里会漏掉一些诸如1+1的表达式 @@ -275,15 +360,12 @@ class DataHandle: else: # 不是FakerData类方法,但有可能是 1+1 这样的 obj = obj.replace(key, str(eval(func))) except: - print("Warn: --------函数:%s 无法调用成功, 请检查是否存在该函数-------" % func) + logger.warning("Warn: --------函数:%s 无法调用成功, 请检查是否存在该函数-------" % func) obj = obj.replace(key, funcs[0]) - pass return obj - - # 声明data_handle方法,这样外部就可以直接import data_handle来使用了 data_handle = DataHandle().data_handle diff --git a/case_utils/requests_utils/request_data_handle.py b/case_utils/requests_utils/request_data_handle.py index 1cda066..3b12b97 100644 --- a/case_utils/requests_utils/request_data_handle.py +++ b/case_utils/requests_utils/request_data_handle.py @@ -116,14 +116,12 @@ class RequestPreDataHandle: # 从用例数据中获取cookies, 处理cookies if cookies: - logger.debug(f"打印一下全局变量的值:{GLOBAL_VARS}") # 通过全局变量替换cookies,得到的是一个str类型 cookies = data_handle(obj=cookies, source=GLOBAL_VARS) try: cookies = json.loads(cookies) except Exception as e: cookies = cookies - logger.debug(f"处理{cookies}报错了:{e}") if isinstance(cookies, dict) or isinstance(cookies, http.cookiejar.CookieJar): self.request_data["cookies"] = cookies else: @@ -168,7 +166,6 @@ class RequestPreDataHandle: if files: # 将文件处理成绝对路径 self.request_data["files"] = os.path.join(FILES_DIR, files) - logger.debug(f"处理完成后的files:{self.request_data['files']}") def assert_handle(self): # 处理响应断言参数 diff --git a/test_case/conftest.py b/test_case/conftest.py index 74f36a1..1b0807e 100644 --- a/test_case/conftest.py +++ b/test_case/conftest.py @@ -6,10 +6,8 @@ # @Desc: # 标准库导入 -import json # 第三方库导入 import pytest -import requests import allure from loguru import logger # 本地应用/模块导入 @@ -72,13 +70,11 @@ def login_init(): try: res = BaseRequest.send_request(req_data=req_data) res.raise_for_status() - # 将cookies转成字典,再转成字符串 - cookies = json.dumps(requests.utils.dict_from_cookiejar(res.cookies)) - GLOBAL_VARS["login_cookie"] = cookies + logger.debug(f"获取用户:{login}登录的cookies成功:{type(res.cookies)} || {res.cookies}") + GLOBAL_VARS["login_cookie"] = res.cookies GLOBAL_VARS["login"] = res.json()["login"] GLOBAL_VARS["nickname"] = res.json()["username"] GLOBAL_VARS["user_id"] = res.json()["user_id"] - logger.debug(f"获取用户:{login}登录的cookies成功:{type(cookies)} || {cookies}") except Exception as e: GLOBAL_VARS["login_cookie"] = None logger.error(f"获取用户:{login}登录的cookies失败:{e}")