zoukankan      html  css  js  c++  java
  • 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大佬,也是学习了很多大佬的文章才能学习进步,感谢分享,另外就是这些代码肯定有很多不足之处,也希望各位大佬多多指出,互相学习进步。

  • 相关阅读:
    Python学习-第三天代码作业
    网络原理-1
    整理操作系统
    操作系统--开发语言--重点
    操作系统
    C#数组的声明方式
    string.Format对C#字符串格式化(转)
    C#中两个Form窗口之间的传值(父->子)(子->父) (转)
    opencv MatchTemplate()模板匹配寻找最匹配部分
    摄像头,图片筛选颜色
  • 原文地址:https://www.cnblogs.com/yanht/p/13800879.html
Copyright © 2011-2022 走看看