接口测试--requests
接口自动化测试使用到的库是requests库
请求方法:
get、post、put、delete
请求头:
headers={" ":" "}
请求参数:
json= 或者data=json:
请求头中是application/json就写 “json=....”
data:
请求头中是表单 就写“data=....”
如果请求头是json,想要使用data请求参数,你们需要进行序列化的处理 "data=json.dumps(.....)"
r=requests.方法(url=" ",json={ },headers={ }) ----------r是响应数据的接收变量
协议状态码:r.status_code
响应数据:r.text
字典类型的响应数据: r.json()
二进制:r.content
响应头:r.headers
响应时间:r.elapsed.seconds
r.text和r.content区别:
用了request.get方法后,返回一个response对象,这个对象里面存的是服务器返回的所有信息,包括响应头,响应状态码等。
其中返回的网页部分会存在.content和.text两个对象中。如果需要获得这些网页原始数据,我们可以通过r.text 或 r.content来获取数据。
- .text 存的是.content 编码后的字符串
- .content中间存的是字节码
一般来说 .text直接用比较方便,返回的是字符串,但是有时候会解析不正常,导致返回的是一堆乱码。这时需要用.content.decode('utf-8'),使其正常显示。
总的来说.text是现成的字符串,.content还要编码,但是.text不是所有时候显示都正常(需要用.content.decode()进行手动编码)
想要提取文本就用text,但是如果你想要提取图片、文件,就要用到content.
下面以百度为例,使用get方法来访问百度主页,并且输出状态码、响应数据...


请求参数为json= 还是data=
1 ''' 2 json: 3 请求头是application/json时使用 4 data: 5 请求头是表单时使用 6 如果请求头是json时,想要使用data请求参数,就需要进行序列化的处理 7 ''' 8 9 # 测试平台的登录接口为例 通过抓包获取到请求方法 请求地址 请求参数 请求头(请求头也要带大括号) 10 r=requests.post( 11 url="http://47.95.142.233:8000/login/auth/", 12 json={"username":"13484545195","password":"asd888"}, 13 headers={"Content-Type":"application/json"} 14 ) 15 16 print(r.status_code) 17 print(r.json()) 18 print(json.dumps(r.json(),indent=True,ensure_ascii=False)) # json序列化 格式化的输出 19 print(r.json()["token"])
当json类型时,如果使用data=,需要序列化处理:
1 r=requests.post( 2 url="http://47.95.142.233:8000/login/auth/", 3 data=json.dumps({"username":"13484545195","password":"asd888"}), 4 headers={"Content-Type":"application/json"} 5 )
以测试平台为例:
定义函数writeToken和readToken,从登录接口的响应数据中获取token 使用writeToken把token值写入“token”文件。使用格式化输出的方式 ,在别的接口中的请求头中调用readToken函数把“token”文件中的token值获取出来。
初始化动作为登录,因为增删改查操作的前置动作都是需要登录。清理动作为pass,什么也不做。
在添加产品(增删改查)的方法中都返回一个r,用在测试方法的断言中。
断言时注意r.json()返回的是字典格式,所以获取字典格式的value值是使用键来获取的。json()["xxx"]
1 import unittest 2 import requests 3 import json 4 5 '''把内容写入文件,给文件名一个默认参数是“token”''' 6 def writeToken(content,fileName="token"): 7 with open(fileName,"w",encoding="utf-8")as f: 8 f.write(content) 9 10 '''读取文件 默认是“token”''' 11 def readToken(fileName="token"): 12 with open(fileName,"r",encoding="utf-8")as f: 13 return f.read() 14 15 '''初始化动作 为登录,并且把登录接口获取的token写到文件中''' 16 class TestLogin(unittest.TestCase): 17 def setUp(self) -> None: 18 r=requests.post( 19 url="http://47.95.142.233:8000/login/auth/", 20 data=json.dumps({"username": "13484545195", "password": "asd888"}), 21 headers={"Content-Type": "application/json"} #请求头也要写成json格式 22 ) 23 writeToken(content=r.json()["token"]) 24 25 #清理动作 什么都不做 26 def tearDown(self) -> None: 27 pass 28 29 def test_platform_index(self): 30 '''验证查看首页''' 31 r=requests.get( 32 url="http://47.95.142.233:8000/interface/index", 33 headers={"Authorization":"JWT {token}".format(token=readToken())}) 34 self.assertEqual(r.status_code,200) 35 self.assertEqual(r.json()["count"]["product"],0) 36 37 def addProduct(self): 38 '''添加产品的方法''' 39 r=requests.post( 40 url="http://47.95.142.233:8000/interface/product/", 41 json={"name":"111","product_type":"WEB","version":"3","master":"3","description":"3"}, 42 headers={"Authorization": "JWT {token}".format(token=readToken())}) 43 writeToken(fileName="productID",content=str(r.json()["id"])) #从添加产品接口获取产品id,把id写入productID文件,是int类型强制转换为str 44 return r 45 46 def delProduct(self): 47 '''删除产品的方法,删除产品没有参数''' 48 r=requests.delete( 49 url="http://47.95.142.233:8000/interface/product/{productID}/".format( 50 productID=readToken(fileName="productID") 51 ), #产品id调用 52 headers={"Authorization": "JWT {token}".format(token=readToken())}) 53 return r 54 55 def test_platform_add_product(self): 56 '''验证添加产品''' 57 r=self.addProduct() #r接收添加产品方法中的r(也就是把方法和用例联系起来) 58 print(r.json()) 59 self.assertEqual(r.status_code,201) 60 self.delProduct() 61 62 def test_platform_del_product(self): 63 '''验证删除产品''' 64 self.addProduct() #r接收添加产品方法中的r(也就是把方法和用例联系起来) 65 r=self.delProduct() 66 self.assertEqual(r.status_code, 204) 67 68 if __name__ == '__main__': 69 unittest.main()
实例:
做测试平台的改和查的操作
这里的writeToken 和readToken函数使用了默认参数的思想,就是默认文件名为“token2”。在添加产品时使用了
writeToken(fileName="productID2",content=str(r.json()["id"]))
将添加产品中获取到的产品id ,写入productID2这个文件中。
1 import unittest 2 import requests 3 import json 4 5 def writeToken(content,fileName="token2"): 6 with open(fileName,"w",encoding="utf-8") as f: 7 f.write(content) 8 9 def readToken(fileName="token2"): 10 with open(fileName,"r",encoding="utf-8") as f: 11 return f.read() 12 13 class TestLogin(unittest.TestCase): 14 def setUp(self) -> None: 15 r=requests.post( 16 url="http://47.95.142.233:8000/login/auth/", 17 json={"username":"13484545195","password":"asd888"}, 18 headers={"Content-Type":"application/json"}) 19 writeToken(content=r.json()["token"]) 20 21 def tearDown(self) -> None: 22 pass 23 24 def addProduct(self,name,product_type,version,master,description): 25 r=requests.post( 26 url="http://47.95.142.233:8000/interface/product/", 27 json={"name":name,"product_type":product_type,"version":version,"master":master,"description":description}, 28 headers={"Authorization":"JWT {token}".format(token=readToken())} 29 ) 30 writeToken(fileName="productID2",content=str(r.json()["id"])) 31 return r 32 33 def findProduct(self,findname): 34 r=requests.get( 35 url="http://47.95.142.233:8000/interface/products?name=findname".format(findname=findname), 36 headers={"Authorization": "JWT {token}".format(token=readToken())} 37 ) 38 return r 39 40 def delProduct(self): 41 r=requests.delete( 42 url="http://47.95.142.233:8000/interface/product/{productID}/".format(productID=readToken(fileName="productID2")), 43 headers={"Authorization":"JWT {token}".format(token=readToken())} 44 ) 45 46 def modProduct(self,name,product_type,version,master,description): 47 r=requests.put( 48 url="http://47.95.142.233:8000/interface/product/{productID}/".format(productID=readToken(fileName="productID2")), 49 json={"name":name,"product_type":product_type,"version":version,"master":master,"description":description,"id":"{productID}".format(productID=readToken(fileName="productID2"))}, 50 headers={"Authorization":"JWT {token}".format(token=readToken(fileName="token2"))} 51 ) 52 return r 53 54 def test_platform_mod_productName(self): 55 '''验证修改产品名称''' 56 self.addProduct(name="abcd",product_type="WEB",version="1",master="j",description="产品描述") 57 r=self.modProduct(name="qwerty",product_type="WEB",version="1",master="j",description="产品描述") 58 self.delProduct() 59 self.assertEqual(r.json()["name"],"qwerty") 60 61 def test_platform_mod_productType(self): 62 '''验证修改产品类型''' 63 self.addProduct(name="abcd",product_type="WEB",version="1",master="j",description="产品描述") 64 r=self.modProduct(name="abcd",product_type="APP",version="1",master="j",description="产品描述") 65 self.delProduct() 66 self.assertEqual(r.json()["product_type"],"APP") 67 68 def test_platform_mod_productVersion(self): 69 '''验证修改产品版本''' 70 self.addProduct(name="abcd",product_type="WEB",version="1",master="j",description="产品描述") 71 r=self.modProduct(name="abcd",product_type="WEB",version="2",master="j",description="产品描述") 72 self.delProduct() 73 self.assertEqual(r.json()["version"],"2") 74 75 def test_platform_mod_productMaster(self): 76 '''验证修改产品负责人''' 77 self.addProduct(name="abcd",product_type="WEB",version="1",master="j",description="产品描述") 78 r=self.modProduct(name="abcd",product_type="WEB",version="1",master="jrq",description="产品描述") 79 self.delProduct() 80 self.assertEqual(r.json()["master"],"jrq") 81 82 def test_platform_mod_productDes(self): 83 '''验证修改产品描述''' 84 self.addProduct(name="abcd",product_type="WEB",version="1",master="j",description="产品描述") 85 r=self.modProduct(name="abcd",product_type="WEB",version="1",master="j",description="产品的描述") 86 self.delProduct() 87 self.assertEqual(r.json()["description"],"产品的描述") 88 89 def test_platform_find_product(self): 90 '''验证模糊查询''' 91 self.addProduct(name="abcd",product_type="WEB",version="1",master="j",description="产品描述") 92 r=self.findProduct(findname="ab") 93 self.assertEqual(r.status_code,200) 94 95 def test_platform_default_find_product(self): 96 '''验证默认查询''' 97 self.addProduct(name="abcd",product_type="WEB",version="1",master="j",description="产品描述") 98 r=self.findProduct(findname="") 99 self.assertEqual(r.status_code,200) 100 101 def test_platform_exact_find_product(self): 102 '''验证精确查询''' 103 self.addProduct(name="abcd",product_type="WEB",version="1",master="j",description="产品描述") 104 r=self.findProduct(findname="abcd") 105 self.assertEqual(r.status_code,200) 106 107 if __name__ == '__main__': 108 unittest.main()

浙公网安备 33010602011771号