requests的分层架构与断言和邮件的运用
一、新建项目


二、新建6个包
(1)conf包 参数包
(2)api包 组建接口
(3)testcase 用例包
(4)run 运行包
(5)report 报告包
(6)utils 工具类包

第一个配置包:存放请求参数


案例:
登录接口
url1 = "http://49.233.201.254:8080/cms/manage/loginJump.do" # 接口的url
data1 = {
"userAccount": "admin",
"loginPwd": 123456
} # 接口的请求参数
headers1 = {"Content-Type": "application/x-www-form-urlencoded"} # 接口请求类型
查询用户接口
url2 = "http://49.233.201.254:8080/cms/manage/queryUserList.do"
data2 = {
"startCreateDate": "", "endCreateDate": "",
"searchValue": "", "page": 1
}
headers2 = {"Content-Type": "application/x-www-form-urlencoded"}
查询栏目接口
url3 = "http://49.233.201.254:8080/cms/manage/findCategoryByPage.do"
data3 = {"parentId": "", "categoryName": "", " page": 1}
headers3 = {"Content-Type": "application/x-www-form-urlencoded"}
查询资讯接口
url4 = "http://49.233.201.254:8080/cms/manage/findArticleByPage.do"
data4 = {"categoryId": "", "startCreateDate": "", " endCreateDate": "", " articleTitle": "",
"page": 1}
headers4 = {"Content-Type": "application/x-www-form-urlencoded"}
第二包:api包组建接口

案例:
import requests
from conf.cms_conf import *
s=requests.Session()
class Cms(object):
def init(self):
pass
def dl(self):
dx=s.post(url=url1,data=data1,headers=headers1)
print(dx.json())
def yh(self):
dx=s.post(url=url2,data=data2,headers=headers2)
print(dx.json())
def lm(self):
dx = s.post(url=url3, data=data3, headers=headers3)
print(dx.json())
def zx(self):
dx = s.post(url=url4, data=data4, headers=headers4)
print(dx.json())
if name == 'main':
d=Cms()
d.dl()
d.yh()
d.zx()
d.lm()
第三个种包:testcase用例包
编写用例和管理用例的包

案例:
import unittest
from api.cms_api import *
class cms_case(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
pass
@classmethod
def tearDownClass(cls) -> None:
pass
def setUp(self) -> None:
pass
def tearDown(self) -> None:
pass
def test1(self):
Cms().dl() #通过类名调用组建好的接口
def test2(self):
Cms().yh()
def test3(self):
Cms().lm()
def test4(self):
Cms().zx()
if name == 'main':
unittest.main()
第四种包:run运行包

其他包 ,见名思意。
总结:
首先在pycharm里新建一个项目,然后构建6个包,分别是api构建包、conf配置包、report报告包、run运行包、testcase用例包以及utils工具包。
其中api包用来组建并发送接口请求,conf包用来存放所有接口的入参信息,report包用来放置运行所有测试用例生成的报告,run包用来自动加载所有的测试用例、并且运行,testcase包用来继承unittest单元测试框架、组建接口测试用例,utils包用来存放发送邮件和生成报告模块。
然后,在conf包中把参数值都写好,比如url、data和header;在api包中组建接口和发送接口请求,导入request和conf,参数名引用conf里面的,创建一个全局的session对象用来保持会话的状态和管理上下文,把各个接口的请求方式编写出来,同时用rep.json()来转换,全部封装在一个类里;在testcase包中组建测试用例导入unittest模块、api里面的Cms类,定义一个类,且继承unittest中的TestCase,用匿名对象来调用实例方法,然后进行断言,需要注意的是断言内容要与结果完全一致;最后,在run包里导入unittest、time、mail3、HTMLTestRunner,定义项目的路径、用例的路径、测试报告的名称、定义自动搜索用例,执行测试用例并生成报告,其中的时间戳也需要注意一下;此时,测试用例报告就会在report包里,最后用谷歌浏览器打开就可以查看了。
在分层结构中加入断言
在cms_api和cms_testcase两个py文件中编写

在 cms_api的文件中编写
将响应体转换成json格式,通过reture返回

案例:import requests
from conf.cms_conf import *
s=requests.Session()
class Cms(object):
def init(self):
pass
def dl(self):
dx=s.post(url=url1,data=data1,headers=headers1)
print(dx.json())
js=dx.json() #转换成json格式
return js #返回值 #{'code': '200', 'msg': '登录成功!', 'model': {}}
def yh(self):
dx=s.post(url=url2,data=data2,headers=headers2)
print(dx.json())
js1=dx.json()
return js1
def lm(self):
dx = s.post(url=url3, data=data3, headers=headers3)
print(dx.json())
def zx(self):
dx = s.post(url=url4, data=data4, headers=headers4)
print(dx.json())
if name == 'main':
d=Cms()
d.dl()
d.yh()
d.zx()
d.lm()
在cms_tasecase文件通过assert断言

案例:import unittest
from api.cms_api import *
class cms_case(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
pass
@classmethod
def tearDownClass(cls) -> None:
pass
def setUp(self) -> None:
pass
def tearDown(self) -> None:
pass
def test1(self):
a=Cms().dl() #通过类名调用组建好的接口
# assert a["msg"]== "查询用户成功!"
# assert a["msg"] == "登录成功!"
# {'code': '200', 'msg': '登录成功!', 'model': {}}
def test2(self):
c1=Cms().yh()
# assert c1['msg']=="查询用户成功!" #成功就执行运行
assert c1['msg'] == "查询用户成功" #断言失败
def test3(self):
Cms().lm()
def test4(self):
Cms().zx()
if name == 'main':
unittest.main()
总结:我的理解是,先在api包中转换格式,然后再在用例包中断言
邮件发送


163邮箱链接:https://mail.163.com/js6/main.jsp?sid=YLZhjKoNeSZLYPABHNKgloDpIWKbGfjZ&df=mail163_letter#module=welcome.WelcomeModule|{}
授权码获取


授权码:JSgPesR3n82fA2N7


调用这个邮箱(1)导入邮箱模块


案例:

浙公网安备 33010602011771号