python,requests请求
一.它的作用
1.为什么要用python写requests请求。
相当于浏览器给服务器发送请求,用来测试。
使用自动化的方式可以短时间执行多条用例,方便,快捷。
2.这和postman,jmeter有什么区别。
原理是一样的,但工具可能会出问题。
二.可以怎么用
1.准备工作:
1.来到网站的登录界面,按F12/右键选择检查。
选择network,选择XHR。(一种json格式)
2.登录。没有这个过程,无法查看到输入值。
3.(如果有commit可以点击它,没有只是找的麻烦点)可以看到有一个login的,选择它。可以找到请求中有输入的值。
2.获得登录后的响应值
新建一个普通python文件
下面代码:获取响应状态码,响应体(正文),打印。
import requests #导入requests包
url = 'http://192.168.10.122:8080/login' #请求地址
method = 'post' #post请求
datas = {'username':'admin','password':'123456'} #请求数据,字典类型
response = requests.post(url,data=datas) #请求响应,其中请求中data=,是格式,呈紫色。
print(f"响应状态码:{response.status_code}")
#.json()是响应体,返回的字典类型,看一下啊。
print(f".json的类型:{type(response.json())}")
dict1 = response.json()
print("响应正文:")
for i in dict1:
print(f"{i}:{dict1[i]}")
print(f"响应正文中的Admin-token:{dict1['Admin-Token']}")
3.测试:对比获取值,自己输入的预期值。
新建一个Python unit test 文件
下面代码目的:判断状态码,以及主体中的code是否符合预期。
import unittest #此文件自带
import requests #导入requests包
#把cookie写死,不重新登录没问题。
COOKIES = {"Admin-Token": "2edd18b2407442d5a752d68ccbcf27f7"}
class MyTestCase(unittest.TestCase):
def test_delete_task(self):
#这是一些请求数据
url="http://192.168.10.188:8080/task/deleteTask"
datas = {"taskId": "s602"} # 任务id 写错误的
method='POST'
#请求后的响应
response = requests.post(url, data=datas,cookies=COOKIES,timeout=3)
#判断状态码,msg=,是格式
self.assertEqual(response.status_code, 200,msg='错误原因:状态码不是200')
#.json是响应体,字典格式。把此内容赋予给body。
body=response.json()
#判断响应体重中code是否为0
self.assertEqual(body['code'], 0, msg='错误原因:code不为0')
#表示执行所有主方法
if __name__ == '__main__':
unittest.main()
4.测试:用ddt,参数分离。多次对比获取值,自己输入的值。
新建一个Python unit test 文件
下面代码:打印参数。
import unittest #自带
import requests #导入requests包
import ddt #导入ddt,这样就可以测试数据--分离
COOKIES = {'Admin-Token':'e67ca51f3e364460b2b9c7030e0a1075'}
@ddt.ddt #加装饰器,下面类就可以使用,和类中间不要隔东西
class MyTestCase(unittest.TestCase):
#ddt中data方法,可以多个,多组数据。
@ddt.data('508','509','510')
def test_ddt_unpack(self,parm1): #要写个一个parm1变量,会自动对应data中的值。
print(f'{parm1},{parm2}')
@ddt.data( ('测试1','598'),('测试2','599'),('测试3','600') )
@ddt.unpack #不要写成ddt.unpack(),用来解压元组。
def test_ddt_unpack(self,parm1,parm2): #写两个变量,每次自动对应元组里的第一个,第二个值。
print(f'{parm1},{parm2}')
if __name__ == '__main__':
unittest.main()
5.测试:用csv文件来存参数。可以存传入值,预期值。
1.用excel表写好参数,转换成csv文件。用npp转换编码。放到pychram中。
2.写一个方法,用来获取csv文件。
3.可以写请求了。
导入csv文件的方法
import csv #导入csv包
#函数的实现 path :测试数据的路径
def getList(path):
file = open(path, mode='r', encoding='utf-8') #用utf-8
list1 = csv.reader(file)
data_list = []
for t in list1:
# print(f"{t}, {type(t)}")
data_list.append(t)
file.close()
return data_list
if __name__ == '__main__':
# 如何调用:
#sList = getList('测试数据副本1.csv')
#获取文件,sList代表那个文件了。输入所在路径以及文件、若在同一文件夹中直接输入名字即可
#csv文件为一个字典
#for data in sList:
# print(data)
pass
测试代码:
import unittest #自带
import requests #导入requests
from mytest1.csv_get import getList #导入方法,可以使用csv文件
import ddt #导入ddt
COOKIES = {'Admin-Token':'e67ca51f3e364460b2b9c7030e0a1075'}
@ddt.ddt
class MyTestCase(unittest.TestCase):
#获取参数列表
slist = getList('测试数据副本1.csv')
#使参数可以分离。这样获取的参数就可以使用进去。
@ddt.data(*slist[1:])
#获取的是一个字典,要解压
@ddt.unpack
def test_delete_task(self,surl,id,taskId,expect_result,actual_result,wpass):
print(f'url={surl},id={id},taskId={taskId},expect_result={expect_result}')
url = surl
method = 'post'
datas = {'taskId':taskId}
response = requests.post(url,data = datas,cookies = COOKIES)
body = response.json()
print(f'响应体code:{body["code"]}')
expect_result_code = eval(expect_result)
# {'code': 0} --转换成字典类型
# 等同于 expect_dict = json.loads(expect_result) # {'code': 0}也放到一个字典中
#如果要json则要导包:import json
self.assertEqual(body['code'],expect_result_code['code'],msg=f'状态码不是{expect_result_code["code"]}')
if __name__ == '__main__':
unittest.main()