背景
公司内部有个标准产品(对外开发API接口),该产品迭代过程中会产生很多版本,多环境。开发及联调过程中,代码经常要在不同版本,不同环境中进行切换。
联调过程中,需要使用不同环境配合Postman进行调试。其中大部分传参需要用到客户的ID或者企业的ID。
痛点
常规获取ID的的方法:
1. 连接对应的环境
2. 找到对应的数据库
3. 找到对应的表名
4. 输入sql查询语句并执行,查询到对应的id
5. 复制id到postman中
假设需要找3个id,则至少需要操作3倍以上的步骤才能完成接口发起。基于这种重复性动作比较多,考虑通过其他方法来解决该问题。
1. 想法1--后台提供接口
后台开发接口,提供查询对应的id接口。
1. 后台不愿意增加工作量
2. 产品一直在迭代。就算新版本有新增接口,但老版本(部署的老环境)并不具备新增接口的功能。
从实际情况出发考虑可行性,走不通。
2. 想法2--nodejs搭服务
利用nodejs启用服务,编写服务链接,通过postman调用接口,根据传参,连接不同的环境数据库,返回对应数据。
1. 用nodejs编写服务比较简单(可行)
2. 通过postman去调用接口,需要传参,意味着需要手动输入环境,或者配置不同的环境。(增加很多配置工作量)
3. node服务需要在调用接口前执行。(对于开发者来说比较简单,但对于测试组的小伙伴就不友好,增加工作量)
综合评估之后,想法2可行,但不友好。基本能满足开发的可行性,但对于测试同学来说,可能会有些配置的工作量,并不友好。
3. 想法3--自定义执行脚本
通过xmysql库,执行连接命令,可以连接不同的环境,并返回对应的数据。
连接方法如下:
// 启动
xmysql -h host_name -o port -u user_name -p user_password -d database_name// 通过浏览器访问account表
http://localhost:3000/api/account?_size=100&_p=0
注意:xmysql
请求列表数据时,每次最多返回100条
需求是在每个业务请求能够获取任意客户id, 想法是把account表数据全部缓存到本地postman中,在业务代码中,通过全局方法,从缓存数据找到对应的客户id。(联调过程中,基本数据没什么大变化,account表只需同步一次),postman全局方法请参考另外一篇文章:《Postman全局注册方法及对返回数据可视化处理》, 在postman开启一个请求业务,并在pre-request script
中编写同步数据代码
const personsObj = {}
const getPersonData = (page) => {
pm.sendRequest(`http://localhost:3000/api/account?_where=(status,eq,2)and(remove_flag,eq,0)&_size=100&_p=${page}`, (err, response) => {
var data = response.json();
// 获取账户对应的id
const psersonAccountMap = data.reduce((total, currentValue) => {
const _account = currentValue.account.replace('+86-','')
total[_account] = currentValue
return total
}, personsObj)
if (data.length == 100) {
getPersonData(++page)
} else {
pm.environment.set("psersonAccountMap", psersonAccountMap); // 数据缓存到环境变量中
}
})
}
getPersonData(0)
在每个业务中,获取客户的id的方法
const utils = eval(globals.loadUtils); // 全局方法引入
// 获取默认个人ID;不传参,取默认值,可传参:utils.getPerson('账号')
let personSignerId = utils.getPerson()
启动xmysql服务虽然简单,就一条语句xmysql -h host_name -o port -u user_name -p user_password -d database_name
, 但每次都输入上面的执行语句, 每次都需要更改参数,也不是办法;此时想到用批量执行bat脚本来替代人工操作。
第一版:满足基本功能
创建linkDB.bat文件
注意:编码格式ANSI,否则中文会出现乱码
代码如下:
# @set database=database1
# @set database=database2
# @set database=database3
@set database=database4
@set host=xx.xx.xx.xx
@set port=3306
@set user=xxx
@set pwd=xxxxxxx
start cmd /k "xmysql -h %host% -o %port% -u %user% -p %pwd% -d %database%"
通过解开注释,设置不同的环境。win系统下,直接执行bat文件即可链接。但每次通过修改注释也不是很直观,需要点开文件去编辑,繁琐的步骤也多。
第二版:参数预先设置
改进linkDB.bat文件
通过预设环境参数、数据库表,等信息到代码中,执行脚本后,通过命令行输入对应的环境和数据库表,最后执行xmysql
语句连接数据库
@echo off
@set database=''
@set host=''
@set port=''
@set user=''
@set pwd=''
Title DataBase
Color 0A
:setep1
echo.
echo 【第一步:选择环境】
echo 1. 测试环境
echo 2. UAT环境
echo.
set /p env=选择环境:
if "%env%"=="1" call :env1
if "%env%"=="2" call :env2
:env1
set host=168.168.168.168
set port=3308
set user=xxxx
set pwd=xxxxxxx
goto :setep2
:env2
set host=178.178.178.178
set port=8808
set user=xxxx
set pwd=xxxxxxx
goto :setep2
:setep2
echo.
echo 【第二步:选择数据库】
echo 0. 手动设置数据库名
echo 1. dev-seal
echo 2. dev-cert
echo.
set /p n=选择数据库:
if "%n%"=="" cls&goto :setep2
if "%n%"=="0" call :goDB0
if "%n%"=="1" call :goDB1
pause
goto :eof
:goDB0
set /p manualDB=输入数据库名:
set database=%manualDB%
goto :confirm
:goDB1
set database=dev_seal_database1
goto :confirm
:confirm
cls
echo ═══════════════════════════════════════
echo 链接数据库
echo 目标: %host%:%port%
echo 数据库: %database%
echo 用户密码: %user% %pwd%
echo ═══════════════════════════════════════
set /p lastConfirm=是否正确(y/n):
if "%lastConfirm%"=="y" goto :connect
if "%lastConfirm%"=="n" cls&goto :setep1
:connect
start cmd /k "xmysql -h %host% -o %port% -u %user% -p %pwd% -d %database%"
exit
到这一步的时候,已经实现了win系统下的用户需求了。但回首一看,测试小姐姐用的是苹果mac系统,辛辛苦苦编写的bat文件,在mac系统下,直接抓瞎。只能另辟蹊径
电三版:兼容win/mac系统(最终版)
win/mac一键启动脚本
考虑到mac系统不能兼容bat文件,改用shell
执行脚本能兼容win/mac
系统, 前提是win系统需要安装git bash之类的执行环境。基于公司使用git代码管理工具,刚好有条件满足。
代码撸起来,最终代码共有3个文件:
linkDB.sh 为最终执行脚本
mac.command 苹果mac系统下的启动脚本
win.bat 微软window系统下的启动脚本
mac.command
代码如下:
#!/bin/bash
cd $(dirname $0)
exec ./linkDB.sh
语法很简单,就是进入执行脚本的文件夹路径,然后执行linkDb.sh
文件
win.bat
代码如下:
@echo off
set port=3000
# set /p port="请输入要关闭的端口,默认3000:"
echo 开始搜索'netstat -ano^|findstr ":%port%" '
for /f "delims=" %%i in ( 'netstat -ano^|findstr :%port%' ) do set pid_line=%%i
rem set pid=%pid_line:~-6%
if "%pid_line%" == "" (
echo 没有找到!
goto flag_exit
) else (
echo 已查找到: %pid_line%
for %%a in (%pid_line%) do (set pid=%%a)
)
echo 占用端口%port%的进程pid:%pid%;现在开始结束它
TASKKILL /PID %pid% /F
:flag_exit
start C:\Program" "Files\Git\git-bash.exe "linkDB.sh"
win系统下代码相对复杂一点,原因是第一次连接数据库,关闭窗口后3000端口可能会一直在占用,进程没有被结束。所以中间插入了结束3000端口进程的方法,然后启动git-bash
执行linkDb.sh
文件
linkDb.sh
代码如下:
#!/bin/bash
# 环境配置,规则:自定义环境名,ip,port,用户,密码
evnList=(
'测试环境,30.31.16.11,3308,user1,password1'
'UAT环境,30.31.16.12,3301,user2,password2'
)
# 可配置常用数据库名
database1='dev-seal'
database2='dev_cert'
database3='uat_seal'
devDBList=($database1 $database2 $database3)
# 以下为主程序代码,无须修改
host=''
port=''
user=''
pwd=''
databaseCn=''
database=''
setep3() {
clear
echo ═════════════【连接数据库】════════════
echo 目标: $databaseCn
echo 地址: $host:$port
echo 库名: $database
echo 用户: $user
echo 密码: $pwd
echo ═══════════════════════════════════════
echo
read -p "正确(y), 错误重来(n):" lastConfirm
if [[ $lastConfirm == 'y' ]];
then
clear
echo '开始连接数据库...'
xmysql -h $host -o $port -u $user -p $pwd -d $database
# exit
else
setep1;
fi
}
setep2() {
clear
echo '【第二步:选择数据库】'
echo ' ' 0. 手动输入
for i in "${!devDBList[@]}"
do
index=`expr $i + 1`
echo ' ' $index. ${devDBList[i]}
done
echo
read -p "选择数据库编号:" targetDB
if [[ $targetDB -eq 0 ]]; then
read -p "输入数据库名:" target
if [[ $target == '' ]]; then
setep2
else
database=$target
fi
else
database=${devDBList[$targetDB-1]}
fi
echo $database
setep3;
}
setep1(){
clear
echo '【第一步:选择环境】'
for i in "${!evnList[@]}"
do
string=${evnList[$i]}
stringList=(${string//,/ })
envName=${stringList[0]}
index=`expr $i + 1`
echo ' ' $index. ${envName}
done
echo
read -p "选择环境:" env
if [[ $env == '' ]]; then
setep1
fi
targetEnv=${evnList[$env-1]}
params=(${targetEnv//,/ })
databaseCn=${params[0]} # 目标数据库名
host=${params[1]} # 数据库ip
port=${params[2]} # 数据库端口
user=${params[3]} # 用户
pwd=${params[4]} # 密码
setep2;
};
setep1;
最终版使用须知
============= 必读 =============
1. 安装node.js
下载地址: https://nodejs.org/zh-cn/
2. 安装xmysql
执行: npm install -g xmysql
参考地址:https://www.npmjs.com/package/xmysql#xjoin
========== mac 系统必读 ==========
1、首次使用,启动命令行
1.1、cd 进入当前文件夹
1.2、执行 chmod +x mac.command
1.3、执行 chmod +x linkDB.sh
2、后期使用,一键启动mac.command文件
========== win 系统必读 ==========
1. 首次使用,需要根据GIT BASH的安装位置,修改win.bat文件中的路径
2. 后期使用,一键启动win.bat文件
总结
经过这样折腾以后,基本满足傻瓜式启动方式,减少繁琐的操作,如有环境、数据库名的变更,只需要在linkDB.sh
中进行添加环境、添加数据库名即可,一次编写,多次使用。
以上就是Postman xmysql不切换环境缓存数据到本地的详细内容,更多关于Postman xmysql本地数据缓存的资料请关注编程网其它相关文章!