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大佬,也是學習了很多大佬的文章才能學習進步,感謝分享,另外就是這些代碼肯定有很多不足之處,也希望各位大佬多多指出,互相學習進步。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM