po模式--接口自动化测试
对暴风平台的测试:以下是po模式接口自动化测试的基本结构
common 公共里面public.py页面
#! /usr/bin/env python # -*- coding:utf-8 -*- # author:张红 import os # 基础路径 def base_dir(): return os.path.dirname(os.path.dirname(__file__)) # print(base_dir()) '''这个主要是对动态参数的处理''' # 读取文件里面的参数 def getID(filename): with open(file=os.path.join(base_dir(),'data',filename),mode='r')as f: return f.read() # 将参数写入文件 def writeID(filename,countent): with open(file=os.path.join(base_dir(),'data',filename),mode='w')as f: f.write(countent)
config:配置文件里面的yaml文件(用来分离端口和域的)
url:
nameport: http://xx.xx.xxx.xx:xxxx
data里面的json文件,存放的是测试中用到的数据 data包里面也会存放上边写的动态参数的文件
{ "name": "无涯", "product_type": "WEB", "version": "1", "master": "1", "description": "1", "modifyname": "小明", "modifyproduct_type": "APP", "modifyversion": "1.0.1", "modifymaster": "化", "modifydescription": "这个是测试", "login": {"username":"13xxxxxxxxx","password":"xxxxxx"} }
page:对象层页面
login.py页面
#! /usr/bin/env python # -*- coding:utf-8 -*- # author:张红 import requests from common.public import writeID from utils.operationJson import readJson from common.public import getID from utils.operationJson import readYaml # 数据格式是json,如果要用data参数,就需要对请求参数进行序列化处理 def login(): # dict1 = {"username":readJson()['username'],"password":readJson()['password']} r = requests.post( # url=readJson()['geturl']+'/login/auth/', url=readYaml()['url']['nameport'] + '/login/auth/', json=readJson()['login'], headers={'Content-Type': 'application/json;charset=UTF-8'} ) # 产品登录成功后,会生成一个token,我们再访问其他页面的时候会带上这个token,为了方便,我们把它写入到一个文件中 # 文件名是token,参数是从响应对象中获取的token值 writeID(filename='token',countent=str(r.json()['token'])) # print(r.json()['token']) # login() # 由于多处都用到这个请求头 ,在这个把这个请求头单独写出来了,之后需要的时候只需要调用即可 def headers(): return {'Authorization':'JWT {token}'.format(token=getID(filename='token'))}
baofeng.py页面
#! /usr/bin/env python # -*- coding:utf-8 -*- # author:张红 import requests from common.public import writeID from common.public import getID from utils.operationJson import readJson import json from page.login import headers from utils.operationJson import readYaml # 定义一个增加产品的函数 def addProduct(name, product_type, version, master, description): r = requests.post( url=readYaml()['url']['nameport']+'/interface/product/', json={"name": name, "product_type": product_type, "version": version, "master": master, "description": description}, headers=headers() ) writeID(filename='productID', countent=str(r.json()['id'])) return r # 定义一个删除产品的函数 def delProduct(): r = requests.delete( url=readYaml()['url']['nameport']+'/interface/product/{productID}/'.format( productID=getID(filename='productID')), headers=headers() ) return r # 定义一个修改产品的函数 def modifyProduct(name,product_type,version,master,description): r=requests.put( url=readYaml()['url']['nameport']+'/interface/product/{productID}/'.format(productID=getID(filename='productID')), headers=headers(), json={"name":name,"product_type":product_type,"version":version,"master":master,"description":description} ) return r # 定义一个查询产品的函数 def queryProduct(queryname): r=requests.get( url=readYaml()['url']['nameport']+'/interface/products?name=', headers=headers() ) return r
run:存放的是运行文件
import time # 时间 import unittest # 加载测试模块 import os # 处理路径 import HTMLTestRunner # 生成测试报告必须要用的库 def getSuite(): # start_dir=加载所有的测试模块来执行,pattern=通过正则的模式加载所有的模块 '''获取所有执行的测试模块''' suite = unittest.TestLoader().discover( start_dir=os.path.dirname(os.path.dirname(__file__)), pattern='test_*.py' ) return suite # 获取当前时间 def getNowtime(): return time.strftime("%y-%m-%d %H_%M_%S",time.localtime(time.time())) # 执行获取的测试模块,并获取测试报告 def main(): filename=os.path.join(os.path.dirname(os.path.dirname(__file__)),'report',getNowtime()+"report.html") # print(filename) # 把测试报告写入文件中,b是以二进制的方式写入 fp=open(filename,"wb") # HTMLTestRunner实例化的过程,stream是流式写入,title是测试报告的标题,description是对测试报告的描述 runner=HTMLTestRunner.HTMLTestRunner( stream=fp, title="接口自动化测试报告", description="基于python语言的接口自动化测试实战" ) runner.run(getSuite()) if __name__=="__main__": main()
test测试层:
test_login.py
#! /usr/bin/env python # -*- coding:utf-8 -*- # author:张红 import unittest import requests import time as t from page.login import login from page.login import headers from utils.operationJson import readJson from utils.operationJson import readYaml class LoginTest(unittest.TestCase): def setUp(self) -> None: t.sleep(2) # 这个pass是后续没有任何操作 def tearDown(self) -> None: pass # 测试首页 def test_fengbao_index(self): r = requests.get( url=readYaml()['url']['nameport']+'/interface/index', headers=headers() ) self.assertEqual(r.json()['count']['api'],0) self.assertEqual(r.status_code, 200) if __name__ == '__main__': unittest.main(verbosity=2)
test_baofeng.py
#! /usr/bin/env python # -*- coding:utf-8 -*- # author:张红 import time as t import json from utils.operationJson import readJson from test.test_login import LoginTest from page.baofeng import * class Fengbao(LoginTest): # 测试添加产品 def test_addProduct(self): r = addProduct(name=readJson()['name'], product_type=readJson()['product_type'], version=readJson()['version'], master=readJson()['master'], description=readJson()['description']) delProduct() self.assertEqual(r.status_code, 201) # 测试删除产品 def test_delProduct(self): addProduct(name=readJson()['name'], product_type=readJson()['product_type'], version=readJson()['version'], master=readJson()['master'], description=readJson()['description']) r=delProduct() self.assertEqual(r.status_code, 204) # 测试修改产品名称 def test_modifyProduct_name(self): addProduct(name=readJson()['name'], product_type=readJson()['product_type'], version=readJson()['version'], master=readJson()['master'], description=readJson()['description']) r=modifyProduct(name=readJson()['modifyname'], product_type=readJson()['product_type'], version=readJson()['version'], master=readJson()['master'], description=readJson()['description']) delProduct() self.assertEqual(r.json()['name'],'小明') self.assertEqual(r.status_code,200) # 修改产品类型 def test_modifyProduct_product_type(self): addProduct(name=readJson()['name'], product_type=readJson()['product_type'], version=readJson()['version'], master=readJson()['master'], description=readJson()['description']) r=modifyProduct(name=readJson()['name'], product_type=readJson()['modifyproduct_type'], version=readJson()['version'], master=readJson()['master'], description=readJson()['description']) delProduct() self.assertEqual(r.json()['product_type'],'APP') self.assertEqual(r.status_code,200) # 修改产品版本 def test_modifyProduct_version(self): addProduct(name=readJson()['name'], product_type=readJson()['product_type'], version=readJson()['version'], master=readJson()['master'], description=readJson()['description']) r = modifyProduct(name=readJson()['name'], product_type=readJson()['product_type'], version=readJson()['modifyversion'], master=readJson()['master'], description=readJson()['description']) delProduct() self.assertEqual(r.json()['version'], '1.0.1') self.assertEqual(r.status_code, 200) #修改产品作者 def test_modifyProduct_master(self): addProduct(name=readJson()['name'], product_type=readJson()['product_type'], version=readJson()['version'], master=readJson()['master'], description=readJson()['description']) r = modifyProduct(name=readJson()['name'], product_type=readJson()['product_type'], version=readJson()['version'], master=readJson()['modifymaster'], description=readJson()['description']) delProduct() self.assertEqual(r.json()['master'], '化') self.assertEqual(r.status_code, 200) # 修改产品描述 def test_modifyProduct_description(self): addProduct(name=readJson()['name'], product_type=readJson()['product_type'], version=readJson()['version'], master=readJson()['master'], description=readJson()['description']) r = modifyProduct(name=readJson()['name'], product_type=readJson()['product_type'], version=readJson()['version'], master=readJson()['master'], description=readJson()['modifydescription']) delProduct() self.assertEqual(r.json()['description'], '这个是测试') self.assertEqual(r.status_code, 200) # 模糊查询 def test_queryProduct_vague(self): addProduct(name=readJson()['name'], product_type=readJson()['product_type'], version=readJson()['version'], master=readJson()['master'], description=readJson()['description']) r=queryProduct(queryname='无') delProduct() self.assertEqual(r.status_code,200) # 搜索查询 def test_queryProduct_query(self): addProduct(name=readJson()['name'], product_type=readJson()['product_type'], version=readJson()['version'], master=readJson()['master'], description=readJson()['description']) r = queryProduct(queryname='') delProduct() self.assertEqual(r.status_code,200) # 精确查询 def test_queryProduct_accurate(self): addProduct(name=readJson()['name'], product_type=readJson()['product_type'], version=readJson()['version'], master=readJson()['master'], description=readJson()['description']) r = queryProduct(queryname='无涯') delProduct() self.assertEqual(r.status_code,200) if __name__ == '__main__': unittest.main(verbosity=2)
utils:里面写工具类 operationJson.py 页面
#! /usr/bin/env python # -*- coding:utf-8 -*- # author:张红 import os.path from common.public import base_dir import json import yaml def readJson(): return json.load(open(file=os.path.join(base_dir(),'data','fengbao.json'),encoding='utf-8')) # print(readJson()) def readYaml(): with open(file=os.path.join(base_dir(),'config','url.yaml'),encoding="utf-8")as f: return yaml.safe_load(f) # print(readYaml())
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)