bat批处理脚本测试接口
-
背景
前段时间公司生产服务器上的OCR服务需要维护下,更新几个文件,完成后需要进行测试,因为是生产环境,只能通过模拟调用接口来测试,能用的还是一个windows虚拟桌面。要测试这个OCR服务,只需要传一个图片路径和一些参数即可,因此想到了用批处理命令+Jar包调用的方式来测试。
-
准备
首先OCR的调用服务其实都已经写好了,因为要用jar包方式调用,肯定要传一些参数,而且是动态的,所以肯定不能在代码里写死。这里写到了一个main方法里,然后通过args[0]、args[1]...这样去传参,剩下的都是封装好的,最后会打印出执行结果,很简单的一个main方法。最后打成jar包,如何打成jar包这里不再详细讲解,有很多种方式,这里主要将批处理的设计。
-
参数分析
因为OCR测试中主要参数有3个,图片路径、证件类型代码和接口地址。首先图片路径不用说,文件夹路径+具体文件名,然后证件类型代码,刚开始是写死的,比如1代表身份证,2代表银行卡,刚开始类型少,写死即可,后来发现类型可能增加,干脆就也写成动态的防止硬编码。最后是接口地址,这里有接口地址是因为有6台服务器再跑,F5做的负载均衡,根据ip进行hash,当然这是另外的F5接口地址,我们测试的时候肯定还是直接访问6台对应的IP。
-
批处理脚本编写-基础版
这时jar包和参数都准备好了,就开始编写bat脚本,首先看下单独直接调用jar包的方式:
文件名:testocr.bat ,jar包名:testocr.jar ,证件类型:1 ,图片路径:同目录下的img文件夹下的idcard.jpg图片
接口地址:http://127.0.0.1:7001/cardRecon/ 这里ip随意写的
@echo off
java -jar testocr.jar 1 img\\idcard.jpg http://127.0.0.1:7001/cardRecon/
pause
整体很简单,就是调用jar包并传参,开头@echo off关闭没用的回显,最后pause一下,方便查看输出结果。
-
批处理脚本编写-改进版
像基础版的只是demo级别的,测试下jar包有没有问题,像证件类型和图片路径都是直接写死的,既然要编写批处理脚本,就是为了方便操作,不能每次都要修改硬编码才能执行,这样就失去了脚本本身的意义。后来写了一版连续测试多张同一证件类型的脚本。这一版中图片是动态的,自动遍历存放图片文件夹中的图片名,拼接成图片路径进行传参,相当于对每张图片都进行一次接口调用。同样的,因为证件类型都是一样的,服务地址也是一样的,所以这两个是写死的。
@echo off
::首先echo off关闭无用回显
echo * * * * * * * * * * * * OCR接口测试工具基础版 * * * * * * * * * * * *
echo * * * * * * * * * * * * 请保持窗口开启或最小化,测试结束前请勿关闭 * * * * * * * * * * * *
::然后打印两句提示语
chcp 936 > nul
::这里为了防止cmd编码问题,直接先把cmd窗口编码改为GBK再去执行 后面的 > nul 跟linux的 >/dev/null类似
dir img /b > tmp.txt
::dir img /b 列出img文件夹中的文件名 /b表示只显示文件名 不加这个会把文件的日期什么的信息都带出来的
for /f "tokens=*" %%i in ('dir/b tmp.txt') do (
(for /f "tokens=1* delims=:" %%j in ('findstr /n .* "%%i"') do echo %date% - %time% >>work.log & java -jar testocr.jar 2 img\\%%k http://127.0.0.1:7001/cardRecon 1>>work.log 2>> err.log & echo.>>work.log))
echo * * * * * * * * * * * * 测试结束,感谢使用 * * * * * * * * * * * *
pause >nul
最主要的代码 for /f %%i in (file) do command:读取文件到内存,按每一行为一个元素,忽略空白行,然后执行do后面的命令。先将一些不主要的代码删除掉:
for /f "tokens=*" %%i in ('dir/b tmp.txt') do (
(for /f "tokens=1* delims=:" %%j in ('findstr /n .* "%%i"') do echo %%k))
首先我们先看一个for /f,先创建一个tmp.txt文件,并向文本中输入一些内容 tmp.txt:
030.jpg
24134.jpg
idcard.jpg
sfz.jpg
身份证正面.jpg
背面.jpg
身份正面2.png
首先我的思路是,通过前面的 dir img /b > tmp.txt,已经先将存放图片的文件夹中的所有文件名写入到tmp.txt文件中,我们需要这个文件名来最后组成路径作为参数传入到jar包中,或者你直接返回路径也可以。遍历文件夹下的文件名写入文本,这个好理解,然后就是要遍历这个文件的每一行,使用dir 遍历文件夹时默认输出的就是一行一个名字的,因此我们只需要按行去读取文件名即可,有多少个图片就调用几次jar -jar + 证件类型 + 图片地址 + 接口地址 即可,其中图片地址是通过地址+tmp.txt中的图片名拼接而成,思路清楚之后再看下编码:
@echo off
:: 注意tmp.txt文件与当前bat脚本在同一级目录下
for /f "tokens=*" %%i in (tmp.txt) do (
echo %%i
)
pause >nul
输出:
030.jpg
24134.jpg
idcard.jpg
sfz.jpg
身份证正面.jpg
背面.jpg
身份正面2.png
这里就可以理解 %%i相当于tmp.txt中的每一个元素,也就是每一行,然后按照每一行为一个元素,进行打印。
这个理解之后看第二个编码:
@echo off
chcp 936 > nul
findstr /n .* "tmp.txt"
pause > nul
输出:
1:030.jpg
2:24134.jpg
3:idcard.jpg
4:sfz.jpg
5:身份证正面.jpg
6:背面.jpg
7:身份正面2.png
这里主要注意下findstr /n ,/n代表在匹配的每行前打印行数,并且用的是英文的冒号分割的。
然后再回过头看一下这个代码,大概的逻辑应该很清晰了,其中tokens和delims需要解释一下,delims表示分隔符,告诉for每一行用什么最为分隔符,默认的分隔符是空格和tab键,然后tokens就代表分割开的东西我要取哪一个或几个。有点类似于将字符串分割成数组,然后按下标取第几个,当然这个可以取好几个,还是有些不同的。其中tokens=1*,代表从第一行一直取到最后,用1,*也行。
其中的%%j和%%k,在第二个for中,delims使用的是根据“:”进行分割,比如tmp.txt第一行的“1:030.jpg”,根据“:”分割后其实就是两部分,%%j就代表第一部分,%%k就代表剩下的部分,刚开始我也以为是胡写的,只是一个名字而已,后来发现不是,并且要严格按照英文字母顺序排列的,j之后是k,因此这里%%j就是前面的行号,%%k就是文件名。
然后剩下的就好理解了,读取文件到内存,遍历每一行,然后给每一行即%%i表示的通过findstr /n加上编号,其实不加也可以,这里是因为我后面要用到这个编号,所以这里就直接加上了然后findstr /n 后面的.*代表后缀,这里是任意后缀的,因为里面放的图片都是我手动放的,所以不需要限制文件类型,如果想限制比如jpg后缀的,可以直接写成findstr /n .jpg即可。
@echo off
for /f "tokens=*" %%i in ('dir/b tmp.txt') do (
(for /f "tokens=1* delims=:" %%j in ('findstr /n .* "%%i"') do echo %%j.%%k))
pause > nul
输出:
1.030.jpg
2.24134.jpg
3.idcard.jpg
4.sfz.jpg
5.身份证正面.jpg
6.背面.jpg
7.身份正面2.png
-
最终版(交互模式)
@echo off
chcp 936 > nul
echo * * * * * * * * * * * * 欢迎使用OCR接口测试工具!* * * * * * * * * * * *
set urlcode=
set server=
set cardtype=
set imgpath=
set input=
:begin
echo;
echo ******************************* 测试环境选择 *******************************
echo 1.老版UAT环境(http://127.0.0.87:7001/cardRecon/)
echo 2.新版UAT环境(http://127.0.0.22:7001/cardRecon/)
echo 3.生产环境
echo 4.退出
echo;
set /p urlcode=请选择要测试的环境:
if %urlcode% equ 1 set urlcode=http://127.0.0.87:7001/cardRecon/ & call:typeset
if %urlcode% equ 2 set urlcode=http://127.0.0.22:7001/cardRecon/ & call:typeset
if %urlcode% equ 3 set urlcode=http://127.0.0.22:7001/cardRecon/ & call:product
if %urlcode% equ 4 echo 感谢使用,按任意键退出 & pause>nul & exit
echo 环境选择错误,请重新输入 & goto begin
:product
cls & echo;
echo ******************************* 生产环境地址选择 *******************************
echo 1.生产环境151(http://127.0.0.151:7001/cardRecon/)
echo 2.生产环境152(http://127.0.0.152:7001/cardRecon/)
echo 3.生产环境153(http://127.0.0.153:7001/cardRecon/)
echo 4.生产环境154(http://127.0.0.154:7001/cardRecon/)
echo 5.生产环境155(http://127.0.0.155:7001/cardRecon/)
echo 6.生产环境156(http://127.0.0.156:7001/cardRecon/)
echo 7.返回上一步
echo 8.退出
set /p server=请选择要测试的生产地址:
if %server% equ 1 set urlcode=http://127.0.0.151:7001/cardRecon/ & call:typeset
if %server% equ 2 set urlcode=http://127.0.0.152:7001/cardRecon/ & call:typeset
if %server% equ 3 set urlcode=http://127.0.0.153:7001/cardRecon/ & call:typeset
if %server% equ 4 set urlcode=http://127.0.0.154:7001/cardRecon/ & call:typeset
if %server% equ 5 set urlcode=http://127.0.0.155:7001/cardRecon/ & call:typeset
if %server% equ 6 set urlcode=http://127.0.0.156:7001/cardRecon/ & call:typeset
if %server% equ 7 goto begin
if %server% equ 8 echo 感谢使用,按任意键退出 & pause>nul & exit
:typeset
cls & echo;
echo ******************************* 证件类型选择 *******************************
echo 1.二代身份证正面(typecode=2)
echo 2.二代身份证背面(typecode=3)
echo 3.二代身份证正面背面自动分类(typecode=101)
echo 4.银行卡(typecode=17)
echo 5.驾照(typecode=5)
echo 6.行驶证(typecode=6)
echo 7.返回上一步
echo 8.退出
echo;
set /p cardtype=请选择要测试的证件类型:
if %cardtype% equ 1 call:imgset
if %cardtype% equ 2 call:imgset
if %cardtype% equ 3 call:imgset
if %cardtype% equ 4 call:imgset
if %cardtype% equ 5 call:imgset
if %cardtype% equ 6 call:imgset
if %cardtype% equ 7 goto begin
if %cardtype% equ 8 echo 感谢使用,按任意键退出 & pause>nul & exit
echo 证件类型选择错误,请重新输入 & goto typeset
:imgset
dir img /b > tmp.txt
cls & echo ******************************* 证件图片选择 *******************************
echo 0.返回上一步
echo 00.退出
for /f "tokens=*" %%i in ('dir/b tmp.txt') do (
(for /f "tokens=1* delims=:" %%j in ('findstr /n .* "%%i"') do echo %%j.%%k))
set /p imgpath=请选择一张图片:
if %imgpath% equ 0 call:typeset
if %imgpath% equ 00 echo 感谢使用,按任意键退出 & pause>nul & exit
for /f "tokens=1* delims=:" %%i in ('findstr /n .* tmp.txt') do (
if %imgpath%==%%i set imgpath=img/%%j
)
echo %imgpath% | findstr img/ >nul && goto run || echo 图片编号选择错误,请重新输入 & goto imgset
:run
echo.>>work.log
echo %date% - %time% >>work.log
java -jar testocr.jar %cardtype% %imgpath% %urlcode% 1>>work.log 2>err.txt
echo -----------------------------------------------
echo -----------------------------------------------
pause>nul & echo 识别完成,请稍后在work.log文件中查看识别结果,按任意键继续操作...
echo 1.环境选择
echo 2.证件类型选择
echo 3.证件图片选择
echo 4.退出
set /p input=请选择后续操作:
if %input% equ 1 cls & goto begin
if %input% equ 2 cls & goto typeset
if %input% equ 3 cls & goto imgset
if %input% equ 4 exit
-
结尾
这次也是说特殊情况要使用bat脚本去处理,如果说有linux环境去测试是最好的,写脚本什么的也更熟悉,原来也是学过一段时间的批处理脚本,所以这次才能边查边学习,最后写出来了这些脚本。当初也是觉得这些东西很有趣,学起来虽然晦涩难懂,但是也跟shell有相通的地方。
最后很感谢各位bat大佬,也是学习了很多大佬的文章才能学习进步,感谢分享,另外就是这些代码肯定有很多不足之处,也希望各位大佬多多指出,互相学习进步。