***
- 有些测试系统为了演示多方便,会将登录的校验去掉。不登录也可以用api 实际的系统需要携带正确得到id才能调用后面的接口成功
登录的目的是后续的请求中携带sessionid,sessionid哪来的?是登录的时候响应消息里面创建的。
登录成功后,返回的结果里有一个set_cookie,cookie里面就有sessionid
要取到sessionid,后续的请求里加上
先登录,获取到sessionid
def api_login(username,password):
payload = {
"username": username,
"password": password
} #就是参数传进来的用户名,密码
res = requests.post("http://localhost/api/mgr/loginReq",data=payload)
retObj = res.json()
pprint.pprint(retObj)
# 如何获取响应消息体里面的set_cookie字段
# 1.print(res.headers["Set-Cookie"]) #结果是:字符串sessionid=5xa0w1katbt0rddw04frp10jtvq94cb3; HttpOnly; Path=/ 利用字符串的split方法,取出sessionid。看看文档,还有更好的方法
#print(res.cookies["sessionid"]) #最快的方法 h2tm183v7u6dcwec0o8xmxm6z4pxncvi
return retObj,res.cookies["sessionid"] #下面的接口,可以把sessionid传进去
下面的问题就是,如何在下面的接口上,加上cookie的内容
方法1:定义headers,拼接cookie :
def api_list_course(sessionid):
headers = {
"cookie": "sessionid=" + sessionid
}
#发送post请求 data接收的是字典类型的,会自动转化成urlencode格式
res = requests.get("http://localhost/api/mgr/sq_mgr/?action=list_course&pagenum=1&pagesize=20",headers=headers) #返回的是request库里面的response对象
retObj = res.json()
pprint.pprint(retObj)
#返回的是响应中消息体对应的对象
return retObj
方法2:可以直接使用cookie参数 :
def api_list_course(sessionid):
#发送post请求 data接收的是字典类型的,会自动转化成urlencode格式
res = requests.get("http://localhost/api/mgr/sq_mgr/?action=list_course&pagenum=1&pagesize=20",cookies={"sessionid":sessionid}) #返回的是request库里面的response对象
retObj = res.json()
pprint.pprint(retObj)
#返回的是响应中消息体对应的对象
return retObj
***
*
ret,sessionid = api_login(“auto”,“sdfsdfsdf”) #login 函数返回的是:return retObj,res.cookies[“sessionid”],一个是json,一个是sessionid.是一个元组 这里把sessionid到,以后的参数里面都可以传sessionid,就能有登录态了。用例里面的函数调用的时候,只要先登录一下就行了
from lib import * #也可以import 调用函数的时候,前面加上lib.函数名》》》lib.api_add_course()
from datetime import datetime #导入这个,在这题里,主要是让每次添加的课程不一样
ret,sessionid = api_login("auto","sdfsdfsdf") #先调用登录接口,将返回值的sessionid赋值给变量sessionid
curTime = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
coureListBefore = api_list_course(sessionid)["retlist"] #字典的取值。没加课程之前,先列出下课程,方便添加课程之后的比较
name = "python"+curTime #方便后面验证课程名
ret = api_add_course(name,"python课程",2,sessionid) #添加课程名 他的返回值是响应的消息体所对应的对象
#检查retcode是否为0
if ret["retcode"] ==0:
print("添加课程的返回码为0")
else:
print(f'添加课程的返回码为{ret["retcode"]}!!!') #格式化输出
#调用课程接口,看新加的课程是不是在里面
coureListafter = api_list_course(sessionid)["retlist"] #就是在这样的python对象中找数据,是python基础的问题,类似如下的数据结构
# {'retcode': 0,
# 'retlist': [{'desc': 'java课程', 'display_idx': 1, 'id': 995, 'name': 'java'},
# {'desc': '初中化学课程', 'display_idx': 4, 'id': 1018, 'name': '初中化学'}],
# 'total': 2}
#思路1,咋子添加课程之前,可以先调用列成课程的接口,添加完在调用一下,两者比一下,是不是就多出一个
#有这样的语法:main_list = list(set(list_2)-set(list_1)) set是不允许出现重复的,类似于集合一样的东西
#思路2,自己写代码,用for循环
added = [] #就是新添加的课程
for one in coureListafter: #在添加后的课程列表里找
if one not in coureListBefore: #如果不在之前的列表中,就是新加的
added.append(one)
#首先判断先增加的只有一门课程
#assert 是断言的关键字,第一个参数如果是True,他就认为检查点通过,否则就认为检查点失败
try:
assert len(added) ==1 #如果不等于1,检查点就失败,抛出异常
newcourse = added[0] #取出第一个元素,然后检查每一个信息是否是之前新加的课程信息
assert newcourse["name"] == name
assert newcourse["desc"] == "python课程"
assert newcourse["display_idx"] == 2
# print(newcourse) 可以打印出来看看
print("\n=============== test case pass ===============")
except:
print("\n=============== test case faild ===============")
对有登录验证的系统,先登录获取sessionid。把sessionid作为参数,构建请求时,可以用到。