api: 这是一个package,用来各个接口的类封装,按照你的业务可以将其分为多个package
common: 这是一个package,用来封装底层公共方法,比如requests库封装、文件操作封
装、加解密封装、redis封装、数据库封装、随机数据封装、日志封装
testcases: 这是一个package,用来编写封装我们的测试用例
confifig: 这是一个目录,用来存放基本的配置信息,比如数据库、redis、各个服务域名、各个
环境的配置
data:这是一个目录,用来存放测试用例数据
logs: 这是一个目录,用来存放收集到的日志文件
report: 这是一个目录,用来存放测试结果数据以及生成的测试报告
conftest.py: 用来重写pytest自带的一些钩子函数以及自定义的fifixture
pytest.ini: pytest的基本配置文件
run.py: 框架整体的统一执行入口
# 导包
import requests
token = None
# get
def getRequest():
# GET请求方式
resq = requests.get(
'https://www.qidian.com/ajax/Free/getSysTime?_csrfToken=gug6vyoHkNrG2oYkn0z2F7VDf7o2UCCPrDFrpDIT')
# 返回响应的内容
print('get接口返回值:', resq.text)
# 打印返回的状态码
print('Get打印返回的状态码', resq.status_code)
# 返回JSON格式的内容
print('get返回JSON格式的内容', resq.json())
print('------------------------------------------------------------------------------------')
# json
# json 表示使用application/json方式提交请求。接收方request.body的内容为’{“a”: 1, “b”: 2}'的这种形式;
def postJsonReqest():
# Post方式请求json格式,使用Json请求参数
json = {
"userName": "admin",
"password": "123456"
}
# 请求JSON类型的接口
resq = requests.post('http://localhost:8888/community/flogin', json=json)
print(f'登录接口返回的Json{resq.json()}')
# 定义全局变量
global token
# 提取登录接口返回的token为全局变量,后面接口使用
token = resq.json()['data']['token']
print(f'提取登录接口的token值:{token}')
print('------------------------------------------------------------------------------------')
# files
# 文件上传
def postFilesRequest():
# 请求上传文件类型的接口,使用files
# 以二进制的形式,打开读取文件
f = open('../data/test.jpg', 'rb')
# 读取文件
f.read()
# 定义一个files的字典,便于把读取到的二进制文件传入请求体中
files = {'file': f}
# 由于这个接口需要登录的token才能登录,将token放到headers中
headers = {'token': token}
# 发起文件请求接口,传入文件参数和请求头中的token参数
resq = requests.post('http://localhost:8888/community/ImageController', files=files, headers=headers)
print('文件类型接口返回值', resq.text)
print('------------------------------------------------------------------------------------')
f.close()
# form-data 表单类型接口
# 表示使用application/form-urlencode方式提交请求,接收方request.body的内容为a=1&b=2的这种形式;
def postFormDataRequest():
# Post方式请求json格式,使用Json请求参数
data = {
"title": "自动化"
}
# 请求JSON类型的接口
headers = {'token':token}
resq = requests.post('http://localhost:8666/api/article/queryAllArticle2', data=data,headers=headers)
print(f'form-data接口返回的值{resq.json()}')
print('------------------------------------------------------------------------------------')
if __name__ == '__main__':
# get请求
getRequest()
# post josn
postJsonReqest()
# post Files
postFilesRequest()
# post data
postFormDataRequest()
打印结果展示
args :是 arguments 的缩写,表示位置参数;
kwargs: 是 keyword arguments 的缩写,表示关键字参数。
*和**:是python中两种可变参数的形式,且*args 必须放在 **kwargs 的前面,因为位置参数在关键字参数的前面。
*args就是就是传递一个可变参数列表给函数实参,这个参数列表的数目未知;
例如:我们要开发个加法计算器,我们可以输入多个数值进行相加,由于我们不知道会输入多少个,这个时候可以使用*args
# 常规加法计算器
def add_test1(args=None):
sum = 0
if args is not None:
for i in args:
sum = sum + i
return sum
# *args加法计算器
def add_test(*args):
# 打印下args
print(args)
# 由此可以见args为元组类型
print(type(args))
# 循环便利args,求和
sum = 0
for i in args:
sum = i + sum
return sum
if __name__ == '__main__':
sum = add_test(1,2,3,4,5,6,7,8)
print(f'常规加法计算:{sum}')
#可传元组或者列表
sum = add_test1((1, 2, 3, 4, 5, 6, 7, 8))
print(f'*args加法计算:{sum}')
# print(sum)
打印结果如图:
**kwargs则是将一个可变的关键字参数的字典传给函数实参,同样参数列表长度可以为0或为其他值。
例如:一个函数,传一个字典,字典的KEY的个数最多是三个,但是字典的KET可以不完全都传,如果某个KEY没传,就把他的Value处理为空;
# 定义一个字典用来存储学生的信息
students = [
dict(userName="小明", age=18, sex="男"),
dict(userName="小红", age=17)
]
def selectUserInfo(**kwargs):
# 解包后的是字典的KEY值
print('解包后的是字典的KEY值:', *kwargs)
print('前端传入的kwargs:', kwargs)
print('kwargs的类型:', type(kwargs))
# 判断kwargs中的传入的参数是否传入,如果未传入,将未传入的值置空
if 'userName' not in kwargs.keys():
kwargs['userName'] = ''
if 'age' not in kwargs.keys():
kwargs['age'] = ''
if 'sex' not in kwargs.keys():
kwargs['sex'] = ''
print('处理后的kwargs:', kwargs)
print('-----------------------------------')
if __name__ == '__main__':
Json1 = {
"userName": "小明",
"age": 18
}
Json2 = {
"userName": "小红",
"age": 17,
"sex": "男"
}
# *作为从传参的时候相当于解包的作用
selectUserInfo(**Json1)
# 等价于,传键值对
selectUserInfo(userName='小明',age = 18)
selectUserInfo(**Json2)
import requests
class RequestsClient:
# 使用类属性来定一个session,他将作为所有接口发起的全局对象
session = requests.session()
# 初始化数据,如果参数没传的情况下将参数置为None
def __init__(self):
self.session = RequestsClient.session
self.method = None
self.url = None
self.data = None
self.headers = None
self.files = None
self.json = None
self.params = None
self.resp = None
#封装requests请求
def sendRequest(self, **kwargs):
# 如果调用方,没有传任何的参数,那么就使用该对象的默认属性参数
if 'url' not in kwargs.keys():
kwargs['url'] = self.url
if 'method' not in kwargs.keys():
kwargs['method'] = self.method
if 'headers' not in kwargs.keys():
kwargs['headers'] = self.headers
if 'data' not in kwargs.keys():
kwargs['data'] = self.data
if 'json' not in kwargs.keys():
kwargs['json'] = self.json
if 'files' not in kwargs.keys():
kwargs['files'] = self.files
if 'params' not in kwargs.keys():
kwargs['params'] = self.params
self.resp = self.session.request(**kwargs)
#等价于
# self.resp = self.session.request(url=kwargs['url'],method=kwargs['method'],headers=kwargs['headers'],data=kwargs['data'],json=kwargs['json'],params=kwargs['params'],files=kwargs['files'])
return self.resp
if __name__ == '__main__':
json = {
"userName": "admin",
"password": "123456"
}
request = RequestsClient()
resp = request.sendRequest(method='post',url='http://localhost:8888/community/flogin', json=json)
print(resp.json())