接口测试--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()

 

 

 

posted @ 2022-05-30 11:40  jia---  阅读(101)  评论(0)    收藏  举报