# DPHSimpleAuto **Repository Path**: sharkblue-ls/DPHSimpleAuto ## Basic Information - **Project Name**: DPHSimpleAuto - **Description**: 一个简单的支持api与webui自动化测试框架 - **Primary Language**: Python - **License**: AGPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2024-05-08 - **Last Updated**: 2025-07-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: Python, httpx, DrissionPage, 接口自动化, webUI自动化 ## README # 一、项目结构介绍 ### 1.api api目录下用于存放python编写的接口测试用例,可新建目录用于模块区分 ### 2.common comcom目录下存放基础方法 api.py用于编写api相关方法 web.py用于编写webUI相关方法 base.py用于编写通用方法 ### 3.data api目录下用于存放excel编写的接口用例文件 ### 4.excutions api_main_test.py用于执行api用例编写的方法 web_main_test.py用于执行webUI用例编写的方法 ### 5.logs reports用于存放执行api或webUI用例生成的报告文件,包括api_result_data.xlsx、 api_test_report.html、web_result_data.xlsx、web_test_report.html。 xlsx文件保存测试结果数据,html即为html报告 screenshots目录用于保存webUI执行产生的截图 reports与screenshots下均以年月日生成目录,区分每天的执行结果 ### 6.settings global_parameters.yml保存常用配置信息 ### 7.templates api_report_template与web_report_template分别存放生成api或webUI测试报告的html、css、js文件 ### 8.web web目录下用于存放python编写的webUI测试用例,可新建目录用于模块区分 # 二、api接口-python编写方法介绍 ```python from common.api import get_api_response # 定义全局变量,供后续用例使用 xmjFbfxkId = '' xmjLibraryId = '' xmjFxkId = '' @get_api_response def get_xmj_list(client, host): """项目节库-列表-查询""" # 请求地址 url = host + '/jspro/gateway/entitytype-service/xmjLibrary/getXmjList' # 请求参数 data = {'name': '', 'version': '', 'flat': 'true', 'currentPage': '1', 'pageSize': '10'} # 获取响应结果 response = client.get(url, params=data) # 断言,返回True或False validator = True if response.json()['data'][0]['name'] == '11' else False # 设置全局变量 globals()['xmjLibraryId'] = response.json()['data'][0]['id'] return response, validator, data ``` 1.get_api_response用于收集测试执行结果 2."""项目节库-列表-查询"""方法描述用于测试结果中记录为用例名称,如未编写则取方法名get_xmj_list 3.client为httpx.Client()实例,host为服务地址 4.validator断言在用例中编写,返回True或False 5.globals()['xmjLibraryId']用于提取参数,供后续用例使用或其他模块用例使用 6.返回response、validator、data,测试结果收集 7.如对请求头或其他业务有需求,根据实际需要编写,保证用例格式正确即可 # 三、webUI-python编写方法介绍 ```python from common.base import get_global_parameters def login(page): """登录""" # 获取parameters参数中用户名、密码 parameters = get_global_parameters() username = parameters['login']['username'] password = parameters['login']['password'] # 等待工作台可被点击 page.ele('text:工作台').wait.clickable() # 点击工作台,展开页面 page.ele('text:工作台').click() # 定位到账号输入框,输入账号 page.ele('#username').input(username) # 定位到密码输入框,输入密码 page.ele('#password').input(password) # 定位到验证码输入框,输入验证码 page.ele('#captcha').input('1234') # 点击登录按钮 page.ele('text=登 录').click() # 等待页面进入加载状态,避免跳转前的页面拥有和跳转后页面相同定位符的元素 page.wait.load_start() # 选择第一个应用点击进入页面 page.ele('@@class=title@@title=深高顾BIM智慧建设平台').click() # 判断首页菜单是否可点击,可点击即判定登录成功 page.ele('@class:e9c8db805d7e48549f45a7aadd6ee570').wait.clickable() ``` 1.get_global_parameters用于获取global_parameters.yml中数据 2.page.ele('text:工作台'),(text:工作台)为根据html中text值定位,:为模糊匹配,=为精确匹配 3.page.ele('#username'),#为id定位,.为class定位,同样:为模糊匹配,=为精确匹配 4.page.ele('@@class=title@@title=深高顾BIM智慧建设平台'),@@为双条件与定位,@|为双条件或定位 5.x://*[@id="root-slave"]/div/div[1]为xpath定位 6.更多使用方法请参考DrissionPage使用手册:https://drissionpage.cn/ 7.用例格式同样如上所示,可以在用例结尾判断执行结果,当用例未找到元素时会记为失败 # 四、api接口-excel编写方法介绍 ![api-excel-case.png](logs%2Fpics%2Fapi-excel-case.png) ![api-excel-data.png](logs%2Fpics%2Fapi-excel-data.png) 1.expected_code为断言状态码 2.expected_result为断言响应结果,支持字符模糊匹配、 数据库结果(查询结果中的第一行第一个字段)模糊匹配响应结果、json断言、re断言、&&为与多条件断言、 ||为或多条件断言,&&与||不能同时存在 3.url中$host为获取excel中data列的host值,暂不支持全获取或定位获取,也未支持获取其他参数值 4.$size引用单个参数,可为excel中data的数据,也可为提取的参数 5.$size[1]定位获取参数,从0开始编号,即获取第二个值,对应样例即为50 6.$size[all]获取全部值,会生成全部用例,对应样例会生成10、50、100的三条用例 7.xmjLibraryId=[data][0][id]为json格式提取参数,对应响应结果中data下第一条数据的id 8.xmjSchemeId="id":"(.*?)"为re格式提取,对应响应结果中所有id的值 9.暂只支持get、post请求,其他类型请求可能会有问题 10.data格式暂只支持表单和json格式,其他格式暂未支持 11.skip为1跳过执行,其他正常执行 # 五、定时任务 ```python def blockingscheduler(): """ 运行定时任务,持续运行 :return: """ logging.basicConfig() logging.getLogger('apscheduler').setLevel(logging.DEBUG) config = { # 作业存储器配置 使用MySQL数据库存储 # 'apscheduler.jobstores.default': { # 'type': 'sqlalchemy', # 'url': 'mysql://root:123.com@127.0.0.1:3306/job?charset=utf8' # }, # 执行器配置 使用线程池执行器,最大10个线程 'apscheduler.executors.default': { 'class': 'apscheduler.executors.pool:ThreadPoolExecutor', 'max_workers': '10' }, # Job配置,为新任务关闭合并模式 'apscheduler.job_defaults.coalesce': 'false', # Job配置,同一个任务同一时间最多只能有3个实例在运行 'apscheduler.job_defaults.max_instances': '3', # Job配置,指定时区 'apscheduler.timezone': 'Asia/Shanghai', } # 实例化调度器 scheduler = BlockingScheduler(config) try: logger.info('定时任务开始执行') # 指定任务在2024年6月28日13时47分00秒执行 # scheduler.add_job(run_api_test, trigger=DateTrigger(run_date='2024-06-28 14:48:00')) # 指定任务在每月28日14时08分执行,from_crontab(minute hour day month week) scheduler.add_job(run_api_excel, trigger=CronTrigger.from_crontab('43 17 * * *')) # scheduler.add_job(run_web_test, trigger=CronTrigger.from_crontab('28 15 * * *')) # 开始执行定时任务调度器 scheduler.start() except (KeyboardInterrupt, SystemExit): logger.error("进程已结束运行") scheduler.shutdown() ``` 1.executions/scheduler.py编写了定时任务,修改对应时间即可定时执行 # 六、测试报告介绍 ### api测试报告 ![api-report-1.png](logs%2Fpics%2Fapi-report-1.png) ![api-report-2.png](logs%2Fpics%2Fapi-report-2.png) ![api-report-3.png](logs%2Fpics%2Fapi-report-3.png) ### web测试报告 ![web-report.png](logs%2Fpics%2Fweb-report.png)