Pytest接口测试框架实战项目搭建(二)_pytest 登录接口(3)

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

w_login_info:
loginFromServer: ‘https://qa-xxx.cn/#/’
loginFromSystemCode: S
#passwordVersion: 1 #去掉该参数,password传输可不加密
username: lisi
password: 123456
verification:

QA2:
s_login_info:
loginFromServer: ‘https://qa-xxx.cn/#/’
loginFromSystemCode: S
#passwordVersion: 1 #去掉该参数,password传输可不加密
username: zhangsan111
password: 1231234
verification:

w_login_info:
loginFromServer: ‘https://qa-xxx.cn/#/’
loginFromSystemCode: S
#passwordVersion: 1 #去掉该参数,password传输可不加密
username: lisi222
password: 123456
verification:



![](https://img-blog.csdnimg.cn/img_convert/ef7428de5c2799a0dc3572c60cb16c54.gif)

### 3、data/headers.json


  内部业务系统ABC均可用s\_login\_info的用户信息,外部业务系统W用的是w\_login\_info的用户信息,其实请求体是一样的只是账号密码不一样,所以要分开来。


![](https://img-blog.csdnimg.cn/img_convert/7005026cf68f0799c9f95bd0423bfe37.gif)



{
“QA1”: {
“s_login_headers”: {
“Content-Type”: “application/x-www-form-urlencoded”,
“Accept”: “application/json, text/plain, /
},
“s_headers”: {
“Content-Type”: “application/json;charset=UTF-8”,
“Accept”: “application/json, text/plain, /”,
“sToken”: “”
},
“c_headers”: {
“T-Id”: “7”,
“System-Code”: “C”,
“Content-Type”: “application/json;charset=UTF-8”,
“Accept”: “application/json, text/plain, /”,
“sToken”: “”
},
“w_headers”: {
“T-Id”: “12095”,
“System-Code”: “W”,
“Content-Type”: “application/json;charset=UTF-8”,
“Accept”: “application/json, text/plain, /”,
“sToken”: “”
}
},
“QA2”: {
“s_login_headers”: {
“Content-Type”: “application/x-www-form-urlencoded”,
“Accept”: “application/json, text/plain, /
},
“c_headers”: {
“T-Id”: “7”,
“System-Code”: “C”,
“Content-Type”: “application/json;charset=UTF-8”,
“Accept”: “application/json, text/plain, /”,
“sToken”: “”
}
}
}



![](https://img-blog.csdnimg.cn/img_convert/a268bc608187ff7f080ea4eb9c8cf601.gif)

### 4、conf/api\_path.py


  该文件存储的是项目中用到的所有接口路径,目前只展示统一登录需要用到的api。


![](https://img-blog.csdnimg.cn/img_convert/30d201be97b3c2826ab8dc0d9a4c3dae.gif)



-- coding:utf-8 --

‘’’
@Date:2022/10/3 20:56
@Author:一加一
‘’’

from tools.operate_config import OperateConfig
from urllib.parse import urljoin

class ApiPath:

'''管理api地址'''

def __init__(self,env=None):
    if env is None:
        self.env = OperateConfig().get_node_value('ENV', 'env')
    else:
        self.env = env

self.y_api_url = OperateConfig().get_node_value(self.env,‘y_api_url’) # 读取配置文件config.ini的业务系统接口域名
self.s_api_url = OperateConfig().get_node_value(self.env, ‘s_api_url’) #读取配置文件config.ini 的s系统接口域名

    # s系统 api
    self.s_login_url = urljoin(self.s_api_url, "/saas-xxx/login") #登录
    self.s_exchangeToken_url = urljoin(self.s_api_url, "/saas-xxx/exchangeToken") #生成sToken
    self.employee_paging_list = urljoin(self.s_api_url,"/saas-xxx/list") #查询员工列表获取companyId


![](https://img-blog.csdnimg.cn/img_convert/c6b481812511678b5bb92df56b187c7f.gif)

## 二、封装方法:获取JSON


  要登录的话肯定要涉及接口请求了,所以这里首先封装下读取json文件的方法,具体如下。


### 1、tools/get\_userjson.py


  tools文件夹下新建get\_userjson.py文件,源码如下:


* get\_yaml主要用于读取data/userInfo.yaml里的用户信息
* OperateConfig主要读取config.ini里的域名地址


![](https://img-blog.csdnimg.cn/img_convert/e0d7705bf2aea3320c410f25a2f50dd9.gif)



from tools.operate_config import get_yaml,OperateConfig

class GetuserJson:

def __init__(self, env=None):
    if env is None:
        env = OperateConfig().get_node_value('ENV', 'env')
    self.env = env
    self.user_info = get_yaml(self.env)

# 统一登录系统s 登陆的用户信息
def  get_s_login_info(self):
    s_login_info = self.user_info['s_login_info']
    return s_login_info

# 业务系统W 登陆的用户信息
def  get_w_login_info(self):
    w_login_info = self.user_info['w_login_info']
    return w_login_info


![](https://img-blog.csdnimg.cn/img_convert/3e70b6b83232a4b227b5c5aa6bb351cf.gif)

### 2、tools/get\_headerjson.py


  tools文件夹下新建get\_headerjson.py文件,源码如下:


* ```
用于登录S系统用到的:get_s_login_headers,获取headers.json里名为"s_login_headers”的json串

用于S系统查询公司id用到的:get_s_headers,获取headers.json里名为"s_headers”的json串

* ```
用于登录成功将获取到的token值set进去:set_s_headers,往json文件里set字段值

# -*- coding:utf-8 -*-
from conf.setting import CASE_DATA_PATH
from tools.operate_json import OperationJson
import os
from tools.operate_config import get_yaml,OperateConfig

class GetHeaderjson:

    def __init__(self,env=None):
        if env is not None:
            self.env = env
        else:
            self.env = OperateConfig().get_node_value('ENV', 'env')
        self.headers_json = os.path.join(CASE_DATA_PATH, "headers.json")

    def get_s_login_headers(self):
        return OperationJson(self.headers_json).key_get_data(self.env,"s_login_headers")
    def get_s_headers(self):
        return OperationJson(self.headers_json).key_get_data(self.env,"s_headers")
    def set_s_headers(self,s_token):
        OperationJson(self.headers_json).write_datas(s_token,self.env, "s_headers", "sToken")
def get_c_headers(self):
        return OperationJson(self.headers_json).key_get_data(self.env,"c_headers")
    def set_c_headers(self,s_token):
        OperationJson(self.headers_json).write_datas(s_token,self.env, "c_headers", "sToken")

    def get_w_headers(self):
        return OperationJson(self.headers_json).key_get_data(self.env, "w_headers")
    def set_w_headers(self,s_token):
        OperationJson(self.headers_json).write_datas(s_token,self.env, "w_headers", "sToken")
    def set_w_headers_companyId(self,companyId):
        OperationJson(self.headers_json).write_datas(companyId,self.env, "w_headers", "T-Id")

三、统一登录处理conftest.py

1、conftest.py源码如下

conftest文件之前的博客有讲过,常用来处理用例的前置条件,文件名称是pytest框架写死的,即是在执行用例前框架会先执行一次conftest.py的代码。

框架思想:

1)内部业务系统 储如ABC,接口请求时header的token需要实时获取,所以需要在接口请求前先完成登录,并且将登录后成功的token值set到headers.json里相应json串对应的token字段,如此token便不会过期,永远都是最新的,可看test_s_login函数处理。

2)外部业务系统W,同理token需要取最新,以及接口请求头的T-Id也是,所以需要在接口请求前先完成登录,并且登录成功后将最新的tooken,T-id值set到headers.json里相应json串对应的token字段,可看test_w_login函数处理。

'''
@Date:2022/10/2  14:22
@Author:一加一
'''

import pytest
from tools.common import *
from tools.get_headerjson import GetHeaderjson
from conf.api_path import ApiPath
from tools.get_userjson import GetuserJson
from tools.get_wjson import *
'''处理登录:统一登录S、业务系统登录W'''

# 实例化对象
api_path = ApiPath()
get_header = GetHeaderjson(None)
get_userinfo = GetuserJson(None)
get_wjson = GetwJson(None)


@pytest.fixture(scope="session",autouse=True)
def test_s_login():
    # s登录:用户名密码登录
    url = api_path.s_login_url #调用api_path方法获取url
    headers = get_header.get_s_login_headers() #调用get_header获取s系统接口请求头
    data = get_userinfo.get_s_login_info() #调用get_userinfo获取入参
    res_json = Common.r_post_form(url=url, headers=headers, data=data)
    # 获取code
    code = res_json['data'].split('?')[-1]

    # 生成stoken
    res_json = Common.r_post_form(url=api_path.s_exchangeToken_url,headers=get_header.get_s_login_headers(),data=code)
    # 将生成的sToken写入headers.json文件
    get_header.set_c_headers(res_json['data']['sToken'])
    get_header.set_p_headers(res_json['data']['sToken'])

@pytest.fixture(scope="session",autouse=True)
def test_w_login():
    # s登录:用户名密码登录
    url = api_path.s_login_url #调用api_path方法获取url
    headers = get_header.get_s_login_headers() #调用get_header获取s请求头
    data = get_userinfo.get_w_login_info() #调用get_userinfo获取入参
    res_json = Common.r_post_form(url=url, headers=headers, data=data)
    # 获取code
    code = res_json['data'].split('?')[-1]

    # 生成stoken
    res_json = Common.r_post_form(url=api_path.s_exchangeToken_url,headers=get_header.get_s_login_headers(),data=code)
    # 将生成的sToken写入headers.json文件
    get_header.set_w_headers(res_json['data']['sToken'])
    get_header.set_s_headers(res_json['data']['sToken'])

    # 查询s系统员工列表获取T-id写入headers.json文件的T-Id
    res_json = Common.r_s_post(url=api_path.employee_paging_list,
                             headers=get_header.get_s_headers(),
                             json=get_wjson.get_w_companyId())
    # 将响应结果转换成json格式
    rep_json = res_json.json()
    # 断言


![img](https://img-blog.csdnimg.cn/img_convert/6da458308be1bfa5cf19fb0293d57972.png)
![img](https://img-blog.csdnimg.cn/img_convert/382310dd3cfe01cb776ef3998938cc62.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618631832)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

# 断言


[外链图片转存中...(img-HaGMeP69-1715822133304)]
[外链图片转存中...(img-zVH32xov-1715822133304)]

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618631832)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值