2023年7月10日发(作者:)
Pythonpytest+allure的接⼝⾃动化测试框架⼀粒沙⾥见世界⼀朵花⾥见天国⼿掌⾥盛住⽆限⼀刹那便是永劫简单的项⽬结构运营平台项⽬baseApi:封装请求接⼝的api类,⽬前只使⽤到⼀个,代码如下import requests'''封装请求接⼝的函数,适合于需要校验登录权限的接⼝,设置_headers为了减少再参数化⽤例的时候减少headers: xxx的步骤加上**kwargs的参数为了请求接⼝便于传⼊其他参数,例如cookies= xx, files= xx'''def send(body, headers=None, **kwargs): if headers is None: headers = { "Accept-Language": "zh-CN,zh;q=0.9", "Content-Type": "application/json" } return t(**body, headers=headers, **kwargs)report:存放接⼝报告的⽂件夹testCase:存放测试案例testData:存放测试数据,yaml的数据配置⽂件testSuites:需要进⾏测试的类,或者说接⼝⽂件详解conftest:测试案例中需要使⽤的前置请求⽐如登录,数据库连接请求等。testCase的conftest⽂件代码import pymssql#
登录运营平台@e(scope="class") #⽣效级别为class,详情请参照pytest,conftest⽂件的使⽤def login(): headers = { "User-Agent": "Chrome/10", "flag": "guns", "Content-Type": "application/json" } body = { "username": "rhcj-gbl", "password": "123456", "addressmac": "04:0E:3C:D2:D0:B7" } data = (body) response = ('登录的url/login', data=data, headers=headers) cookie = s return cookie#
建⽴数据库连接@e(scope="class") #
⽣效级别为classdef db(): db = t("host", "dbhtnews_dev", "MqfUcGymupuTmsad", "DBHTNews_DEV") return dbtestSuites及部分代码注意,这⾥的request_body和cookie都是从testData⾥边进⾏读取的数据,这⾥只写两个参数即可,参数的值应该体现在testcase⾥边传过来from import send#
获取资讯类型信息def newsinfo_getType(request_body, cookie): response = send(request_body, cookies=cookie) return response#
获取资讯⼦类型(等价类-科创板)def newsinfo_getSubType(request_body, cookie): response = send(request_body, cookies=cookie) return response#
资讯新建(等价类-⼆次编辑,科创板,⽆标题H5模板)def newsinfo_add(request_body, cookie): response = send(request_body, cookies=cookie) return response#
资讯查询(资讯标题查询)def newsinfo_list_byTitle(request_body, cookie): response = send(request_body, cookies=cookie) return responsetestCase及部分代码import pytestimport yamlfrom testSuites import marketInfoimport allureimport jsonfrom import log@e('市场信息菜单接⼝') #
⽤于⽣成测试报告的模块说明class TestMarketInfo: #
注意!此时yml⽂件中的格式必须是mapping格式,不然不能进⾏**解包 with open('../testData/', 'r', encoding='utf-8') as f: data = _load(f) @('新闻资讯-获取资讯类型') #
⽤于⽣成测试报告的功能说明 @trize('body', data['newsinfo_getType']) def test_newsinfo_getType(self, login, db, body): # login参数为conftest⽂件的⽤户登录接⼝ newsTypeLists = [] #
资讯类型列表 newsOpenTypeLists = [] #
打开类型列表 newsFuntypeLists = [] #
功能类型列表 newsTypeDb = [] #
数据库查询资讯类型查询结果表 openNewsTypeDb = [] #
数据库打开类型查询结果表 funTypeDb = [] #
数据库功能类型查询结果表 response = fo_getType(body, login) # login即:send函数中cookies=login,base中提到的**kwages作⽤显现 resdict = () newsTypeList = resdict['newsTypeList'] newsOpentypeList = resdict['newsOpentypeList'] newsPushtitle = resdict['newsPushtitleList'][0]['typename'] newsFuntypeList = resdict['newsFuntypeList'] for i in newsTypeList: (i['typename']) for j in newsOpentypeList: (j['typename']) for k in newsFuntypeList: (k['typename']) try: #
创建数据库游标 cursor = () sql_newsType = 'select typename from t_news_type where deleted = 0' e(sql_newsType) resultNewsType = ll() for i in resultNewsType: (i[0]) sql_openNewsType = 'select typename from t_news_opentype where deleted = 0' e(sql_openNewsType) resultOpenNewsType = ll() resultOpenNewsType = ll() for j in resultOpenNewsType: (j[0]) sql_newsFunType = 'select typename from t_news_funtype where deleted = 0' e(sql_newsFunType) resultNewsFunType = ll() for k in resultNewsFunType: (k[0]) () except Exception: raise Exception('查询失败') (_code == 200) (newsTypeLists == newsTypeDb) (newsOpenTypeLists == openNewsTypeDb) (newsPushtitle == '资讯') (newsFuntypeLists == funTypeDb) @('新闻资讯-获取资讯⼦类型') @trize('body', data['newsinfo_getSubType']) def test_newsinfo_getSubType(self, login, db, body): subtypelists = [] subTypeDb = [] response = fo_getSubType(body, login) print(()) resdict = () subtypelist = resdict["subtypeList"] for i in subtypelist: (i['typename']) try: cursor = () #
注意SqlServer的字符串要⽤单引号''包裹,不然会查询失败 sql_subtype = "select typename from t_news_subtype where newstypeid='D003381E-FD30-43AD-BEC7-067E6D7360BC'' 'and deleted=0" e(sql_subtype) resultSubType = ll() for i in resultSubType: (i[0]) () except Exception: raise Exception('查询失败') (_code == 200) (subtypelists == subTypeDb) @('资讯新建接⼝') @trize('body', data['newsinfo_add']) def test_newsinfo_add(self, login, body): response = fo_add(body, login) (_code == 200) @('资讯查询接⼝') @trize('body', data['newsinfo_list']) def test_newsinfo_list(self, login, body): response = fo_list_byTitle(body, login) (()['rows'][0]['title'] == '接⼝测试-科创板') (_code == 200)@trize是pytest传递参数的装饰器,这⾥表⽰从data(testData/)yml⽂件中读取,⽂件结构为{key1: [{key2: value2},{key3:value3}],[{},{}]}的形式,key1:当前接⼝所需要的测试数据key值(我这⾥想在⼀个yml⽂件中配置多条接⼝的⼊参⽂件,所以⽤字典的key来区分每个case应该调⽤的对应参数,如果不区分也可以,但是⼀个接⼝就需要⼀个yml配置⽂件,这样未免过于繁琐,不利于维护);key2;key3就表⽰该接⼝的body,也就是接⼝⼊参了,当⼀条case需要执⾏多种参数变化时(即在⼀个case⾥边执⾏多个不同⼊参的情况),可以在⼊参列表(或者元组)中,添加⼦列表⼊参,该装饰器会依次把每个⼦列表的⼊参传递给接⼝进⾏执⾏,相当于⼀个循环执⾏⼀个case的过程。详细的内容可以查看pytest的官⽅⽂档。()为断⾔⽅法,这⾥不⽤assert因为assert会再执⾏报错的时候就停⽌执⾏,⽽⽅法可以报错后保留报错信息,之后继续往下执⾏案例testData部分⼊参信息,不⽤管⽂件(这⾥我是⽤于调试读取⽂件⽤的)举例案例中⽤到的是中的⼊参,所以—部分参数信息,如果是不需要⼊参的,⽐如get请求不需要参数进⾏查询,那么不写这部分的⼊参即可,即json为空#
新建资讯,获取类型newsinfo_getType:- method: 'post' url: "接⼝url+路径" #这⾥只是查询接⼝,所以不需要json段的⼊参,这⾥可以不写#
新建资讯,
获取资讯⼦类型newsinfo_getSubType:- method: 'post' url: '接⼝url+路径' json: newsTypeid: 'D003381E-FD30-43AD-BEC7-067E6D7360BC'#
新建资讯(⼆次编辑,科创板,⽆标题 H5模板)newsinfo_add:#
⼆次编辑- method: 'post' url: "接⼝url+路径" json: displatform: 1 content: "
123
" ischangevido: False ismodifyvido: False deleted: False endtime: "2020-06-02 16:58:32" categoryArray: - "3F6F6B29-C1CE-400E-B048-175D0D28AF6B" istop: "0" dataTime: - "2020-06-01 16:58:32" - "2020-06-02 16:58:32" isdefault: False ispush: False newsfuntypeid: "00000000-0000-0000-0000" newsopentypeid: "1796B11D-4AE5-4CF3-9731-DCF4C09AF657" newspushtitleid: "0DEF1DCA-C40B-45EC-93B9-9D43E50C4834" newssubtypeid: "B3D96CD3-9BA7-4F8F-98A2-385A6BFDF625" source: "xxx证券" starttime: "2020-06-01 16:58:32" title: "接⼝测试-⼆次编辑" isheadlines: "0" isheadlines: "0" topstate: "0" showdisclaimer: "0" foothtml: ""#科创板- method: 'post' url: "接⼝url+路径" json: displatform: 2 content: "
这是⼀条接⼝脚本数据
我是⼀个⽆标题H5模板啊
" ischangevido: False ismodifyvido: False deleted: False endtime: "2020-06-30 10:13:57" categoryArray: - "3F6F6B29-C1CE-400E-B048-175D0D28AF6B" istop: "0" dataTime: - "2020-06-09 10:13:57" - "2020-06-30 10:13:57" isdefault: False ispush: False newsfuntypeid: "00000000-0000-0000-0000" newsopentypeid: "1796B11D-4AE5-4CF3-9731-DCF4C09AF657" newspushtitleid: "0DEF1DCA-C40B-45EC-93B9-9D43E50C4834" newssubtypeid: "214DFFD7-9683-4048-99CD-31D636542BCB" readtotal: "10" source: "xxx证券" starttime: "2020-06-09 10:13:57" starttime: "2020-06-09 10:13:57" title: "接⼝测试-⽆标题H5模板" isheadlines: "0" topstate: "0" showdisclaimer: "0" foothtml: "资讯查询newsinfo_list:- method: 'post' url: '接⼝url+路径' json: limit: 20 offset: 0 sort: "" order: "" newsOpenType: "" displatform: "" newsSubType: "377B3F93-E7DA-40FD-BAD2-4260826CE267" newsType: "D003381E-FD30-43AD-BEC7-067E6D7360BC" newsState: [] state: "" title: "接⼝测试-科创板" modifydate: [] modifyby: "" isheadlines: "" topstate: ""这⾥的数据也就是函数的body⼊参,返回值**body会对body整体进⾏解包,即实际传⼊接⼝的⽅式为:t(method="post/", url="请求的接⼝", json="json格式的⼊参"/或者data="data格式的⼊参",**kwargs(这个根据⾃⼰需要的其他参数进⾏扩展加⼊))body格式:method: 请求⽅法(post, get, )url: 请求的接⼝url(url+接⼝路径)json: # json格式的⼊参,根据⾃⼰接⼝⼊参的格式,有可能是data类型, key1: value1 key2: value2整个项⽬简单的架构就到这⾥,下边我们来看执⾏测试报告的部分,这⾥我们⽤allure的插件。安装配置allure1. 安装allure(python)测试报告插件库:pip install allure-pytest2. 运⾏⽣成测试结果:pytest <测试⽬录> --alluredir <测试结果存放⽬录>例:pytest test --alluredir report/allure_origin注意!这个时候allure_origin⾥边的数据只是测试结果(⽂件),还不是测试报告3. ⽣成直观的测试报告:从官⽹下载,zip包,解压到相关⽬录(我这⾥是D:Softwareallurelib)下,同时把加压后的bin⽬录添加到环境变量PATH中,就额可以⽤allure命令了,因为allure是java编写的,所以这⾥需要安装jkd环境,这⾥就不说怎么安装jdk了。4. ⽣成测试报告:allure generate
发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1688931546a184827.html
评论列表(0条)