既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
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()
# 断言
Common.assert_s_code_message(rep_json)
# 将生成的companyId写入headers.json文件(w_headers对应的T-Id)
TenantId = str(rep_json['data']['pageData'][0]['companyId'])
get_header.set_w_headers_companyId(TenantId)
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
`
[外链图片转存中…(img-GFhFnrfd-1715822066254)]
[外链图片转存中…(img-DZ2f115o-1715822066254)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!