python api接口测试---要验证登录状态的接口

***

  • 有些测试系统为了演示多方便,会将登录的校验去掉。不登录也可以用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作为参数,构建请求时,可以用到。

猜你喜欢

转载自blog.csdn.net/qq_37615098/article/details/83690557
今日推荐