From fd92879ff1c6592d346c4c11309f6bae9a18c939 Mon Sep 17 00:00:00 2001 From: ieemoo Date: Mon, 11 Nov 2024 17:16:31 +0800 Subject: [PATCH] Arthur-Wu commit --- .gitignore | 18 +++ MAIN_YM.py | 20 +++ README.md | 35 +++++ YiMao/__init__.py | 5 + YiMao/bsifunc/readme.txt | 1 - YiMao/config/ApiInfo.py | 59 +++++++ YiMao/config/__init__.py | 5 + YiMao/config/cfg.yaml | 1 - YiMao/conftest.py | 21 +++ YiMao/data/YMHT_ApiTestCase_0.0.1.xlsx | Bin 0 -> 71490 bytes YiMao/data/YMHT_ApiTestCase_0.02.xlsx | Bin 0 -> 72995 bytes YiMao/data/apitestcase.txt | 1 - YiMao/debugLib/__init__.py | 0 YiMao/debugLib/demo1024.py | 0 YiMao/report/readme.txt | 1 - YiMao/scripts/__init__.py | 5 + YiMao/scripts/readme.txt | 1 - .../scripts/test_01MarketSystemParameters.py | 61 ++++++++ YiMao/scripts/test_02StoreMangementModule.py | 145 ++++++++++++++++++ .../test_03SampleDistributionActivity.py | 110 +++++++++++++ YiMao/scripts/test_04LotteryDraw.py | 112 ++++++++++++++ YiMao/scripts/test_05CouponPromotion.py | 126 +++++++++++++++ YiMao/scripts/test_06ADManagement.py | 112 ++++++++++++++ YiMao/scripts/test_07VersionManagement.py | 100 ++++++++++++ YiMao/scripts/test_08UpgradeTask.py | 106 +++++++++++++ commons/AssertLib.py | 45 ++++++ commons/Common.py | 25 ++- commons/EngineX.py | 107 +++++++++++++ commons/FileHandler.py | 65 ++++++++ commons/Logger.py | 32 ++++ commons/PgSqlLib.py | 97 ++++++++++++ commons/SignatureYM.py | 32 ++++ configs/Configs.yaml | 8 + configs/globalObj.py | 8 + configs/globalParams.py | 36 +++++ pytest.ini | 13 ++ 36 files changed, 1505 insertions(+), 8 deletions(-) create mode 100644 .gitignore create mode 100644 MAIN_YM.py create mode 100644 README.md create mode 100644 YiMao/__init__.py delete mode 100644 YiMao/bsifunc/readme.txt create mode 100644 YiMao/config/ApiInfo.py create mode 100644 YiMao/config/__init__.py delete mode 100644 YiMao/config/cfg.yaml create mode 100644 YiMao/conftest.py create mode 100644 YiMao/data/YMHT_ApiTestCase_0.0.1.xlsx create mode 100644 YiMao/data/YMHT_ApiTestCase_0.02.xlsx delete mode 100644 YiMao/data/apitestcase.txt create mode 100644 YiMao/debugLib/__init__.py create mode 100644 YiMao/debugLib/demo1024.py delete mode 100644 YiMao/report/readme.txt create mode 100644 YiMao/scripts/__init__.py delete mode 100644 YiMao/scripts/readme.txt create mode 100644 YiMao/scripts/test_01MarketSystemParameters.py create mode 100644 YiMao/scripts/test_02StoreMangementModule.py create mode 100644 YiMao/scripts/test_03SampleDistributionActivity.py create mode 100644 YiMao/scripts/test_04LotteryDraw.py create mode 100644 YiMao/scripts/test_05CouponPromotion.py create mode 100644 YiMao/scripts/test_06ADManagement.py create mode 100644 YiMao/scripts/test_07VersionManagement.py create mode 100644 YiMao/scripts/test_08UpgradeTask.py create mode 100644 commons/AssertLib.py create mode 100644 commons/EngineX.py create mode 100644 commons/FileHandler.py create mode 100644 commons/Logger.py create mode 100644 commons/PgSqlLib.py create mode 100644 commons/SignatureYM.py create mode 100644 configs/Configs.yaml create mode 100644 configs/globalObj.py create mode 100644 configs/globalParams.py create mode 100644 pytest.ini diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5d947ca --- /dev/null +++ b/.gitignore @@ -0,0 +1,18 @@ +# Build and Release Folders +bin-debug/ +bin-release/ +[Oo]bj/ +[Bb]in/ + +# Other files and folders +.settings/ + +# Executables +*.swf +*.air +*.ipa +*.apk + +# Project files, i.e. `.project`, `.actionScriptProperties` and `.flexProperties` +# should NOT be excluded as they contain compiler settings and other important +# information for Eclipse / Flash Builder. diff --git a/MAIN_YM.py b/MAIN_YM.py new file mode 100644 index 0000000..a7b79cf --- /dev/null +++ b/MAIN_YM.py @@ -0,0 +1,20 @@ +# !/usr/bin/python +# -*- coding: utf-8 -*- +# This is a sample Python script. + +# Press Shift+F10 to execute it or replace it with your code. +# Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings. + +def print_hi(name): + from commons.EngineX import Engine, NotificationModule + # Use a breakpoint in the code line below to debug your script. + print(f'--- Hi, {name} ---\n') # Press Ctrl+F8 to toggle the breakpoint. + print(f"=== Start of Test Suite ===") + return_list = Engine().run_test_suite() + NotificationModule().send_msg(return_list) + print(f"=== End of Test Suite ===") + + +# Press the green button in the gutter to run the script. +if __name__ == '__main__': + print_hi("YiMao Autotest") \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..9ad7a13 --- /dev/null +++ b/README.md @@ -0,0 +1,35 @@ +# YiMaoAutotest + +#### 介绍 +亿猫自动化仓库(创建于20241008) + +#### 软件架构 +软件架构说明 +1. 项目概况 +后台接口自动化工程 + + +#### 安装教程 +1. xxxx +2. xxxx +3. xxxx + +#### 使用说明 +1. xxxx +2. xxxx +3. xxxx + +#### 参与贡献 +1. Fork 本仓库 +2. 新建 Feat_xxx 分支 +3. 提交代码 +4. 新建 Pull Request + + +#### 特技 +1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md +2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) +3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 +4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 +5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) +6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/YiMao/__init__.py b/YiMao/__init__.py new file mode 100644 index 0000000..a955bd7 --- /dev/null +++ b/YiMao/__init__.py @@ -0,0 +1,5 @@ +# !/usr/bin/python +# -*- coding: utf-8 -*- +# @Author:: Arthur Wu +# @Date:: 2024/5/21-15:36 +# @Description:: diff --git a/YiMao/bsifunc/readme.txt b/YiMao/bsifunc/readme.txt deleted file mode 100644 index 4f4f348..0000000 --- a/YiMao/bsifunc/readme.txt +++ /dev/null @@ -1 +0,0 @@ -业务方法目录 \ No newline at end of file diff --git a/YiMao/config/ApiInfo.py b/YiMao/config/ApiInfo.py new file mode 100644 index 0000000..08b8f2f --- /dev/null +++ b/YiMao/config/ApiInfo.py @@ -0,0 +1,59 @@ +# !/usr/bin/python +# -*- coding: utf-8 -*- +# @Author:: Arthur Wu +# @Date:: 2024/10/14-11:50 +# @Description:: API接口信息 +api_env = { + "test_env": "https://api.test.yimaogo.com/", + "gray_env": "https://api.yimaogo.com/", +} +ManagementPlatformApi_zh = { + "编辑超市系统参数": "admin/system/settings", # 超市管理 (MarketID:可以通过查询超市接口获取) + + "编辑门店系统参数": "admin/system/settings", # 门店管理 (StoreID:可以通过查询门店接口获取) + "删除门店系统参数": "admin/system/settings/{StoreID}", + "新建促销商品白名单": "admin/goods/promotion", + "修改与删除促销商品白名单": "admin/goods/promotion/{GoodsWhiteListID}", # GoodsWhiteListID:可以通过新建时过程存储,调用删除接口时再读取 + "新建重量放通白名单": "admin/goods/weight/promotion", + "修改与删除重量放通白名单": "admin/goods/weight/promotion/{WeightWhiteListID}", # WeightWhiteListID:可以通过新建时过程存储,其他接口使用时再读取 + + "新建派样活动": "admin/sample/activity", # 派样活动 + "查询派样活动": "admin/sample/activity/list", + "修改与删除派样活动": "admin/sample/activity/{SampleActivityID}", # :可以通过新建时过程存储,其他接口使用时再读取 + "暂停派样活动": "admin/sample/activity/change/status/{SampleActivityID}?status=3", + "重新发布派样活动": "admin/sample/activity/change/status/{SampleActivityID}?status=2", + "立即结束派样活动": "admin/sample/activity/change/status/{SampleActivityID}?status=4", + "复制派样活动": "admin/sample/activity", + "新建抽奖活动": "admin/lotteryAct", # 抽奖活动 + "查询抽奖活动": "admin/lotteryAct/list", + "修改与删除抽奖活动": "admin/lotteryAct/{LotteryActID}", + "编辑抽奖活动状态": "admin/lotteryAct/modifyStatus/{LotteryActID}", # :可以通过新建时过程存储,其他接口使用时再读取 + "复制抽奖活动": "admin/lotteryAct/copy/{LotteryActID}", + + "新建优惠券活动": "admin/coupon/setting", # 优惠券活动 + "查询优惠券活动": "admin/coupon/setting/list", + "暂停优惠券活动": "admin/coupon/setting/status/{CouponID}?status=6", # :可以通过新建时过程存储,其他接口使用时再读取 + "重新开启优惠券活动": "admin/coupon/setting/status/{CouponID}?status=4", + "结束投放优惠券活动": "admin/coupon/setting/status/{CouponID}?status=7", + "修改与删除优惠券活动": "admin/coupon/setting/{CouponID}", + "复制优惠券活动": "admin/coupon/setting", + + "新建广告": "admin/ads", # 广告活动 + "复制广告": "admin/ads", # 广告活动 + "查询广告": "admin/ads/list", + "修改与删除广告": "admin/ads/{ADsID}", # :可以通过新建时过程存储,其他接口使用时再读取 + "暂停广告投放": "admin/ads/status/{ADsID}?status=6", + "重新投放广告": "admin/ads/status/{ADsID}?status=4", + "结束投放广告": "admin/ads/status/{ADsID}?status=7", + + "新建版本信息": "admin/apk", # 版本管理 + "查询版本信息": "admin/apk/list", + "修改与删除版本信息": "admin/apk/{VersionID}", # :可以通过新建时过程存储,其他接口使用时再读取 + + "新建升级任务": "admin/upgrade/settings", # 升级任务 + "查询升级任务": "admin/upgrade/settings/list", + "修改与删除升级任务": "admin/upgrade/settings/{UpgradeID}", # :可以通过新建时过程存储,其他接口使用时再读取 + "启禁升级任务": "admin/upgrade/settings/active/{UpgradeID}", +} + + diff --git a/YiMao/config/__init__.py b/YiMao/config/__init__.py new file mode 100644 index 0000000..a955bd7 --- /dev/null +++ b/YiMao/config/__init__.py @@ -0,0 +1,5 @@ +# !/usr/bin/python +# -*- coding: utf-8 -*- +# @Author:: Arthur Wu +# @Date:: 2024/5/21-15:36 +# @Description:: diff --git a/YiMao/config/cfg.yaml b/YiMao/config/cfg.yaml deleted file mode 100644 index b5bc754..0000000 --- a/YiMao/config/cfg.yaml +++ /dev/null @@ -1 +0,0 @@ -# 项目级配置文件 \ No newline at end of file diff --git a/YiMao/conftest.py b/YiMao/conftest.py new file mode 100644 index 0000000..3b372d2 --- /dev/null +++ b/YiMao/conftest.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +import pytest + +'''@Author:: Arthur Wu +@Date:: 2024/05/21 +@Description:: This is the webservices library conftest file +''' + + +@pytest.fixture(scope='function', autouse=True) +def init_webservices(): + """@Author:: Arthur + @Date:: 2022/05/19 + @Description:: + :return: + """ + print("function setup") + yield + print("function teardwon") + + diff --git a/YiMao/data/YMHT_ApiTestCase_0.0.1.xlsx b/YiMao/data/YMHT_ApiTestCase_0.0.1.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..11498c33240c2e3ccb7c30406f858b15b3fafe25 GIT binary patch literal 71490 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

jpFyA)2Nx1*Rr1I#_--Winz<~kFg2j!w>mMf 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 z zGcW)tFo3uuBO78uNo7tdl2+`2g_=UFQo&kFGE#F>F;a-tG;aQDtPBhilIW3?h^!5) z*$|tP(VKnmi&`q%bR-9N&F~SxIyMm`VOaZoSj>w{$!mEVU z6k}|r9CEJ{I0ZDtSpnUY>l#>1F~MevL;usLWk4TgWBBO0K2}pqv6-UN_{TUNm;`ru zp}S?XIaX85u$eOD*bFH?V0(_k7TpvNSFEO(V>899D5-B9FxyW^KsTi)0IMk$*i7;K pZPzyiSd5ed^9*WwDM-X>iY3GpR$z=UFh~NSIgs^L09c|i007LK_;mmP literal 0 HcmV?d00001 diff --git a/YiMao/data/YMHT_ApiTestCase_0.02.xlsx b/YiMao/data/YMHT_ApiTestCase_0.02.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..b0c921b734c0635edb286d2b6eea3897fc952c4e GIT binary patch literal 72995 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 uvA|}^lSwPYqJhOoJ1}>k# None: + self.timestamp = int(time.time()) + + @allure.story('[管理平台] 超市管理模块') + @ddt.data(*ExcelContent) + def test_market_system_parameters(self, data): + '''@Date:: 2024/5/20 + @Desc:: + 管理后台 -> 超市管理模块接口 + ''' + ''' step01: ''' + allure.dynamic.title(data['CaseName']) + allure.dynamic.description("描述:超市管理模块接口自动化测试") + caseModule_c = data['BusinessModule'] # 用例编号 + caseNO_c = data['NO.'] # 用例编号 + caseName_c = data['CaseName'] # 用例名称 + requestType_c = str(data['RequestType']) # 请求方式 + expStaCode_c = data['ExpStatusCode'] # 预期的状态码 + expRespJson_c = eval(data['RespJson']) # 预期的返回体 + LOGGER.info(f">>> 开始执行->{caseModule_c}接口自动化测试 <<<\n") + LOGGER.info(f"---用例编号为:{caseNO_c}") + LOGGER.info(f"---用例名称为:{caseName_c}") + LOGGER.info(f"---请求方式为:{requestType_c}") + # LOGGER.info(f"---请求Header为:{HEADERS}") + LOGGER.info(f"---预期接口返回码为:{expStaCode_c}") + LOGGER.info(f"---预期返回体为:{expRespJson_c}\n") + + ''' step02- 请求接口 ''' + time.sleep(1) + api_url = api_env[ProCfgData['ExecutionEnv']] + ManagementPlatformApi_zh[data['BusinessModule']] + "/64" # 请求地址 + LOGGER.info(f"---请求接口为:{api_url}") + payload_c = json.dumps(eval(data['Payload']), indent=4, ensure_ascii=False) # 请求体为json格式 + LOGGER.info(f"---请求体为:{payload_c}\n") + response = requests.request(method=requestType_c, url=api_url, headers=HEADERS, data=payload_c) + rspJson = response.json() + rspJsonFormat = json.dumps(response.json(), indent=4, ensure_ascii=False) + LOGGER.info(f"---接口返回状态码为:: {response.status_code}") + LOGGER.info(f"---接口返回体为:: {rspJsonFormat}\n") + + ''' step03- 断言处理 ''' + assert _assert_result(rspJson, expRespJson_c, LOGGER) == True, f"---断言失败!" + LOGGER.info(f">>> {data['BusinessModule']}接口请求 & 断言执行结束 <<<\n\n") + + +if __name__ == '__main__': + unittest.main(verbosity=2) + diff --git a/YiMao/scripts/test_02StoreMangementModule.py b/YiMao/scripts/test_02StoreMangementModule.py new file mode 100644 index 0000000..6a356fa --- /dev/null +++ b/YiMao/scripts/test_02StoreMangementModule.py @@ -0,0 +1,145 @@ +# !/usr/bin/python +# -*- coding: utf-8 -*- +import unittest,allure,ddt,time,json,requests +from configs.globalObj import LOGGER +from configs.globalParams import * +from YiMao.config.ApiInfo import * +from commons.FileHandler import ReadExcel,Txt +from commons.AssertLib import _assert_result +ExlFilePath = GlobalPath['YMDataPath'] + '/YMHT_ApiTestCase_0.0.1.xlsx' +ExcelContent = ReadExcel().get_data(FilePath=ExlFilePath, SheetName='02-门店管理') + + +@ddt.ddt +class Test_StoreManagementModule(unittest.TestCase): + def setUp(self) -> None: + self.timestamp = int(time.time()) + + @allure.story('[管理平台] 门店管理模块') + @ddt.data(*ExcelContent) + def test_store_management(self, data): + '''@Date:: 2024/5/20 + @Desc:: + 管理后台 -> 门店管理模块接口 + ''' + ''' step01:获取测试用例数据 ''' + allure.dynamic.title(data['CaseName']) + allure.dynamic.description("描述:门店管理模块接口自动化测试") + caseModule_c = data['BusinessModule'] # 用例编号 + caseNO_c = data['NO.'] # 用例编号 + caseName_c = data['CaseName'] # 用例名称 + requestType_c = str(data['RequestType']) # 请求方式 + expStaCode_c = data['ExpStatusCode'] # 预期的状态码 + expRespJson_c = eval(data['RespJson']) # 预期的返回体 + LOGGER.info(f">>> 开始执行->{caseModule_c}接口自动化测试 <<<\n") + LOGGER.info(f"---用例编号为:{caseNO_c}") + LOGGER.info(f"---用例名称为:{caseName_c}") + LOGGER.info(f"---请求方式为:{requestType_c}") + # LOGGER.info(f"---请求Header为:{HEADERS}") + LOGGER.info(f"---预期接口返回码为:{expStaCode_c}") + LOGGER.info(f"---预期返回体为:{expRespJson_c}\n") + + ''' step02:请求接口 ''' + if data['BusinessModule'] == '删除门店系统参数': + time.sleep(0.5) + sysSettingID = 97 + storeId = 65 + api_url = api_env[ProCfgData['ExecutionEnv']] + ManagementPlatformApi_zh[data['BusinessModule']] # 请求地址 + last_api_url = api_url.replace("{StoreID}", str(sysSettingID)) + LOGGER.info(f"---请求接口为:{last_api_url}") + payload_c = json.dumps(eval(data['Payload']), indent=4, ensure_ascii=False) # 请求体为json格式 + LOGGER.info(f"---请求体为:{payload_c}\n") + response = requests.request(method=requestType_c, url=last_api_url, headers=HEADERS, data=payload_c) + rspJson = response.json() + rspJsonFormat = json.dumps(response.json(), indent=4, ensure_ascii=False) + LOGGER.info(f"---接口返回状态码为:: {response.status_code}") + LOGGER.info(f"---接口返回体为:: {rspJsonFormat}\n") + elif data['BusinessModule'] == '修改与删除促销商品白名单': + GoodsWhiteListIDList = Txt().read_txt("GoodsWhiteListID.txt") + LOGGER.info(f"---促销商品白名单ID列表为:{GoodsWhiteListIDList}") + if requestType_c == "DELETE": + for i in range(len(GoodsWhiteListIDList)): + if GoodsWhiteListIDList[i] not in [None, '']: + api_url = api_env[ProCfgData['ExecutionEnv']] + ManagementPlatformApi_zh[ + data['BusinessModule']] # 请求地址 + last_api_url = api_url.replace("{GoodsWhiteListID}", str(GoodsWhiteListIDList[i])) + LOGGER.info(f"---请求接口为:{last_api_url}") + payload_c = json.dumps(eval(data['Payload']), indent=4, ensure_ascii=False) # 请求体为json格式 + LOGGER.info(f"---请求体为:{payload_c}\n") + time.sleep(1) + response = requests.request(method=requestType_c, url=last_api_url, headers=HEADERS, data=payload_c) + rspJson = response.json() + rspJsonFormat = json.dumps(response.json(), indent=4, ensure_ascii=False) + LOGGER.info(f"---接口返回状态码为:: {response.status_code}") + LOGGER.info(f"---接口返回体为:: {rspJsonFormat}\n") + else: + api_url = api_env[ProCfgData['ExecutionEnv']] + ManagementPlatformApi_zh[data['BusinessModule']] # 请求地址 + last_api_url = api_url.replace("{GoodsWhiteListID}", str(GoodsWhiteListIDList[-2])) + LOGGER.info(f"---请求接口为:{last_api_url}") + payload_c = json.dumps(eval(data['Payload']), indent=4, ensure_ascii=False) # 请求体为json格式 + LOGGER.info(f"---请求体为:{payload_c}\n") + response = requests.request(method=requestType_c, url=last_api_url, headers=HEADERS, data=payload_c) + rspJson = response.json() + rspJsonFormat = json.dumps(response.json(), indent=4, ensure_ascii=False) + LOGGER.info(f"---接口返回状态码为:: {response.status_code}") + LOGGER.info(f"---接口返回体为:: {rspJsonFormat}\n") + elif data['BusinessModule'] == '修改与删除重量放通白名单': + WeightWhiteListIDList = Txt().read_txt("WeightWhiteListID.txt") + LOGGER.info(f"---删除重量放通白名单ID列表为:{WeightWhiteListIDList}") + if requestType_c == "DELETE": + for j in range(len(WeightWhiteListIDList)): + if WeightWhiteListIDList[j] not in [None, '']: + api_url = api_env[ProCfgData['ExecutionEnv']] + ManagementPlatformApi_zh[ + data['BusinessModule']] # 请求地址 + last_api_url2 = api_url.replace("{WeightWhiteListID}", str(WeightWhiteListIDList[j])) + LOGGER.info(f"---请求接口为:{last_api_url2}") + payload_c = json.dumps(eval(data['Payload']), indent=4, ensure_ascii=False) # 请求体为json格式 + LOGGER.info(f"---请求体为:{payload_c}\n") + time.sleep(0.5) + response = requests.request(method=requestType_c, url=last_api_url2, headers=HEADERS, data=payload_c) + rspJson = response.json() + rspJsonFormat = json.dumps(response.json(), indent=4, ensure_ascii=False) + LOGGER.info(f"---删除第 {j+1} 条数据,接口返回状态码为:: {response.status_code}") + LOGGER.info(f"---第 {j+1} 条数据,接口返回体为:: {rspJsonFormat}\n") + else: + api_url = api_env[ProCfgData['ExecutionEnv']] + ManagementPlatformApi_zh[data['BusinessModule']] # 请求地址 + last_api_url = api_url.replace("{WeightWhiteListID}", str(WeightWhiteListIDList[0])) + LOGGER.info(f"---请求接口为:{last_api_url}") + payload_c = json.dumps(eval(data['Payload']), indent=4, ensure_ascii=False) # 请求体为json格式 + LOGGER.info(f"---请求体为:{payload_c}\n") + response = requests.request(method=requestType_c, url=last_api_url, headers=HEADERS, data=payload_c) + rspJson = response.json() + rspJsonFormat = json.dumps(response.json(), indent=4, ensure_ascii=False) + LOGGER.info(f"---接口返回状态码为:: {response.status_code}") + LOGGER.info(f"---接口返回体为:: {rspJsonFormat}\n") + else: + api_url = api_env[ProCfgData['ExecutionEnv']] + ManagementPlatformApi_zh[data['BusinessModule']] # 请求地址 + LOGGER.info(f"---请求接口为:{api_url}") + payload_c = json.dumps(eval(data['Payload']), indent=4, ensure_ascii=False) # 请求体为json格式 + LOGGER.info(f"---请求体为:{payload_c}\n") + response = requests.request(method=requestType_c, url=api_url, headers=HEADERS, data=payload_c) + rspJson = response.json() + rspJsonFormat = json.dumps(response.json(), indent=4, ensure_ascii=False) + LOGGER.info(f"---接口返回状态码为:: {response.status_code}") + LOGGER.info(f"---接口返回体为:: {rspJsonFormat}\n") + if data['BusinessModule'] == '新建促销商品白名单': + time.sleep(0.5) + goodsWhiteListID = rspJson["data"]['id'] + writeResult = Txt().append_write_txt("GoodsWhiteListID.txt", str(goodsWhiteListID)) + if not writeResult: + LOGGER.error(f"---写入 新建促销商品白名单ID 失败!") + elif data['BusinessModule'] == '新建重量放通白名单': + time.sleep(0.5) + weightWhiteListID = rspJson["data"]['id'] + writeResult = Txt().append_write_txt("WeightWhiteListID.txt", str(weightWhiteListID)) + if not writeResult: + LOGGER.error(f"---写入 新建重量放通白名单ID 失败!") + + ''' step03: 断言处理 ''' + assert _assert_result(rspJson, expRespJson_c, LOGGER) == True, f"---断言失败!" + LOGGER.info(f">>> {data['BusinessModule']}接口请求 & 断言执行结束 <<<\n\n") + + +if __name__ == '__main__': + unittest.main(verbosity=2) + diff --git a/YiMao/scripts/test_03SampleDistributionActivity.py b/YiMao/scripts/test_03SampleDistributionActivity.py new file mode 100644 index 0000000..60b0756 --- /dev/null +++ b/YiMao/scripts/test_03SampleDistributionActivity.py @@ -0,0 +1,110 @@ +# !/usr/bin/python +# -*- coding: utf-8 -*- +import unittest,allure,ddt,time,json,requests,datetime +from datetime import datetime,timedelta +from configs.globalObj import LOGGER +from configs.globalParams import * +from YiMao.config.ApiInfo import * +from commons.FileHandler import ReadExcel,Txt +from commons.PgSqlLib import PGSQL +from commons.AssertLib import _assert_result +ExlFilePath = GlobalPath['YMDataPath'] + '/YMHT_ApiTestCase_0.0.1.xlsx' +ExcelContent = ReadExcel().get_data(FilePath=ExlFilePath, SheetName='03-派样活动') + + +@ddt.ddt +class Test_SampleDistributionActivity_Module(unittest.TestCase): + + @allure.story('[管理平台] 派样活动模块') + @ddt.data(*ExcelContent) + def test_sample_distribution_activity(self, data): + '''@Date:: 2024/5/20 + @Desc:: + 管理后台 -> 派样活动模块接口 + ''' + ''' step01:获取测试用例数据 ''' + allure.dynamic.title(data['CaseName']) + allure.dynamic.description("描述:派样活动模块接口自动化测试") + caseModule_c = data['BusinessModule'] # 用例编号 + caseNO_c = data['NO.'] # 用例编号 + caseName_c = data['CaseName'] # 用例名称 + requestType_c = str(data['RequestType']) # 请求方式 + expStaCode_c = data['ExpStatusCode'] # 预期的状态码 + expRespJson_c = eval(data['RespJson']) # 预期的返回体 + LOGGER.info(f">>> 开始执行->{caseModule_c}接口自动化测试 <<<\n") + LOGGER.info(f"---用例编号为:{caseNO_c}") + LOGGER.info(f"---用例名称为:{caseName_c}") + LOGGER.info(f"---请求方式为:{requestType_c}") + # LOGGER.info(f"---请求Header为:{HEADERS}") + LOGGER.info(f"---预期接口返回码为:{expStaCode_c}") + LOGGER.info(f"---预期返回体为:{expRespJson_c}\n") + + ''' step02- 请求接口 + 执行复制接口时,存储对应 rspJson["data"]["id"],为删除接口使用 + ''' + if data['BusinessModule'] in ["新建派样活动", "复制派样活动", "查询派样活动"]: + # 新建、查询、复制 + api_url = api_env[ProCfgData['ExecutionEnv']] + ManagementPlatformApi_zh[data['BusinessModule']] # 请求地址 + LOGGER.info(f"---请求接口为:{api_url}") + # LOGGER.info(f"---处理前,请求体为:{data['Payload']}\n") + payload_c = json.dumps(eval(data['Payload']), indent=4, ensure_ascii=False) # 请求体为json格式 + LOGGER.info(f"---处理后,请求体为:{payload_c}\n") + response = requests.request(method=requestType_c, url=api_url, headers=HEADERS, data=payload_c) + rspJson = response.json() + LOGGER.info(f"---接口返回状态码为:: {response.status_code}") + LOGGER.info(f"---接口返回体为:: {json.dumps(response.json(), indent=4, ensure_ascii=False)}\n") + time.sleep(0.5) + if data['BusinessModule'] == "新建派样活动": + if "存为草稿" in caseName_c: + SampleActivityID = rspJson["data"]['id'] + writeResult = Txt().append_write_txt( + "03_DraftOfActivityID.txt", str(SampleActivityID) + ) + if not writeResult: + LOGGER.error(f"---写入 派样活动(新建)ID 失败!") + else: + SampleActivityID = rspJson["data"]['id'] + writeResult = Txt().append_write_txt( + "03_CreateSampleActivityID.txt", str(SampleActivityID) + ) + if not writeResult: + LOGGER.error(f"---写入 派样活动(草稿)ID 失败!") + elif data['BusinessModule'] == "复制派样活动": + SampleActivityID = rspJson["data"]['id'] + # writeResult = Txt().append_write_txt("03_CopySampleActivityID.txt", str(SampleActivityID)) + writeResult = Txt().append_write_txt( + "03_CreateSampleActivityID.txt", str(SampleActivityID) + ) + if not writeResult: + LOGGER.error(f"---写入 派样活动(复制)ID 失败!") + else: + sampleActIDList = Txt().read_txt("03_CreateSampleActivityID.txt") + LOGGER.info(f"---新建并发布的派样活动ID list为:{sampleActIDList}") + api_url = api_env[ProCfgData['ExecutionEnv']] + ManagementPlatformApi_zh[data['BusinessModule']] # 请求地址 + last_api_url = api_url.replace("{SampleActivityID}", str(sampleActIDList[0])) + LOGGER.info(f"---请求接口为:{last_api_url}") + payload_c = json.dumps(eval(data['Payload']), indent=4, ensure_ascii=False) # 请求体为json格式 + LOGGER.info(f"---请求体为:{payload_c}\n") + response = requests.request(method=requestType_c, url=last_api_url, headers=HEADERS, data=payload_c) + rspJson = response.json() + rspJsonFormat = json.dumps(response.json(), indent=4, ensure_ascii=False) + LOGGER.info(f"---接口返回状态码为:: {response.status_code}") + LOGGER.info(f"---接口返回体为:: {rspJsonFormat}\n") + + ''' step03- 断言处理 ''' + assert _assert_result(rspJson, expRespJson_c, LOGGER) == True, f"---断言失败!" + LOGGER.info(f">>> {data['BusinessModule']}接口请求 & 断言执行结束 <<<\n\n") + + @classmethod + def tearDownClass(cls): + LOGGER.info(f">>> 派样活动模块接口自动化测试所有用例执行完毕 <<<\n") + LOGGER.info(f">>> 开始执行清理-派样活动模块-测试数据 <<<\n") + sampActIDList = (Txt().read_txt("03_CreateSampleActivityID.txt") + + Txt().read_txt("03_DraftOfActivityID.txt")) + LOGGER.info(f"---待删除的派样活动ID list为:{sampActIDList}") + PGSQL().del_sample_activity_data(sampActIDList) + LOGGER.info(f">>> 清理-派样活动模块-测试数据完毕 <<<\n") + +if __name__ == '__main__': + unittest.main(verbosity=2) + diff --git a/YiMao/scripts/test_04LotteryDraw.py b/YiMao/scripts/test_04LotteryDraw.py new file mode 100644 index 0000000..39f59ae --- /dev/null +++ b/YiMao/scripts/test_04LotteryDraw.py @@ -0,0 +1,112 @@ +# !/usr/bin/python +# -*- coding: utf-8 -*- +import unittest,allure,ddt,json,requests +from configs.globalObj import LOGGER +from configs.globalParams import * +from YiMao.config.ApiInfo import * +from commons.FileHandler import ReadExcel,Txt +from commons.AssertLib import _assert_result +ExlFilePath = GlobalPath['YMDataPath'] + '/YMHT_ApiTestCase_0.0.1.xlsx' +ExcelContent = ReadExcel().get_data(FilePath=ExlFilePath, SheetName='04-抽奖活动') + + +@ddt.ddt +class Test_LotteryDraw_Module(unittest.TestCase): + + @allure.story("[管理后台] 抽奖活动模块") + @ddt.data(*ExcelContent) + def test_lottery_draw(self, data): + '''@Date:: 2024/10/25 + @Desc:: + 管理后台 -> 抽奖活动 模块接口 + ''' + ''' step01- 前置数据、接口信息描述等 ''' + allure.dynamic.title(data['CaseName']) + allure.dynamic.description("描述:抽奖活动 模块接口自动化测试") + caseModule_c = data['BusinessModule'] # 用例编号 + caseNO_c = data['NO.'] # 用例编号 + caseName_c = data['CaseName'] # 用例名称 + requestType_c = str(data['RequestType']) # 请求方式 + expStaCode_c = data['ExpStatusCode'] # 预期的状态码 + expRespJson_c = eval(data['RespJson']) # 预期的返回体 + LOGGER.info(f">>> 开始执行->{caseModule_c}接口自动化测试 <<<\n") + LOGGER.info(f"---用例编号为:{caseNO_c}") + LOGGER.info(f"---用例名称为:{caseName_c}") + LOGGER.info(f"---请求方式为:{requestType_c}") + # LOGGER.info(f"---请求Header为:{HEADERS}") + LOGGER.info(f"---预期接口返回码为:{expStaCode_c}") + LOGGER.info(f"---预期返回体为:{expRespJson_c}\n") + + ''' step02- 请求接口 ''' + rspJson = {} + if caseModule_c in ["新建抽奖活动", "查询抽奖活动"]: + # 新建、查询 + api_url = api_env[ProCfgData['ExecutionEnv']] + ManagementPlatformApi_zh[caseModule_c] # 请求地址 + LOGGER.info(f"---请求接口为:{api_url}") + payload_c = json.dumps(eval(data['Payload']), indent=4, ensure_ascii=False) # 请求体为json格式 + LOGGER.info(f"---请求体为:{payload_c}\n") + response = requests.request(method=requestType_c, url=api_url, headers=HEADERS, data=payload_c) + rspJson = response.json() + LOGGER.info(f"---接口返回状态码为:: {response.status_code}") + LOGGER.info(f"---接口返回体为:: {json.dumps(response.json(), indent=4, ensure_ascii=False)}\n") + if caseModule_c == "新建抽奖活动": + if "存为草稿" in caseName_c: + LottreyActID = rspJson["data"]['id'] + writeResult = Txt().append_write_txt("04_LottreyDrawID.txt", str(LottreyActID)) + if not writeResult: + LOGGER.error(f"---写入 抽奖活动(新建)ID 失败!") + else: + LottreyActID = rspJson["data"]['id'] + writeResult = Txt().append_write_txt("04_CreateLottreyActID.txt", str(LottreyActID)) + if not writeResult: + LOGGER.error(f"---写入 抽奖活动(草稿)ID 失败!") + else: + # 编辑抽奖活动状态 + if "存为草稿" in caseName_c: + lotteryActIDList = Txt().read_txt("04_LottreyDrawID.txt") + LOGGER.info(f"---新建抽奖活动 存为草稿的活动ID list为:{lotteryActIDList}") + elif requestType_c == "DELETE": + lotteryActIDList = (Txt().read_txt("04_CreateLottreyActID.txt") + + Txt().read_txt("04_LottreyDrawID.txt")) + LOGGER.info(f"---新建并发布的抽奖活动ID list为:{lotteryActIDList}") + else: + lotteryActIDList = Txt().read_txt("04_CreateLottreyActID.txt") + LOGGER.info(f"---新建并发布的抽奖活动ID list为:{lotteryActIDList}") + if requestType_c == "DELETE" or caseModule_c == "编辑抽奖活动状态": + # 编辑抽奖活动状态、删除抽奖活动 + for i in range(len(lotteryActIDList)): + lotteryId = lotteryActIDList[i] + if lotteryId not in [None, '']: + api_url = api_env[ProCfgData['ExecutionEnv']] + ManagementPlatformApi_zh[caseModule_c] # 请求地址 + last_api_url = api_url.replace("{LotteryActID}", str(lotteryId)) + LOGGER.info(f"---请求接口为:{last_api_url}") + payload_c = json.dumps(eval(data['Payload']), indent=4, ensure_ascii=False) # 请求体为json格式 + LOGGER.info(f"---请求体为:{payload_c}\n") + time.sleep(0.5) + response = requests.request(method=requestType_c, url=last_api_url, headers=HEADERS, data=payload_c) + rspJson = response.json() + LOGGER.info(f"---接口返回状态码为:: {response.status_code}") + LOGGER.info(f"---接口返回体为:: {json.dumps(response.json(), indent=4, ensure_ascii=False)}\n") + else: + # 编辑抽奖活动、复制抽奖活动 + lotteryId = lotteryActIDList[0] + if lotteryId not in [None, '']: + api_url = api_env[ProCfgData['ExecutionEnv']] + ManagementPlatformApi_zh[caseModule_c] # 请求地址 + last_api_url = api_url.replace("{LotteryActID}", str(lotteryId)) + LOGGER.info(f"---请求接口为:{last_api_url}") + payload_c = json.dumps(eval(data['Payload']), indent=4, ensure_ascii=False) # 请求体为json格式 + LOGGER.info(f"---请求体为:{payload_c}\n") + response = requests.request(method=requestType_c, url=last_api_url, headers=HEADERS, data=payload_c) + rspJson = response.json() + rspJsonFormat = json.dumps(response.json(), indent=4, ensure_ascii=False) + LOGGER.info(f"---接口返回状态码为:: {response.status_code}") + LOGGER.info(f"---接口返回体为:: {rspJsonFormat}\n") + + ''' step03- 断言处理 ''' + assert _assert_result(rspJson, expRespJson_c, LOGGER) == True, AssertionError(f"---断言失败!") + LOGGER.info(f">>> {caseModule_c}接口请求 & 断言执行结束 <<<\n\n") + + +if __name__ == '__main__': + unittest.main(verbosity=2) + diff --git a/YiMao/scripts/test_05CouponPromotion.py b/YiMao/scripts/test_05CouponPromotion.py new file mode 100644 index 0000000..8fbdb81 --- /dev/null +++ b/YiMao/scripts/test_05CouponPromotion.py @@ -0,0 +1,126 @@ +# !/usr/bin/python +# -*- coding: utf-8 -*- +import unittest,allure,ddt,time,json,requests,datetime +from datetime import datetime,timedelta +from configs.globalObj import LOGGER +from configs.globalParams import * +from YiMao.config.ApiInfo import * +from commons.FileHandler import ReadExcel,Txt +from commons.PgSqlLib import PGSQL +from commons.AssertLib import _assert_result +ExlFilePath = GlobalPath['YMDataPath'] + '/YMHT_ApiTestCase_0.0.1.xlsx' +ExcelContent = ReadExcel().get_data(FilePath=ExlFilePath, SheetName='05-优惠券活动') + + +@ddt.ddt +class Test_CouponPromotion_Module(unittest.TestCase): + def setUp(self) -> None: + self.timestamp = int(time.time()) + + @allure.story("管理后台:优惠券活动模块") + @ddt.data(*ExcelContent) + def test_coupon_promotion(self, data): + '''@Date:: 2024/5/20 + @Desc:: + 管理后台 -> 优惠券活动模块接口 + ''' + LOGGER.info(f"---用例data信息为:{data}") + ''' step01- 前置数据、接口信息描述等 ''' + allure.dynamic.title(data['CaseName']) + allure.dynamic.description("描述:优惠券活动 模块接口自动化测试") + + caseModule_c = data['BusinessModule'] # 用例编号 + caseNO_c = data['NO.'] # 用例编号 + caseName_c = data['CaseName'] # 用例名称 + requestType_c = str(data['RequestType']) # 请求方式 + expStaCode_c = data['ExpStatusCode'] # 预期的状态码 + expRespJson_c = eval(data['RespJson']) # 预期的返回体 + LOGGER.info(f">>> 开始执行->{caseModule_c}接口自动化测试 <<<\n") + LOGGER.info(f"---用例编号为:{caseNO_c}") + LOGGER.info(f"---用例名称为:{caseName_c}") + LOGGER.info(f"---请求方式为:{requestType_c}") + # LOGGER.info(f"---请求Header为:{HEADERS}") + LOGGER.info(f"---预期接口返回码为:{expStaCode_c}") + LOGGER.info(f"---预期返回体为:{expRespJson_c}\n") + + ''' step02- 请求接口 ''' + if requestType_c == "POST": + # 新建、查询 + api_url = api_env[ProCfgData['ExecutionEnv']] + ManagementPlatformApi_zh[caseModule_c] # 请求地址 + LOGGER.info(f"---请求接口为:{api_url}") + payload_c = json.dumps(eval(data['Payload']), indent=4, ensure_ascii=False) # 请求体为json格式 + LOGGER.info(f"---请求体为:{payload_c}\n") + response = requests.request(method=requestType_c, url=api_url, headers=HEADERS, data=payload_c) + rspJson = response.json() + LOGGER.info(f"---接口返回状态码为:: {response.status_code}") + LOGGER.info(f"---接口返回体为:: {json.dumps(response.json(), indent=4, ensure_ascii=False)}\n") + if caseModule_c == "新建优惠券活动": + if "存为草稿" in caseName_c: + CouponActID = rspJson["data"]['id'] + writeResult = Txt().append_write_txt("05_CouponDrawID.txt", str(CouponActID)) + if not writeResult: + LOGGER.error(f"---写入 优惠券活动(新建)ID 失败!") + elif "复制" in caseName_c: + CouponActID = rspJson["data"]['id'] + writeResult = Txt().append_write_txt("05_CopyCouponActID.txt", str(CouponActID)) + if not writeResult: + LOGGER.error(f"---写入 优惠券活动(新建)ID 失败!") + else: + CouponActID = rspJson["data"]['id'] + writeResult = Txt().append_write_txt("05_CreateCouponActID.txt", str(CouponActID)) + if not writeResult: + LOGGER.error(f"---写入 优惠券活动(草稿)ID 失败!") + elif caseName_c == "修改并发布优惠券活动": + ActIDList = (Txt().read_txt("05_CreateCouponActID.txt")) + LOGGER.info(f"---新建并发布的 优惠券活动ID list为:{ActIDList}") + api_url = api_env[ProCfgData['ExecutionEnv']] + ManagementPlatformApi_zh[caseModule_c] # 请求地址 + last_api_url = api_url.replace("{CouponID}", ActIDList[0]) + LOGGER.info(f"---请求接口为:{last_api_url}") + payload_c = json.dumps(eval(data['Payload']), indent=4, ensure_ascii=False) # 请求体为json格式 + LOGGER.info(f"---请求体为:{payload_c}\n") + time.sleep(0.5) + response = requests.request(method=requestType_c, url=last_api_url, headers=HEADERS, data=payload_c) + rspJson = response.json() + LOGGER.info(f"---接口返回状态码为:: {response.status_code}") + LOGGER.info(f"---接口返回体为:: {json.dumps(response.json(), indent=4, ensure_ascii=False)}\n") + else: + if requestType_c == "PUT": + ActIDList = (Txt().read_txt("05_CreateCouponActID.txt")) + LOGGER.info(f"---新建并发布的 优惠券活动ID list为:{ActIDList}") + else: + ActIDList = (Txt().read_txt("05_CopyCouponActID.txt") + + Txt().read_txt("05_CouponDrawID.txt")) + LOGGER.info(f"---存为草稿&复制的 优惠券活动ID list为:{ActIDList}") + for i in range(len(ActIDList)): + # 暂停、重启、结束 + ActId = ActIDList[i] + if ActId not in [None, '']: + api_url = api_env[ProCfgData['ExecutionEnv']] + ManagementPlatformApi_zh[caseModule_c] # 请求地址 + last_api_url = api_url.replace("{CouponID}", str(ActId)) + LOGGER.info(f"---请求接口为:{last_api_url}") + payload_c = json.dumps(eval(data['Payload']), indent=4, ensure_ascii=False) # 请求体为json格式 + LOGGER.info(f"---请求体为:{payload_c}\n") + time.sleep(0.5) + response = requests.request(method=requestType_c, url=last_api_url, headers=HEADERS, data=payload_c) + rspJson = response.json() + LOGGER.info(f"---接口返回状态码为:: {response.status_code}") + LOGGER.info(f"---接口返回体为:: {json.dumps(response.json(), indent=4, ensure_ascii=False)}\n") + ''' step03- 断言处理 ''' + assert _assert_result(rspJson, expRespJson_c, LOGGER) == True, AssertionError(f"---断言失败!") + LOGGER.info(f">>> {caseModule_c}接口请求 & 断言执行结束 <<<\n\n") + + @classmethod + def tearDownClass(cls): + LOGGER.info(f">>> 优惠券活动模块接口自动化测试所有用例执行完毕 <<<\n") + LOGGER.info(f">>> 开始执行清理-优惠券活动模块-测试数据 <<<\n") + ActIDList = (Txt().read_txt("05_CreateCouponActID.txt") + + Txt().read_txt("05_CouponDrawID.txt") + + Txt().read_txt("05_CopyCouponActID.txt")) # + LOGGER.info(f"---待删除的优惠券活动ID list为:{ActIDList}") + res = PGSQL().del_coupon_activity_data(ActIDList) # + LOGGER.info(f"---清除自动化测试数据执行结果为:{res}") + LOGGER.info(f">>> 清理-优惠券活动模块-测试数据完毕 <<<\n") + +if __name__ == '__main__': + unittest.main(verbosity=2) + diff --git a/YiMao/scripts/test_06ADManagement.py b/YiMao/scripts/test_06ADManagement.py new file mode 100644 index 0000000..d512c34 --- /dev/null +++ b/YiMao/scripts/test_06ADManagement.py @@ -0,0 +1,112 @@ +# !/usr/bin/python +# -*- coding: utf-8 -*- +import unittest,allure,ddt,time,json,requests,datetime +from datetime import datetime,timedelta +from configs.globalObj import LOGGER +from configs.globalParams import * +from YiMao.config.ApiInfo import * +from commons.FileHandler import ReadExcel,Txt +from commons.AssertLib import _assert_result +ExlFilePath = GlobalPath['YMDataPath'] + '/YMHT_ApiTestCase_0.0.1.xlsx' +ExcelContent = ReadExcel().get_data(FilePath=ExlFilePath, SheetName='06-广告管理') + + +@ddt.ddt +class Test_ADManagement_Module(unittest.TestCase): + @allure.story("管理后台:广告管理模块") + @ddt.data(*ExcelContent) + def test_ad_management(self, data): + '''@Date:: 2024/5/20 + @Desc:: + 管理后台 -> 广告管理模块接口 + ''' + ''' step01- 前置数据、接口信息描述等 ''' + allure.dynamic.title(data['CaseName']) + allure.dynamic.description("描述:广告管理 模块接口自动化测试") + caseModule_c = data['BusinessModule'] # 用例编号 + caseNO_c = data['NO.'] # 用例编号 + caseName_c = data['CaseName'] # 用例名称 + requestType_c = str(data['RequestType']) # 请求方式 + expStaCode_c = data['ExpStatusCode'] # 预期的状态码 + expRespJson_c = eval(data['RespJson']) # 预期的返回体 + LOGGER.info(f">>> 开始执行->{caseModule_c}接口自动化测试 <<<\n") + LOGGER.info(f"---用例编号为:{caseNO_c}") + LOGGER.info(f"---用例名称为:{caseName_c}") + LOGGER.info(f"---请求方式为:{requestType_c}") + # LOGGER.info(f"---请求Header为:{HEADERS}") + LOGGER.info(f"---预期接口返回码为:{expStaCode_c}") + LOGGER.info(f"---预期返回体为:{expRespJson_c}\n") + + ''' step02- 请求接口 ''' + if requestType_c == 'POST': + # 新建、查询、复制 + timeStamp = str(int(time.time())) + api_url = api_env[ProCfgData['ExecutionEnv']] + ManagementPlatformApi_zh[caseModule_c] # 请求地址 + LOGGER.info(f"---请求接口为:{api_url}") + payload_c = json.dumps(eval(data['Payload']), indent=4, ensure_ascii=False) # 请求体为json格式 + LOGGER.info(f"---请求体为:{payload_c}\n") + response = requests.request(method=requestType_c, url=api_url, headers=HEADERS, data=payload_c) + rspJson = response.json() + LOGGER.info(f"---接口返回状态码为:: {response.status_code}") + LOGGER.info(f"---接口返回体为:: {json.dumps(response.json(), indent=4, ensure_ascii=False)}\n") + if "查询广告" not in caseName_c: + if "草稿" in caseName_c or "复制" in caseName_c: + ActID = rspJson["data"]['id'] + writeResult = Txt().append_write_txt("06_ADDrawID.txt", str(ActID)) + if not writeResult: + LOGGER.error(f"---写入 广告管理(新建)ID 失败!") + else: + ActID = rspJson["data"]['id'] + writeResult = Txt().append_write_txt("06_CreateADID.txt", str(ActID)) + if not writeResult: + LOGGER.error(f"---写入 广告管理(草稿)ID 失败!") + else: + # 编辑、删除 + if "修改广告" in caseName_c: + # 取一个已发布的广告ID + ActIDList = Txt().read_txt("06_CreateADID.txt") + ActID = ActIDList[0] + LOGGER.info(f"---存为草稿的 广告管理ID 为:{ActID}") + if ActID not in [None, '']: + api_url = api_env[ProCfgData['ExecutionEnv']] + ManagementPlatformApi_zh[caseModule_c] # 请求地址 + last_api_url = api_url.replace("{ADsID}", ActID) + LOGGER.info(f"---请求接口为:{last_api_url}") + payload_c = json.dumps(eval(data['Payload']), indent=4, ensure_ascii=False) # 请求体为json格式 + LOGGER.info(f"---请求体为:{payload_c}\n") + time.sleep(0.5) + response = requests.request(method=requestType_c, url=last_api_url, headers=HEADERS, data=payload_c) + rspJson = response.json() + LOGGER.info(f"---接口返回状态码为:: {response.status_code}") + LOGGER.info(f"---接口返回体为:: {json.dumps(response.json(), indent=4, ensure_ascii=False)}\n") + else: + if requestType_c == "PUT": + ActIDList = Txt().read_txt("06_CreateADID.txt") + LOGGER.info(f"---新建并发布的 广告管理ID list为:{ActIDList}") + else: + ActIDList = (Txt().read_txt("06_CreateADID.txt") + + Txt().read_txt("06_ADDrawID.txt")) + LOGGER.info(f"---存为草稿&复制的 广告管理ID list为:{ActIDList}") + for i in range(len(ActIDList)): + # 暂停、重启、结束、删除 + ActId = ActIDList[i] + if ActId not in [None, '']: + api_url = api_env[ProCfgData['ExecutionEnv']] + ManagementPlatformApi_zh[caseModule_c] # 请求地址 + last_api_url = api_url.replace("{ADsID}", str(ActId)) + LOGGER.info(f"---请求接口为:{last_api_url}") + payload_c = json.dumps(eval(data['Payload']), indent=4, ensure_ascii=False) # 请求体为json格式 + LOGGER.info(f"---请求体为:{payload_c}\n") + time.sleep(0.5) + response = requests.request(method=requestType_c, url=last_api_url, headers=HEADERS, + data=payload_c) + rspJson = response.json() + LOGGER.info(f"---接口返回状态码为:: {response.status_code}") + LOGGER.info(f"---接口返回体为:: {json.dumps(response.json(), indent=4, ensure_ascii=False)}\n") + + ''' step03- 断言处理 ''' + assert _assert_result(rspJson, expRespJson_c, LOGGER) == True, AssertionError(f"---断言失败!") + LOGGER.info(f">>> {caseModule_c}接口请求 & 断言执行结束 <<<\n\n") + + +if __name__ == '__main__': + unittest.main(verbosity=2) + diff --git a/YiMao/scripts/test_07VersionManagement.py b/YiMao/scripts/test_07VersionManagement.py new file mode 100644 index 0000000..776aa68 --- /dev/null +++ b/YiMao/scripts/test_07VersionManagement.py @@ -0,0 +1,100 @@ +# !/usr/bin/python +# -*- coding: utf-8 -*- +import unittest,allure,ddt,time,json,requests,datetime +from datetime import datetime,timedelta +from configs.globalObj import LOGGER +from configs.globalParams import * +from YiMao.config.ApiInfo import * +from commons.FileHandler import ReadExcel,Txt +from commons.AssertLib import _assert_result +ExlFilePath = GlobalPath['YMDataPath'] + '/YMHT_ApiTestCase_0.0.1.xlsx' +ExcelContent = ReadExcel().get_data(FilePath=ExlFilePath, SheetName='07-版本管理') + + +@ddt.ddt +class Test_VersionManagement_Module(unittest.TestCase): + @allure.story("管理后台:版本管理模块") + @ddt.data(*ExcelContent) + def test_version_management(self, data): + '''@Date:: 2024/5/20 + @Desc:: + 管理后台 -> 版本管理模块接口 + ''' + ''' step01- 前置数据、接口信息描述等 ''' + allure.dynamic.title(data['CaseName']) + allure.dynamic.description("描述:版本管理 模块接口自动化测试") + caseModule_c = data['BusinessModule'] # 用例编号 + caseNO_c = data['NO.'] # 用例编号 + caseName_c = data['CaseName'] # 用例名称 + requestType_c = str(data['RequestType']) # 请求方式 + expStaCode_c = data['ExpStatusCode'] # 预期的状态码 + expRespJson_c = eval(data['RespJson']) # 预期的返回体 + LOGGER.info(f">>> 开始执行->{caseModule_c}接口自动化测试 <<<\n") + LOGGER.info(f"---用例编号为:{caseNO_c}") + LOGGER.info(f"---用例名称为:{caseName_c}") + LOGGER.info(f"---请求方式为:{requestType_c}") + # LOGGER.info(f"---请求Header为:{HEADERS}") + LOGGER.info(f"---预期接口返回码为:{expStaCode_c}") + LOGGER.info(f"---预期返回体为:{expRespJson_c}\n") + + ''' step02- 请求接口 ''' + if requestType_c == 'POST': + # 新建、查询 + api_url = api_env[ProCfgData['ExecutionEnv']] + ManagementPlatformApi_zh[caseModule_c] # 请求地址 + LOGGER.info(f"---请求接口为:{api_url}") + payload_c = json.dumps(eval(data['Payload']), indent=4, ensure_ascii=False) # 请求体为json格式 + LOGGER.info(f"---请求体为:{payload_c}\n") + response = requests.request(method=requestType_c, url=api_url, headers=HEADERS, data=payload_c) + rspJson = response.json() + LOGGER.info(f"---接口返回状态码为:: {response.status_code}") + LOGGER.info(f"---接口返回体为:: {json.dumps(response.json(), indent=4, ensure_ascii=False)}\n") + if "查询" not in caseName_c: + ActID = rspJson["data"]['id'] + writeResult = Txt().append_write_txt("07_CreateVersionManagementID.txt", str(ActID)) + if not writeResult: + LOGGER.error(f"---写入 版本管理(草稿)ID 失败!") + else: + if requestType_c == "PUT": + ActIDList = Txt().read_txt("07_CreateVersionManagementID.txt") + LOGGER.info(f"---新建并发布的 版本管理ID list为:{ActIDList}") + ActID = ActIDList[0] + if ActID not in [None, '']: + api_url = api_env[ProCfgData['ExecutionEnv']] + ManagementPlatformApi_zh[caseModule_c] # 请求地址 + last_api_url = api_url.replace("{VersionID}", ActID) + LOGGER.info(f"---请求接口为:{last_api_url}") + payload_c = json.dumps(eval(data['Payload']), indent=4, ensure_ascii=False) # 请求体为json格式 + LOGGER.info(f"---请求体为:{payload_c}\n") + time.sleep(0.5) + response = requests.request( + method=requestType_c, url=last_api_url, headers=HEADERS, data=payload_c) + rspJson = response.json() + LOGGER.info(f"---接口返回状态码为:: {response.status_code}") + LOGGER.info(f"---接口返回体为:: {json.dumps(response.json(), indent=4, ensure_ascii=False)}\n") + else: + ActIDList = Txt().read_txt("07_CreateVersionManagementID.txt") + LOGGER.info(f"---新建并发布的 版本管理ID list为:{ActIDList}") + for i in range(len(ActIDList)): + # 暂停、重启、结束、删除 + ActId = ActIDList[i] + if ActId not in [None, '']: + api_url = api_env[ProCfgData['ExecutionEnv']] + ManagementPlatformApi_zh[caseModule_c] # 请求地址 + last_api_url = api_url.replace("{VersionID}", str(ActId)) + LOGGER.info(f"---请求接口为:{last_api_url}") + payload_c = json.dumps(eval(data['Payload']), indent=4, ensure_ascii=False) # 请求体为json格式 + LOGGER.info(f"---请求体为:{payload_c}\n") + time.sleep(0.5) + response = requests.request( + method=requestType_c, url=last_api_url, headers=HEADERS, data=payload_c) + rspJson = response.json() + LOGGER.info(f"---接口返回状态码为:: {response.status_code}") + LOGGER.info(f"---接口返回体为:: {json.dumps(response.json(), indent=4, ensure_ascii=False)}\n") + + # ''' step03- 断言处理 ''' + assert _assert_result(rspJson, expRespJson_c, LOGGER) == True, AssertionError(f"---断言失败!") + LOGGER.info(f">>> {caseModule_c}接口请求 & 断言执行结束 <<<\n\n") + + + +if __name__ == '__main__': + unittest.main(verbosity=2) + diff --git a/YiMao/scripts/test_08UpgradeTask.py b/YiMao/scripts/test_08UpgradeTask.py new file mode 100644 index 0000000..c4558e1 --- /dev/null +++ b/YiMao/scripts/test_08UpgradeTask.py @@ -0,0 +1,106 @@ +# !/usr/bin/python +# -*- coding: utf-8 -*- +import unittest,allure,ddt,time,json,requests,datetime +from datetime import datetime,timedelta +from configs.globalObj import LOGGER +from configs.globalParams import * +from YiMao.config.ApiInfo import * +from commons.FileHandler import ReadExcel,Txt +from commons.AssertLib import _assert_result +# ExlFilePath = GlobalPath['YMDataPath'] + '/YMHT_ApiTestCase_0.0.1.xlsx' +Content = ReadExcel().get_data( + FilePath=GlobalPath['YMDataPath'] + '/YMHT_ApiTestCase_0.0.1.xlsx', + SheetName='08-升级任务' +) + + +@ddt.ddt +class Test_UpgradeTask_Module(unittest.TestCase): + @allure.story("管理后台:升级任务模块") + @ddt.data(*Content) + def test_upgrade_task(self, data): + '''@Date:: 2024/5/20 + @Desc:: + 管理后台 -> 升级任务模块接口 + ''' + ''' step01- 前置数据、接口信息描述等 ''' + allure.dynamic.title(data['CaseName']) + allure.dynamic.description("描述:升级任务 模块接口自动化测试") + + caseModule_c = data['BusinessModule'] # 用例编号 + caseNO_c = data['NO.'] # 用例编号 + caseName_c = data['CaseName'] # 用例名称 + requestType_c = str(data['RequestType']) # 请求方式 + expStaCode_c = data['ExpStatusCode'] # 预期的状态码 + expRespJson_c = eval(data['RespJson']) # 预期的返回体 + LOGGER.info(f">>> 开始执行->{caseModule_c}接口自动化测试 <<<\n") + LOGGER.info(f"---用例编号为:{caseNO_c}") + LOGGER.info(f"---用例名称为:{caseName_c}") + LOGGER.info(f"---请求方式为:{requestType_c}") + # LOGGER.info(f"---请求Header为:{HEADERS}") + LOGGER.info(f"---预期接口返回码为:{expStaCode_c}") + LOGGER.info(f"---预期返回体为:{expRespJson_c}\n") + + ''' step02- 请求接口 ''' + if requestType_c == 'POST': + # 新建、查询 + api_url = api_env[ProCfgData['ExecutionEnv']] + ManagementPlatformApi_zh[caseModule_c] # 请求地址 + LOGGER.info(f"---请求接口为:{api_url}") + payload_c = json.dumps(eval(data['Payload']), indent=4, ensure_ascii=False) # 请求体为json格式 + LOGGER.info(f"---请求体为:{payload_c}\n") + response = requests.request(method=requestType_c, url=api_url, headers=HEADERS, data=payload_c) + rspJson = response.json() + LOGGER.info(f"---接口返回状态码为:: {response.status_code}") + LOGGER.info(f"---接口返回体为:: {json.dumps(response.json(), indent=4, ensure_ascii=False)}\n") + if "查询" not in caseName_c: + ActID = rspJson["data"]['id'] + writeResult = Txt().append_write_txt("08_CreateUpgradeTaskID.txt", str(ActID)) + if not writeResult: + LOGGER.error(f"---写入 升级任务(草稿)ID 失败!") + else: + if requestType_c == "PUT": + # 编辑 + ActIDList = Txt().read_txt("08_CreateUpgradeTaskID.txt") + LOGGER.info(f"---新建的 升级任务ID list为:{ActIDList}") + ActID = ActIDList[0] + if ActID not in [None, '']: + api_url = api_env[ProCfgData['ExecutionEnv']] + ManagementPlatformApi_zh[caseModule_c] # 请求地址 + last_api_url = api_url.replace("{UpgradeID}", ActID) + LOGGER.info(f"---请求接口为:{last_api_url}") + payload_c = json.dumps(eval(data['Payload']), indent=4, ensure_ascii=False) # 请求体为json格式 + LOGGER.info(f"---请求体为:{payload_c}\n") + time.sleep(0.5) + response = requests.request( + method=requestType_c, url=last_api_url, headers=HEADERS, data=payload_c) + rspJson = response.json() + LOGGER.info(f"---接口返回状态码为:: {response.status_code}") + LOGGER.info(f"---接口返回体为:: {json.dumps(response.json(), indent=4, ensure_ascii=False)}\n") + else: + ActIDList = Txt().read_txt("08_CreateUpgradeTaskID.txt") + LOGGER.info(f"---新建的 升级任务ID list为:{ActIDList}") + for i in range(len(ActIDList)): + # 启用、禁用、删除 + ActId = ActIDList[i] + if ActId not in [None, '']: + api_url = api_env[ProCfgData['ExecutionEnv']] + ManagementPlatformApi_zh[caseModule_c] # 请求地址 + last_api_url = api_url.replace("{UpgradeID}", str(ActId)) + LOGGER.info(f"---请求接口为:{last_api_url}") + payload_c = json.dumps(eval(data['Payload']), indent=4, ensure_ascii=False) # 请求体为json格式 + LOGGER.info(f"---请求体为:{payload_c}\n") + time.sleep(0.5) + response = requests.request( + method=requestType_c, url=last_api_url, headers=HEADERS, data=payload_c) + rspJson = response.json() + LOGGER.info(f"---接口返回状态码为:: {response.status_code}") + LOGGER.info(f"---接口返回体为:: {json.dumps(response.json(), indent=4, ensure_ascii=False)}\n") + + + ''' step03- 断言处理 ''' + assert _assert_result(rspJson, expRespJson_c, LOGGER) == True, AssertionError(f"---断言失败!") + LOGGER.info(f">>> {caseModule_c}接口请求 & 断言执行结束 <<<\n\n") + + + +if __name__ == '__main__': + unittest.main(verbosity=2) + diff --git a/commons/AssertLib.py b/commons/AssertLib.py new file mode 100644 index 0000000..b2907d5 --- /dev/null +++ b/commons/AssertLib.py @@ -0,0 +1,45 @@ +# !/usr/bin/python +# -*- coding: utf-8 -*- +# @Author:: Arthur Wu +# @Date:: 2024/10/24-14:39 +# @Description:: + + +def _assert_result(RspJson, ExpRespJson_c, LOGGER): + try: + if RspJson["msg"] == "成功": + if ExpRespJson_c["msg"] == "成功": + FailedCase = [] + if ExpRespJson_c["data"] not in ['', None, True, False, "true", "false"]: + if type(RspJson["data"]) == dict: + # 0302-校验返回体中的修改的参数值是否正确 + for key, expect_value in ExpRespJson_c['data'].items(): + return_value = RspJson['data'][key] + if expect_value == return_value: + LOGGER.info(f"---接口返回体字段校验成功!\n" + f"---待校验字段为:{key},预期值为:{expect_value},返回值为:{return_value}\n") + else: + LOGGER.error(f"---接口返回体字段校验失败!字段值不正确:\n" + f"---待校验字段为:{key},预期值为:{expect_value},返回值为:{return_value}\n") + FailedCase.append(f"字段-{key}-校验失败!") + if FailedCase==[]: + return True + else: return False + elif RspJson["msg"] == "失败": + if ExpRespJson_c["msg"] == "失败": + return True + else: + LOGGER.error(f"---接口请求成功! 校验失败!接口返回信息:{RspJson['msg']}") + return False + elif ExpRespJson_c["msg"] == "请求参数错误": + if RspJson["msg"] == "请求参数错误": + return True + else: + LOGGER.error(f"---接口请求成功! 校验失败!接口返回信息:{RspJson['msg']}") + return False + else: + LOGGER.error(f"---接口请求失败! 错误信息:{RspJson['msg']}") + return False + except AssertionError as e: + LOGGER.error(f"---断言失败!错误信息:{e}") + return False \ No newline at end of file diff --git a/commons/Common.py b/commons/Common.py index a3cb5ab..eb7abf5 100644 --- a/commons/Common.py +++ b/commons/Common.py @@ -1,8 +1,27 @@ -# !/usr/bin/python # -*- coding: utf-8 -*- -'''@Author:: Arthur Wu -@Date:: 2024/10/8 +import os,sys,random,string +import time, datetime +class Common(): + def __init__(self): + self.timestamp = int(time.time()) + self.Datetime = time.strftime('%Y%m%d%H%M%S', time.localtime(time.time())) + self.today_date = datetime.date.today().strftime('%Y-%m-%d') + self.rootpath = os.path.dirname(os.path.dirname(__file__)) + def return_folder(self): + ReportPath = os.path.join(self.rootpath, 'YiMao/reports', str(self.Datetime)).replace("\\", "/") + if not os.path.exists(ReportPath): + os.makedirs(ReportPath) + return ReportPath + '/' + + def delete_txt_files(self): + txtPath = os.path.join(self.rootpath, 'YiMao/ProcessData') + for root, dirs, files in os.walk(txtPath): + for file_name in files: + if file_name.endswith('.txt'): + file_path = os.path.join(root, file_name) + os.remove(file_path) + print(f"已删除: {file_path}") \ No newline at end of file diff --git a/commons/EngineX.py b/commons/EngineX.py new file mode 100644 index 0000000..041f34a --- /dev/null +++ b/commons/EngineX.py @@ -0,0 +1,107 @@ +# !/usr/bin/python +# -*- coding: utf-8 -*- +'''@Author:: Arthur Wu +@Date:: 2024/10/8 +''' +import os,pytest,subprocess,json,shutil,time,requests +from configs.globalObj import * +from configs.globalParams import * + +class Engine(): + + def __init__(self): + self.CasesSuite = [] + self.rootpath = os.path.dirname(os.path.dirname(__file__)) + self.FolderPath = ReturnFolder + self.projectCasesPath = str(os.path.join(GlobalPath['YMCaseScriptsPath']).replace("\\", "/")) + self.ReportName = "Reports" + + def __execute(self): + '''@Author:: Arthur Wu + @Date:: 2024/5/9 + :return: + ''' + for dirpath, dirnames, filenames in os.walk(self.projectCasesPath): + for fn in filenames: + if fn.startswith("test_"): + caseScriptPath = os.path.join(dirpath, fn).replace("\\", "/") + self.CasesSuite.append(caseScriptPath) + if 0 == len(self.CasesSuite): + raise ValueError("---[ERROR] the test suite was empty !") + else: + pytest.main(args=[*self.CasesSuite, '-vsq', '--alluredir', self.FolderPath]) + subprocess.Popen( + "allure generate " + self.FolderPath + ' -o ' + self.FolderPath + "html" + + ' --workers=2 '+'--tests-per-worker=2', + shell=True, + stdout=subprocess.PIPE).stdout.read() + LOGGER.info("---[INFO] Allure html report generate complete !") + + def __move_file(self): + rootpath = (os.getcwd()).replace("\\", "/") + pathli = rootpath.split("/") + LastReportPath = '' + PathList = self.FolderPath.split("/") + try: + LastReportPath = "D:/Program Files/AutoTestReports/" + shutil.move(self.FolderPath, LastReportPath) + except Exception as e: + LOGGER.error(f"---Move the html report file error: {e}") + return os.path.join(LastReportPath, PathList[-2]).replace("\\", "/") + + def __delete_pycache_dirs(self, target_dir): + for root, dirs, files in os.walk(target_dir): + for dir_name in dirs: + if dir_name == '__pycache__': + dir_path = os.path.join(root, dir_name) + shutil.rmtree(dir_path) + print(f"已删除: {dir_path}") + + def __delete_txt_files(self, target_dir): + for root, dirs, files in os.walk(target_dir): + for file_name in files: + if file_name.endswith('.txt'): + file_path = os.path.join(root, file_name) + os.remove(file_path) + print(f"已删除: {file_path}") + + def run_test_suite(self): + txtPath = os.path.join(self.rootpath, "YiMao/ProcessData") + self.__delete_pycache_dirs(self.rootpath) + self.__delete_txt_files(txtPath) + self.__execute() + returnList = [] + lastReportPath = self.__move_file() + returnList.append(lastReportPath) + self.__delete_txt_files(txtPath) + self.__delete_pycache_dirs(self.rootpath) + return returnList + +class NotificationModule(): + def __init__(self): + self.__headers = {'Content-Type': 'application/json;charset=utf-8'} + datainfo = { + "Debug": "7aedbee7239870e3e653748a2889d8bf063c61efa9213c7099bd57476066dc86", + "Formal": "80b026022a28166cfc9eebaf8f6a880cc06f56a14b8803e8d67e7fb3cb05844e" + } + self.urlInfo = f'https://oapi.dingtalk.com/robot/send?access_token={datainfo["Debug"]}' + # self.urlInfo = f'https://oapi.dingtalk.com/robot/send?access_token={datainfo["Formal"]}' + self.ReportUrl = ProCfgData["ReportsURL"] + self.ExecutionEnvironment = ProCfgData["ExecutionEnv"] + + def send_msg(self, ResultPath): + ReportPath = os.path.join(ResultPath[0], 'html', 'index.html').replace('\\', '/') + reportUrlpath = self.ReportUrl + ReportPath.split("AutoTestReports")[1] + my_data = { + "msgtype": "markdown", + "markdown": { + "title": "亿猫管理后台接口自动化测试", + "text": f"#### 亿猫管理后台({self.ExecutionEnvironment})环境自动化测试执行结束: \n" + f">#### [自动化测试报告链接(请点击查看)]({reportUrlpath})\n>\n" + } + } + sess = requests.session() + sess.keep_alive = False + requests.post(url=self.urlInfo, data=json.dumps(my_data), headers=self.__headers, verify=False) + sess.close() + diff --git a/commons/FileHandler.py b/commons/FileHandler.py new file mode 100644 index 0000000..ec12386 --- /dev/null +++ b/commons/FileHandler.py @@ -0,0 +1,65 @@ +# -*- coding: utf-8 -*- +import os, xlrd, yaml +from openpyxl import load_workbook + +class YamlHandler(): + '''@Author:: Arthur Wu + @Date:: 2024/5/8 + @Description:: + ''' + def read_yaml(self, YamlFilePath, encoding='utf-8'): + try: + with open(YamlFilePath, encoding=encoding) as f: + return yaml.load(f.read(), Loader=yaml.FullLoader) + except Exception as e: + print("ERROR: read yaml file error::".format(e)) + return 'failed to read avata autotest config file.' + +class ReadExcel(object): + '''@Author:: Arthur Wu + @Date:: 2024/5/8 + @Description:: + ''' + def get_data(self, FilePath, SheetName="Sheet1"): + data = load_workbook(FilePath) + table = data[SheetName] + nrows = table.max_row + ncols = table.max_column + if nrows > 1: + test_data = [] + for row in range(2, nrows + 1): + sub_data = {} + for colum in range(1, ncols + 1): + sub_data[table.cell(1, colum).value] = table.cell(row, colum).value + test_data.append(sub_data) + return test_data + +class Txt(): + '''@Author:: Arthur Wu + @Date:: 2024/5/8 + @Description:: + ''' + def __init__(self): + rootpath = os.path.dirname(os.path.dirname(__file__)) + self.record_files_path = os.path.join(rootpath, 'YiMao/ProcessData').replace("\\", "/") + + def read_txt(self, FileName): + filepath = os.path.join(self.record_files_path, FileName) + AllLineValue = [] + if os.path.exists(filepath): + with open(filepath, "r", encoding='utf-8') as file: + for lineval in file: + newlineval = lineval.strip() + AllLineValue.append(newlineval) + return AllLineValue + + def append_write_txt(self, FileName, Message): + try: + filepath = os.path.join(self.record_files_path, FileName) + with open(filepath, "a", encoding='UTF-8') as f: + f.write(Message + '\n') + return True + except Exception as e: + print("Error: append_write_txt error::" + str(e)) + return False + diff --git a/commons/Logger.py b/commons/Logger.py new file mode 100644 index 0000000..c519234 --- /dev/null +++ b/commons/Logger.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# @Time : +# @Author : +# @File : Logger.py +# @Software: PyCharm +import logging, os, time +from time import localtime + +class Singleton: + _instance = None + + def __new__(cls, *args, **kwargs): + if cls._instance is None: + cls._instance = super(Singleton, cls).__new__(cls) + return cls._instance + + def __init__(self, LogPath, FileName='YMAutotest'): + def __logging(LogPath, FileName): + datetime = time.strftime("%Y%m%d%H%M%S", localtime()) + filepath = f'{LogPath}{FileName}_{datetime}.log' + controlshow = logging.StreamHandler() + controlshow.setLevel(logging.INFO) + logging.basicConfig( + filename=filepath, + filemode="w", + level=logging.INFO, + format='%(asctime)s %(filename)s [line:%(lineno)d] %(levelname)s——: %(message)s \n', + datefmt='%Y%m%d %H:%M:%S' + ) + return logging + self.logging = __logging(LogPath, FileName) diff --git a/commons/PgSqlLib.py b/commons/PgSqlLib.py new file mode 100644 index 0000000..ab9aa4f --- /dev/null +++ b/commons/PgSqlLib.py @@ -0,0 +1,97 @@ +# -*- coding: utf-8 -*- +from sshtunnel import SSHTunnelForwarder +import psycopg2 + +class PGSQL(): + def __init__(self): + ssh_host = 'ops.yimaogo.com' + ssh_username = 'yimaogo_test' + ssh_pwd = 'yimaogo!test@1234' + ssh_port = 22 + db_host = '10.0.16.24' + db_port = 5432 + db_dbname = 'yimaogo_test' + db_user = 'yimaogo_test' + db_password = 'yimaogo!test@1234' + self.ssh_server = SSHTunnelForwarder( + ssh_address_or_host=(ssh_host, ssh_port), + ssh_username=ssh_username, + ssh_password=ssh_pwd, + remote_bind_address=(db_host, db_port) + ) + self.ssh_server.daemon_forward_servers = False + self.ssh_server.start() + self.conn = psycopg2.connect( + database=db_dbname, + user=db_user, + password=db_password, + host='127.0.0.1', + port=self.ssh_server.local_bind_port + ) + self.cursor = self.conn.cursor() + + def close(self): + self.cursor.close() + self.conn.close() + self.ssh_server.close() + + def select_data(self, SQL): + self.cursor.execute(SQL) + # 获取查询结果 + # rows = self.cursor.fetchone() + # print(rows) + rows = self.cursor.fetchall() + # print(rows) + # for row in rows: + # print(row) + return rows + + def delete_data(self, SQL): + self.cursor.execute(SQL) + self.conn.commit() + + def del_sample_activity_data(self, IDList=None): + import time + print('---开始删除派样活动自动化测试脏数据') + for SampActivityID in IDList: + # for SampActivityID in range(120, 140): + print(f'---待删除ID为:{SampActivityID}') + selsqlstr = f'SELECT * FROM public.sample_activity WHERE id={SampActivityID};' + delsqlstr = [ + f"DELETE FROM public.sample_activity_gift WHERE activity_id={SampActivityID};", + f"DELETE FROM public.sample_record WHERE activity_id={SampActivityID};", + f"DELETE FROM public.sample_activity_store WHERE activity_id={SampActivityID};" + f"DELETE FROM public.sample_activity WHERE id={SampActivityID};" + ] + for s in delsqlstr: + time.sleep(0.5) + self.delete_data(s) + time.sleep(0.5) + self.select_data(selsqlstr) + self.close() + print("---删除 派样活动 脏数据结束!\n") + + def del_coupon_activity_data(self, IDList=None): + try: + import time + print('---开始删除 优惠券活动 自动化测试脏数据') + for ActivityID in IDList: + # for ActivityID in range(251, 264): + print(f'---待删除ID为:{ActivityID}') + selsqlstr = f'SELECT * FROM public.coupon_setting WHERE id={ActivityID};' + delsqlstr = [ + f"DELETE FROM public.coupon_setting_distribution WHERE coupon_setting_id={ActivityID};", + f"DELETE FROM public.coupon_setting WHERE id={ActivityID};", + ] + for s in delsqlstr: + time.sleep(0.5) + self.delete_data(s) + time.sleep(0.5) + self.select_data(selsqlstr) + self.close() + print("---删除派样活动脏数据结束!\n") + return "---[Successed]" + except Exception as e: + print(f"---删除派样活动脏数据失败: {e}\n") + return e + diff --git a/commons/SignatureYM.py b/commons/SignatureYM.py new file mode 100644 index 0000000..e8f8f65 --- /dev/null +++ b/commons/SignatureYM.py @@ -0,0 +1,32 @@ +# !/usr/bin/python +# -*- coding: utf-8 -*- +from authlib.integrations.requests_client import OAuth2Session + + +class SignatureYM(): + + def __init__(self): + self.client_id = "95579765e4fe91af9962" + self.client_secret = "3dcb964ede5d455f1d54623dad5e496bff468f81" + self.redirect_uri = 'https://auth.yimaogo.com/api/callback' + self.authorization_base_url = 'https://auth.yimaogo.com/api/login/oauth/authorize' + self.token_url = 'https://auth.yimaogo.com/api/login/oauth/access_token' + + def __tokens(self): + oauth = OAuth2Session(self.client_id, redirect_uri=self.redirect_uri) + authorization_url, state = oauth.create_authorization_url(self.authorization_base_url) + token_dict = oauth.fetch_token(self.token_url, authorization_response={}, client_secret=self.client_secret) + return token_dict["access_token"] + + def return_headers(self): + tokens = self.__tokens() + headers = { + 'Authorization': tokens, + 'User-Agent': 'Apifox/1.0.0 (https://apifox.com)', + 'Content-Type': 'application/json', + 'Accept': '*/*', + 'Host': 'api.test.yimaogo.com', + 'Connection': 'keep-alive' + } + return headers + diff --git a/configs/Configs.yaml b/configs/Configs.yaml new file mode 100644 index 0000000..325e5d0 --- /dev/null +++ b/configs/Configs.yaml @@ -0,0 +1,8 @@ +############################################# +############### 测试环境配置文件 ############### +############################################# +# 1-执行环境:测试环境-test_env;灰度环境-gray_env +ExecutionEnv: test_env + +# 2-Reports URL +ReportsURL: http://192.168.1.165 diff --git a/configs/globalObj.py b/configs/globalObj.py new file mode 100644 index 0000000..fba4754 --- /dev/null +++ b/configs/globalObj.py @@ -0,0 +1,8 @@ +# !/usr/bin/python +# -*- coding: utf-8 -*- +from commons.Logger import Singleton +from commons.Common import Common as c + +ReturnFolder = c().return_folder() +LOGGER = Singleton(ReturnFolder).logging +LOGGER.info("---hello world!") diff --git a/configs/globalParams.py b/configs/globalParams.py new file mode 100644 index 0000000..73ab22e --- /dev/null +++ b/configs/globalParams.py @@ -0,0 +1,36 @@ +# !/usr/bin/python +# -*- coding: utf-8 -*- +import os,datetime,time +from datetime import datetime,timedelta +from commons.FileHandler import YamlHandler as yam +from commons.SignatureYM import SignatureYM + + +__RootPath = os.path.dirname(os.path.dirname(__file__)).replace("\\", "/") +__YamlFilePath = os.path.join(__RootPath, "configs/Configs.yaml").replace("\\", "/") +ProCfgData = yam().read_yaml(__YamlFilePath) +HEADERS = SignatureYM().return_headers() +GlobalPath = { + "CfgPath": os.path.join(__RootPath, 'configs').replace("\\", "/"), + "YMDataPath": os.path.join(__RootPath, 'YiMao/data').replace("\\", "/"), + "YMCfgPath": os.path.join(__RootPath, 'YiMao/config').replace("\\", "/"), + "YMCaseScriptsPath": os.path.join(__RootPath, 'YiMao/scripts').replace("\\", "/"), + "YMReportPath": os.path.join(__RootPath, 'YiMao/report').replace("\\", "/") +} +GlobalParams = { + "timeStamp": int(time.time()), + "todayDate": time.strftime('%Y-%m-%d'), + "todayDateDel1": (datetime.now() + timedelta(days=-1)).strftime('%Y-%m-%d'), + "todayDateAdd1": (datetime.now() + timedelta(days=1)).strftime('%Y-%m-%d'), + "todayDateAdd2": (datetime.now() + timedelta(days=2)).strftime('%Y-%m-%d'), + "todayDateAdd3": (datetime.now() + timedelta(days=3)).strftime('%Y-%m-%d'), + "todayDateAdd4": (datetime.now() + timedelta(days=4)).strftime('%Y-%m-%d'), + "todayDateAdd5": (datetime.now() + timedelta(days=5)).strftime('%Y-%m-%d'), +} + + + + + + + diff --git a/pytest.ini b/pytest.ini new file mode 100644 index 0000000..e89ae49 --- /dev/null +++ b/pytest.ini @@ -0,0 +1,13 @@ +[pytest] +testpaths = YiMao/ +addopts = -p no:warnings +log_cli = True +markers = + webtest: Run the Avata Open API case + hello: Run the hello case +log_level = INFO +log_cli_level = INFO +log_format = %(asctime)s %(levelname)s %(message)s +log_cli_format = %(asctime)s %(levelname)s %(message)s +log_date_format = %H:%M:%S +log_cli_date_format = %H:%M:%S