一.安装pytest:
pip install pytest
二.默认规则:
1. .py文件必须以test_开头或者_test结尾
2. 类名必须以Test开头
3.测试用例必须以test_开头
三.实例写法:
import pytest
import requests
class TestSend:
def test_edit_flag(self):
# 注册接口
url = "http://127.0.0.1:1234/reg"
# 上传参数
date = {
"username": "123456",
"password": "123456wh"
}
# post请求
res = requests.post(url, json=date)
print(res.json())
if __name__ == '__main__':
pytest.main()
此为标准写法
注意:若是需要显示打印的语句修改成 pytest.main(【‘-vs’】),这样才会显示打印的语句,否则在方法中打印的语句不显示
演示:
import requests
class TestSend:
def test_get_token(self):
url = "http://127.0.0.1:1234/reg"
data = {
"username": "admin",
"password": "1admin23"
}
rep = requests.post(url,data=data)
content = rep.content.decode("utf-8-sig") # 去掉UTF-8 BOM,否则会出现报错
token = rep.json()['token'] #获取用户token
print(json.loads(content))
def test_edit_flag(self):
# 注册接口
url = "http://127.0.0.1:1234/reg"
# 上传参数
date = {
"username": "123456",
"password": "123456wh"
}
# post请求
res = requests.post(url, json=date)
print(res.json())
if __name__ == '__main__':
pytest.main(['-vs'])
# 发送post请求只需要传date或者是json其中一个
# urlpost = "http://cloud.qishanyundao.com/canteen_admin/src/request/auth2.php"
# datapost = {"tag": {
# "username": "admin",
# "password": "1admin23"
# }}
# rep= requests.post(urlpost,datapost)
# print(rep.json())
在以上数据中第一个方法中的token在第二个方法中是无法访问的,因为他们并不处于一种方法里面,咱们可以在变量名前面加上类名.后设置一个类变量就可以访问了
实例:
import json
import pytest
import requests
class TestSend:
token = "" #类变量
def test_get_token(self):
url = "http://cloud.qishanyundao.com/canteen_admin/src/request/auth2.php"
data = {
"username": "admin",
"password": "1admin23"
}
rep = requests.post(url,data=data)
content = rep.content.decode("utf-8-sig") # 去掉UTF-8 BOM,否则会出现报错
json_data = json.loads(content)#content为字符串对象有json方法
TestSend.token = json_data['token']#jsondata是字典对象没有json方法
print(json.loads(content))
def test_edit_flag(self):
# 注册接口
url = "http://127.0.0.1:1234/reg"
# 上传参数
date = {
"username": "123456",
"password": "123456wh"
}
# post请求
res = requests.post(url, json=date)
print(res.json())
print(TestSend.token) #打印类变量
if __name__ == '__main__':
pytest.main(['-vs'])
注意:
get请求通过params传递参数
post请求通过json或者data传递参数
data:
数据报文:dict字典类型的,那么默认情况下请求头为applilcation-www-from-urlencoded,表示以from进行传参,格式为:a=1&b=2
数据报文:str类型,那么默认情况下:test/plain
json:
数据报文:不管是字典还是字符串类型,默认都是application/json,格式{“a”:1,"b":2}
以下两个方法是用户Json数据转换时常用的方法
json.dumps(data)//序列化可以把字典转化为字符串
json.loads(data)//反序列化可以把字符串转化为字典
总结:
data只能传输简单的只有键值对的字典或者字符串格式
json只能传输字典格式或者简单的嵌套关系
文件上传:
def test_file_uplosd(self):
url= "https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=ACCESS_TOKEN"
date={
"access_token":"",
"media":"" #这个内容传输的是文件的路径,使用open(r"文件路径")来选择文件路径
}
rep= requests.post(url,files=date)#文件传输使用files进行传参
print(rep.json())
上述为上传文件的实例
当需要请求需要带请求头的接口怎么写
#请求需要带请求头的接口
def test_login(self):
url="http://127.0.0.1/phpwind/"
data={
"username":"",
"password":""
}
headers = {
"Accept":"application/json",
"X-re":"XML"
}
rep = requests.post(url,data=data,headers=headers)#添加请求头的方式
print(rep.json())
请求网页接口都需要进行cookie鉴权 仅靠cookie鉴权并不常用
但是值得注意的是一般来说,都是通过session实现cookie鉴权的
接口自动化框架封装,统一请求方式:
requests.request() 请求方式都换为此方法,之后在方法里面写get或者是post等请求方式
获取session对象,然后使用对象发送请求,实例如下
def get_session(self):
session = requests.session()
return session
def test_get_token(self):
url = "http://cloud.qishanyundao.com/canteen_admin/src/request/auth2.php"
data = {
"username": "admin",
"password": "1admin23"
}
rep = self.get_session().request("post",url, data=data)#用session方法发送请求
content = rep.content.decode("utf-8-sig") # 去掉UTF-8 BOM,否则会出现报错
json_data = json.loads(content) # content为字符串对象有json方法
TestSend.token = json_data['token'] # jsondata是字典对象没有json方法
TestSend.cookie = rep.cookies
print(json.loads(content))
此方式就不需要获取cookie了,不同的项目不受影响
session = requests.session()
def test_get_token(self):
url = "http://cloud.qishanyundao.com/canteen_admin/src/request/auth2.php"
data = {
"username": "admin",
"password": "1admin23"
}
rep = TestSend.session.request("post",url, data=data)
content = rep.content.decode("utf-8-sig") # 去掉UTF-8 BOM,否则会出现报错
json_data = json.loads(content) # content为字符串对象有json方法
TestSend.token = json_data['token'] # jsondata是字典对象没有json方法
TestSend.cookie = rep.cookies
print(json.loads(content))