From 0a881116a3278844e17ea60f4e58f7e0ea7d7b1e Mon Sep 17 00:00:00 2001 From: floraachy <1622042529@qq.com> Date: Tue, 15 Aug 2023 14:22:37 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=94=A8=E4=BE=8B=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E7=94=B1=E5=AD=97=E5=85=B8=E6=94=B9=E4=B8=BA=E5=88=97?= =?UTF-8?q?=E8=A1=A8=EF=BC=8C=E5=B9=B6=E5=A2=9E=E5=8A=A0=E7=94=A8=E4=BE=8B?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E5=BF=85=E5=A1=AB=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 7 +- case_utils/case_data_analysis.py | 85 ++++++++++-------- case_utils/case_fun_handle.py | 3 +- config/models.py | 4 +- config/settings.py | 2 +- .../glcc/test_get_apply_information.yml | 9 +- data/gitlink/login_demo.yaml | 14 +-- data/gitlink/test_gitlink_demo.xlsx | Bin 11856 -> 11688 bytes data/gitlink/test_new_project_demo.yaml | 21 ++--- data/gitlink/test_upload_files.yaml | 9 +- data/test_demo.yaml | 5 +- test_case/test_manual_case/test_login_demo.py | 5 +- 12 files changed, 90 insertions(+), 74 deletions(-) diff --git a/README.md b/README.md index 7fa9307..b450b80 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ ## 一、框架介绍 -本框架主要是基于 Python + pytest + Allure + loguru + 邮件通知/企业微信通知/钉钉通知 实现的接口自动化框架。 +本框架主要是基于 Python + Pytest + Allure + Loguru + 邮件通知/企业微信通知/钉钉通知 实现的接口自动化框架。 * git地址: [https://www.gitlink.org.cn/floraachy/apiautotest](https://www.gitlink.org.cn/floraachy/apiautotest) * 项目参与者: floraachy @@ -193,8 +193,9 @@ case_common :公共参数 allure_feature:用作于@allure.feature()装饰器中的内容。 allure_story:用作于@allure.story()装饰器中的内容。 case_markers: 给测试方法添加标记,支持自定义标记,skip, usefixtures。 格式是列表嵌套字符串或者字典。例如: # ['glcc', {'skip': '跳过执行该用例'}] -case_001:用例ID - feature:用例所属模块, 类似于@allure.feature()。 +case_info: 具体的用例数据,是以列表的形式进行管理 +- + id:用例id title:用例标题 run:是否执行用例,为空或者True都会执行,为False则不执行。 url:请求路径(可填写全路径 或者 资源路径)。通常我们填写资源路径。在用例执行前,会针对路径进行处理。具体可见case_utils.request_data_handle.py.RequestPreDataHandle.url_handle。注:请求路径=基准路径(host/base_url)+资源路径(url)。 diff --git a/case_utils/case_data_analysis.py b/case_utils/case_data_analysis.py index 19acaaf..16100f2 100644 --- a/case_utils/case_data_analysis.py +++ b/case_utils/case_data_analysis.py @@ -22,7 +22,9 @@ class CaseDataCheck: @property def get_method(self) -> Text: - + """ + 处理method参数:校验method参数是否是指定枚举值中的一个 + """ return self.check_params_right( Method, self.case_data.get(TestCaseEnum.METHOD.value[0]) @@ -30,6 +32,9 @@ class CaseDataCheck: @property def get_severity(self) -> Text: + """ + 处理severity参数:如果Severity为空或者不传或者传错,视为NORMAL + """ # 如果Severity为空或者不传或者传错,视为NORMAL attr = self.case_data.get(TestCaseEnum.SEVERITY.value[0]) if attr is None or attr.upper() not in Severity._member_names_: @@ -39,14 +44,20 @@ class CaseDataCheck: @property def get_request_type(self): + """ + 处理request_type参数:校验request_type参数是否是指定枚举值中的一个 + """ return self.check_params_right( RequestType, self.case_data.get(TestCaseEnum.REQUEST_TYPE.value[0]) ) def check_case_data_attr(self, attr: Text): + """ + 检查用例中是否缺失某个参数 + """ assert attr in self.case_data.keys(), ( - f"用例ID为 {self.case_id} 的用例中缺少 {attr} 参数,请确认用例内容是否编写规范." + f"用例ID: {self.case_id} --> 缺少 {attr} 参数,请确认用例内容是否编写规范." ) def check_params_exit(self): @@ -54,57 +65,59 @@ class CaseDataCheck: 遍历一个枚举类中所有成员,并检查与每个成员对应的实例属性是否存在。 如果属性存在,则什么也不做,如果不存在,则抛出异常或执行其他操作 """ - for enum in list(TestCaseEnum._value2member_map_.keys()): + print(f"打印:{list(TestCaseEnum._value2member_map_)}") + for enum in list(TestCaseEnum._value2member_map_): if enum[1]: self.check_case_data_attr(enum[0]) + def check_required_fields(self): + for field in TestCaseEnum: + if field.value[1]: # 判断是否为必填参数 + field_name = field.value[0] + value = self.case_data[field_name] + if value is None or (isinstance(value, str) and len(value.strip()) == 0): + raise ValueError(f"用例ID: {self.case_id} --> {field_name}字段的值是:{value}, 该字段值是必填,请检查是否填写正确.") + def check_params_right(self, enum_name, attr): """ 检查参数值是否正确,符合要求规范 """ _member_names_ = enum_name._member_names_ assert attr.upper() in _member_names_, ( - f"用例ID为 {self.case_id} 的用例中 {enum_name}: {attr} 填写不正确," + f"用例ID: {self.case_id} --> {enum_name}: {attr} 填写不正确," f"当前框架中只支持 {_member_names_} 类型." f"如有疑问,请联系管理员." ) return attr.upper() - @property - def get_assert_response(self): - _assert_data = self.case_data.get(TestCaseEnum.ASSERT_RESPONSE.value[0]) - assert _assert_data is not None, ( - f"用例ID 为 {self.case_id} 未添加断言" - ) - return _assert_data - def case_process(self, cases): case_list = [] for key, values in cases.items(): # 公共配置中的数据,与用例数据不同,需要单独处理 - if key != 'case_common': - # 检查用例数据,去除用例数据中的空格 - for k, v in values.items(): - values[k] = v.strip() if isinstance(v, str) else v - self.case_data = values - self.case_id = key - self.check_params_exit() - case_data = { - 'feature': self.case_data.get(TestCaseEnum.FEATURE.value[0]), - 'title': self.case_data.get(TestCaseEnum.TITLE.value[0]), - 'severity': self.get_severity, - 'url': self.case_data.get(TestCaseEnum.URL.value[0]), - 'run': self.case_data.get(TestCaseEnum.RUN.value[0]), - 'method': self.get_method, - 'headers': self.case_data.get(TestCaseEnum.HEADERS.value[0]), - 'cookies': self.case_data.get(TestCaseEnum.COOKIES.value[0]), - 'request_type': self.get_request_type, - 'payload': self.case_data.get(TestCaseEnum.PAYLOAD.value[0]), - 'files': self.case_data.get(TestCaseEnum.FILES.value[0]), - 'extract': self.case_data.get(TestCaseEnum.EXTRACT.value[0]), - "assert_response": self.get_assert_response, - "assert_sql": self.case_data.get(TestCaseEnum.ASSERT_SQL.value[0]), - } - case_list.append(TestCase(**case_data).dict()) + if key == 'case_info': + for value in values: + self.case_data = value + self.case_id = value.get("id") + # 检查用例参数,需要必填的是否有值 + self.check_required_fields() + # 检查用例参数值,是否都填写正确 + self.check_params_exit() + case_data = { + 'id': self.case_data.get(TestCaseEnum.ID.value[0]), + 'title': self.case_data.get(TestCaseEnum.TITLE.value[0]), + 'severity': self.get_severity, + 'url': self.case_data.get(TestCaseEnum.URL.value[0]), + 'run': self.case_data.get(TestCaseEnum.RUN.value[0]), + 'method': self.get_method, + 'headers': self.case_data.get(TestCaseEnum.HEADERS.value[0]), + 'cookies': self.case_data.get(TestCaseEnum.COOKIES.value[0]), + 'request_type': self.get_request_type, + 'payload': self.case_data.get(TestCaseEnum.PAYLOAD.value[0]), + 'files': self.case_data.get(TestCaseEnum.FILES.value[0]), + 'extract': self.case_data.get(TestCaseEnum.EXTRACT.value[0]), + "assert_response": self.case_data.get(TestCaseEnum.ASSERT_RESPONSE.value[0]), + "assert_sql": self.case_data.get(TestCaseEnum.ASSERT_SQL.value[0]), + } + case_list.append(case_data) return case_list diff --git a/case_utils/case_fun_handle.py b/case_utils/case_fun_handle.py index 4a3747f..ca01fb5 100644 --- a/case_utils/case_fun_handle.py +++ b/case_utils/case_fun_handle.py @@ -57,8 +57,7 @@ def handle_excel_data(file): "allure_story": v["sheet_name"] } # 处理excel用例数据 - for case in v["data"]: - excel_case[case["id"]] = case + excel_case["case_info"] = v["data"] # 检查用例数据是否符合规范 tested_case = CaseDataCheck().case_process(excel_case) # 生成测试方法 diff --git a/config/models.py b/config/models.py index ad64d73..a3e4a5b 100644 --- a/config/models.py +++ b/config/models.py @@ -76,7 +76,7 @@ class TestCaseEnum(Enum): """ 测试用例中字段 """ - FEATURE = ("feature", False) + ID = ("id", True) TITLE = ("title", True) URL = ("url", True) SEVERITY = ("severity", False) @@ -96,7 +96,7 @@ class TestCase(BaseModel): """ 测试用例各数据格式要求 """ - feature: Union[None, Text] = None + id: Union[None, Text] title: Text severity: Text url: Text diff --git a/config/settings.py b/config/settings.py index 7a903b2..c53c22f 100644 --- a/config/settings.py +++ b/config/settings.py @@ -8,7 +8,7 @@ # ------------------------------------ 配置信息 ----------------------------------------------------# # 0代表执行Excel和yaml两种格式的用例, 1 代表 yaml文件,2 用例代表Excel用例, 其他数值将不自动生成用例,仅能执行手动编写的用例 -CASE_FILE_TYPE = 1 +CASE_FILE_TYPE = 0 # 0表示默认不发送任何通知, 1代表钉钉通知,2代表企业微信通知, 3代表邮件通知, 4代表所有途径都发送通知 SEND_RESULT_TYPE = 0 diff --git a/data/gitlink/glcc/test_get_apply_information.yml b/data/gitlink/glcc/test_get_apply_information.yml index eaa998b..dd83f56 100644 --- a/data/gitlink/glcc/test_get_apply_information.yml +++ b/data/gitlink/glcc/test_get_apply_information.yml @@ -7,8 +7,9 @@ case_common: - get_project - skip: 跳过执行该用例 -case_glcc_demo_01: - feature: GLCC +case_info: +- + id: case_glcc_demo_01 title: 获取已报名成功的项目数据 severity: normal run: True @@ -26,8 +27,8 @@ case_glcc_demo_01: $.message: success assert_sql: -case_glcc_demo_02: - feature: GLCC +- + id: case_glcc_demo_02 title: 获取已报名成功的课题数据 severity: normal run: True diff --git a/data/gitlink/login_demo.yaml b/data/gitlink/login_demo.yaml index 1cbb735..cd00900 100644 --- a/data/gitlink/login_demo.yaml +++ b/data/gitlink/login_demo.yaml @@ -9,8 +9,9 @@ case_common: - skip: 跳过执行该用例 # 用例数据 -case_login_demo_01: - feature: 登录 +case_info: +- + id: case_login_01 title: 用户名密码正确,登录成功(不校验数据库) run: True severity: normal @@ -39,8 +40,8 @@ case_login_demo_01: $.user_id: 85390 assert_sql: -case_login_demo_02: - feature: 登录 +- + id: case_login_02 title: 用户名密码正确,登录成功(校验数据库) run: False severity: minor @@ -71,8 +72,9 @@ case_login_demo_02: eq: sql: select count(*) from tokens where user_id=${user_id}; len: 1 -case_login_demo_03: - feature: 登录 + +- + id: case_login_03 title: 用户名正确,密码错误,登录失败 severity: critical run: False diff --git a/data/gitlink/test_gitlink_demo.xlsx b/data/gitlink/test_gitlink_demo.xlsx index 1ce5296e12160f6e13e7529551ac97ef418a171a..3ce608f1901846953e1dad658b6a52b8f8c06f9a 100644 GIT binary patch delta 7280 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 G2mU_`>5g*% delta 7427 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 diff --git a/data/gitlink/test_new_project_demo.yaml b/data/gitlink/test_new_project_demo.yaml index 0a6c953..c03bcef 100644 --- a/data/gitlink/test_new_project_demo.yaml +++ b/data/gitlink/test_new_project_demo.yaml @@ -9,8 +9,9 @@ case_common: - usefixtures: login_init # 用例数据 -case_new_project_demo_01: - feature: 新建项目 +case_info: +- + id: case_new_project_01 title: 正确输入各项必填参数,新建项目成功(不校验数据库, header里面传cookies) severity: critical run: True @@ -36,8 +37,8 @@ case_new_project_demo_01: $.login: ${login} assert_sql: -case_new_project_demo_02: - feature: 新建项目 +- + id: case_new_project_02 title: 正确输入各项必填参数,新建项目成功(不校验数据库,单独传cookies) run: True url: /api/projects.json @@ -61,8 +62,8 @@ case_new_project_demo_02: $.login: ${login} assert_sql: -case_new_project_demo_03: - feature: 新建项目 +- + id: case_new_project_03 title: 正确输入各项必填参数,新建项目成功(校验数据库) severity: normal run: False @@ -91,8 +92,8 @@ case_new_project_demo_03: $.name: ${project_name} $.identifier: ${project_identifier} -case_new_project_demo_04: - feature: 新建项目 +- + id: case_new_project_04 title: 正确输入各项必填参数,新建项目成功(04) severity: normal run: False @@ -117,8 +118,8 @@ case_new_project_demo_04: $.login: ${login} assert_sql: -case_new_project_demo_05: - feature: 新建项目 +- + id: case_new_project_05 title: 正确输入各项必填参数,新建项目成功(05) severity: normal run: False diff --git a/data/gitlink/test_upload_files.yaml b/data/gitlink/test_upload_files.yaml index e766f87..3c5d343 100644 --- a/data/gitlink/test_upload_files.yaml +++ b/data/gitlink/test_upload_files.yaml @@ -9,8 +9,9 @@ case_common: - skip: 跳过该用例 # 用例数据 -case_upload_demo_01: - feature: 上传文件 +case_info: +- + id: case_upload_file_01 title: 测试单文件上传 severity: run: False @@ -30,8 +31,8 @@ case_upload_demo_01: http_code: 200 assert_sql: -case_upload_demo_02: - feature: 上传文件 +- + id: case_upload_file_02 title: 测试多文件上传(该接口不支持多文件上传,这是一个示例) severity: normal run: False diff --git a/data/test_demo.yaml b/data/test_demo.yaml index 642696f..8a8be21 100644 --- a/data/test_demo.yaml +++ b/data/test_demo.yaml @@ -6,8 +6,9 @@ case_common: case_markers: # 用例数据 -case_demo_01: - feature: debug +case_info: +- + id: case_demo_01 title: 这是一条用于调试功能的用例 run: True severity: normal diff --git a/test_case/test_manual_case/test_login_demo.py b/test_case/test_manual_case/test_login_demo.py index a9b1557..ee7a50f 100644 --- a/test_case/test_manual_case/test_login_demo.py +++ b/test_case/test_manual_case/test_login_demo.py @@ -24,10 +24,7 @@ from case_utils.allure_handle import allure_title # 读取用例数据 yaml_data = YamlHandle(filename=os.path.join(DATA_DIR, "gitlink", "login_demo.yaml")).read_yaml case_common = yaml_data["case_common"] -cases = [] -for k, v in yaml_data.items(): - if k != "case_common": - cases.append(v) +cases = yaml_data["case_info"] @allure.epic(case_common["allure_epic"])