SHELL自動化--介面測試

来源:https://www.cnblogs.com/wenjint-one/archive/2019/08/08/11320264.html
-Advertisement-
Play Games

#!/bin/bash fileNum=`ls /bin/testShell/apiCheck_shell/logs/ | grep $(date "+%Y-%m-%d") | wc -w`day=$(date "+%Y-%m-%d")-${fileNum}# 設置併發的進程數thread_num= ...


#!/bin/bash

fileNum=`ls /bin/testShell/apiCheck_shell/logs/ | grep $(date "+%Y-%m-%d") | wc -w`
day=$(date "+%Y-%m-%d")-${fileNum}
# 設置併發的進程數
thread_num=`cat /bin/testShell/apiCheck_shell/check.conf | grep thread_num`
thread_num=${thread_num#*thread_num=}
apiNum=0
annotationNum=0
passNum=0
failNum=0
failList="\n"
echo "" > /bin/testShell/apiCheck_shell/logs/apiCheck_err.log
echo "" > /bin/testShell/apiCheck_shell/logs/result.log

TMPFIFO=/tmp/$$.fifo #聲明管道名稱,'$$'表示腳本當前運行的進程PID
mkfifo $TMPFIFO #創建管道
exec 6<>${TMPFIFO} #創建文件標示符“6”,這個數字可以為除“0”、“1”、“2”之外的所有未聲明過的字元,以讀寫模式操作管道文件;系統調用exec是以新的進程去代替原來的進程,但進程的PID保持不變,換句話說就是在調用進程內部執行一個可執行文件
rm -rf ${TMPFIFO} #清除創建的管道文件

# 為文件描述符創建占位信息
for ((i=1;i<=${thread_num};i++))
do
{
#借用read命令一次讀取一行的特性,使用一個echo預設輸出一個換行符,來確保每一行只有一個線程占位;這裡讓人聯想到生產者&消費者模型,管道文件充當消息隊列,來記錄消費者的需求,然後由生產者去領任務,並完成任務,這裡運用了非同步解耦的思想
echo
}
done >&6 # 事實上就是在fd6中放置了$thread_num個回車符

#發送請求並記錄請求返回值
send()
{
echo "$(date "+%Y-%m-%d %H:%M:%S"):============================================================================================================================" >> /bin/testShell/apiCheck_shell/logs/apiCheck${day}.log
max_time=`cat /bin/testShell/apiCheck_shell/project/${project}/server.conf | grep max_time:`
max_time=${max_time#*max_time:}
ContentType=`cat /bin/testShell/apiCheck_shell/project/${project}/server.conf | grep ContentType:`
ContentType=${ContentType#*ContentType:}
if [[ "${project}" == "TEST-1" ]] || [[ "${project}" == "TEST-2" ]]
then
echo "$(date "+%Y-%m-%d %H:%M:%S"): curl --connect-timeout ${max_time} -m ${max_time} -s -i -X POST --cookie \"${cookies}\" -H \"Content-type\":\"${ContentType}\" -d \"${para}\" ${url}" >> /bin/testShell/apiCheck_shell/logs/apiCheck${day}.log
result=$(curl --connect-timeout ${max_time} -m ${max_time} -s -i -X POST --cookie "${cookies}" -H "Content-type":"${ContentType}" -d "${para}" ${url})
elif [[ "${url}" =~ "?" ]]
then
echo "$(date "+%Y-%m-%d %H:%M:%S"): curl --connect-timeout ${max_time} -m ${max_time} -s -i -X GET -H \"Content-type\":\"${ContentType}\" ${url}${para}" >> /bin/testShell/apiCheck_shell/logs/apiCheck${day}.log
result=$(curl --connect-timeout ${max_time} -m ${max_time} -s -i -X GET -H "Content-type":"${ContentType}" ${url}${para})
else
echo "$(date "+%Y-%m-%d %H:%M:%S"): curl --connect-timeout ${max_time} -m ${max_time} -s -i -X POST -H \"Content-type\":\"${ContentType}\" -d \"${para}\" ${url}" >> /bin/testShell/apiCheck_shell/logs/apiCheck${day}.log
result=$(curl --connect-timeout ${max_time} -m ${max_time} -s -i -X POST -H "Content-type":"${ContentType}" -d "${para}" ${url})
fi
result="{${result#*\{}"
result="${result%\}*}}"
echo "$(date "+%Y-%m-%d %H:%M:%S"):【RESULT】${result}" >> /bin/testShell/apiCheck_shell/logs/apiCheck${day}.log
}

# 參數處理 獲取para,並替換裡面的省、市、區、街道、地址,如果需要進行URLEnCode,則進行URL編碼
paraSeting()
{
para=${line%|*}
para=${para#*|}
#cityCode=${line2%%,*}
#adcode=$(grep "${cityCode}" /bin/testShell/apiCheck_shell/codes.csv)
#adcode=${adcode##*,}
#line2=${line2#*,}
#province=${line2%%,*}
#line2=${line2#*,}
#cityName=${line2%%,*}
#line2=${line2#*,}
#area=${line2%,*}
#line2=${line2#*,}
#street=${line2}
#address=${province}${cityName}${area}${street}
if [[ ${para} =~ "URLENCODE-GB2312-" ]]
then
address=${para#*URLENCODE-GB2312-}
address=${address%&*}
urlEncodeaddress=$(java -jar /bin/testShell/apiCheck_shell/urlEncode-1.0.0.jar ${address} GB2312)
para=${para//"URLENCODE-GB2312-"/""}
para=${para//"${address}"/"${urlEncodeaddress}"}
fi
#para=${para//ADDRESS/${address}}
#para=${para//CITYCODE/${cityCode}}
#para=${para//ADCODE/${adcode}}
#para=${para//PROVINCE/${province}}
#para=${para//CITYNAME/${cityName}}
#para=${para//AREA/${area}}
}

# 獲取check.conf中配置為ON的項目數
getProjectNum()
{
projectList=$(grep "ON=" /bin/testShell/apiCheck_shell/check.conf)
projectList=${projectList#*ON=}
}

#遍歷api.conf中的所有介面記錄
traverseApi()
{
while read line
do
let apiNum++
name="${line%%】*}】"
url=${line#*】}
url=${url%%|*}
returnList=${line##*|}
cookies=`cat /bin/testShell/apiCheck_shell/project/${project}/server.conf | grep Cookies:`
cookies=${cookies#*Cookies:}
if [ "${line:0:1}" == "#" ]
then
let annotationNum++
echo "$(date "+%Y-%m-%d %H:%M:%S"):當前行${name}被註釋,不進行校驗" >> /bin/testShell/apiCheck_shell/logs/apiCheck${day}.log
continue
fi
# 調用參數處理函數
paraSeting
# 調用函數,發送相關請求,並記錄返回結果
send
# 調用函數,校驗返回結果
checkResult
done < /bin/testShell/apiCheck_shell/project/${project}/api.conf
}

# 根據斷言關鍵字,校驗返回結果
checkResult()
{
temp_pass_return=""
temp_fail_return=""
temp_pass_result=""
temp_fail_result=""
temp_key=""
temp_value=""
value=""
if [ "${returnList}" != "" ]
then
# 根據switch中的配置,獲取斷言方式:精確匹配、包含
isExact=`cat /bin/testShell/apiCheck_shell/project/${project}/switch.conf | grep isExact=`
isExact=${isExact#*isExact=}
for return in $returnList
do
return=${return//"\\"/"\\\\\\"} # 針對期望值中有反斜杠的情況作特殊處理
if [ "$isExact" == "No" ] # 斷言方式為:包含
then
# 如果返回的結果中包含斷言關鍵字return,則獲取斷言關鍵字return對應的value
if [[ $result =~ $return ]]
then
value=${result#*${return}\":\"}
value=${value%%\"*}
# 根據switch中的配置,判斷是否要作去空格處理
isTrim=`cat /bin/testShell/apiCheck_shell/project/${project}/switch.conf | grep isTrim=`
isTrim=${isTrim#*isTrim=}
if [ "${isTrim}" == "Yes" ]
then
value=${value// /}
fi
fi
if [ "${value}" != "" ]
then
temp_pass_return="${temp_pass_return} ${return}"
temp_pass_result="${temp_pass_result} \"${return}\":\"${value}\""
else
temp_fail_return="${temp_fail_return} ${return}"
temp_fail_result="${temp_fail_result} \"${return}\":\"${value}\""
fi
else # 斷言方式為:精確匹配
if [[ $result =~ $return ]]
then
return=${return//"\\\\"/"\\"}
temp_pass_return="${temp_pass_return} ${return}"
temp_key="${return%:*}"
temp_value="${result#*${temp_key}:}"
temp_value="${temp_value%%,*}"
temp_key=${temp_key//"\\\\"/"\\"}
temp_pass_result="${temp_pass_result} ${temp_key}:${temp_value}"
else
return=${return//"\\\\"/"\\"}
temp_fail_return="${temp_fail_return} ${return}"
temp_key="${return%:*}"
temp_value="${result#*${temp_key}:}"
temp_value="${temp_value%%,*}"
temp_key=${temp_key//"\\\\"/"\\"}
temp_fail_result="${temp_fail_result} ${temp_key}:${temp_value}"
fi
fi
done
# 如果temp_fail_return長度大於0,則表示有校驗失效
if [ ${#temp_fail_return} -gt 0 ]
then
let failNum++
echo "$(date "+%Y-%m-%d %H:%M:%S"): ${name}${url}【返回異常!】" >> /bin/testShell/apiCheck_shell/logs/apiCheck${day}.log
echo "$(date "+%Y-%m-%d %H:%M:%S"):============================================================================================================================" >> /bin/testShell/apiCheck_shell/logs/apiCheck_err.log
echo "$(date "+%Y-%m-%d %H:%M:%S"): 【PARA】${para}" >> /bin/testShell/apiCheck_shell/logs/apiCheck_err.log
echo "$(date "+%Y-%m-%d %H:%M:%S"): 【RESULT】${result}" >> /bin/testShell/apiCheck_shell/logs/apiCheck_err.log
echo "$(date "+%Y-%m-%d %H:%M:%S"): ${name}${url}【返回異常!】" >> /bin/testShell/apiCheck_shell/logs/apiCheck_err.log
echo -e "$(date "+%Y-%m-%d %H:%M:%S"): ${name}${url}\033[41;37m 【返回異常!】 \033[0m"
failList="${failList}${name}${url}【返回異常!】\n"
else
let passNum++
echo "$(date "+%Y-%m-%d %H:%M:%S"): ${name}${url}【可正常訪問】" >> /bin/testShell/apiCheck_shell/logs/apiCheck${day}.log
echo -e "$(date "+%Y-%m-%d %H:%M:%S"): ${name}${url}\033[42;37m 【可正常訪問】 \033[0m"
fi
echo "$(date "+%Y-%m-%d %H:%M:%S"): 【PARA】${para}"
echo -e "$(date "+%Y-%m-%d %H:%M:%S"): 【預期結果】\033[42;37m${temp_pass_return}\033[0m \033[41;37m${temp_fail_return}\033[0m"
for temp_pass in ${temp_pass_result}
do
result=${result//"${temp_pass}"/"\033[42;37m${temp_pass}\033[0m"}
done
for temp_fail in ${temp_fail_result}
do
result=${result//"${temp_fail}"/"\033[41;37m${temp_fail}\033[0m"}
done
echo -e "$(date "+%Y-%m-%d %H:%M:%S"): 【返回結果】${result}"
fi
}

# 調用函數,獲取項目數
getProjectNum
#從文件描述符管道中,獲取一個管道的線程占位然後開始執行操作;read中 -u 後面跟fd,表示從文件描述符中讀入,該文件描述符可以是exec新開啟的
read -u6
{
# 遍歷所有狀態為ON的project
for project in $projectList
do
# 調用函數,遍歷所有項目
traverseApi
echo "" >&6
#任務執行完後在fd6中寫入一個占位符,以保證這個線程執行完後,線程繼續保持占位,繼而維持管道中永遠是thread_num個線程數,&表示該部分命令/任務放入後臺不占當前的bash,實現並行處理
done
echo "$(date "+%Y-%m-%d %H:%M:%S"): 此次共檢測介面【${apiNum}】個" >> /bin/testShell/apiCheck_shell/logs/result.log
echo "$(date "+%Y-%m-%d %H:%M:%S"): 註釋【${annotationNum}】個" >> /bin/testShell/apiCheck_shell/logs/result.log
echo "$(date "+%Y-%m-%d %H:%M:%S"): 成功【${passNum}】個" >> /bin/testShell/apiCheck_shell/logs/result.log
echo "$(date "+%Y-%m-%d %H:%M:%S"): 失敗【${failNum}】個" >> /bin/testShell/apiCheck_shell/logs/result.log
echo -e "$(date "+%Y-%m-%d %H:%M:%S"): 失敗記錄列表如下:${failList}" >> /bin/testShell/apiCheck_shell/logs/result.log
} &
wait # 等待父進程的子進程都執行結束後再結束父進程
exec 6>&- # 關閉fd6管道


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Quartz; using Quartz.Imp... ...
  • 實例解讀面向對象核心,所有例子基於 C#,涉及我們實務中最常關心的問題: 1、封裝、繼承、多態; 2、抽象類、介面; 3、委托、事件。 三、委托和事件 通俗的說,我們使用委托的目的是“實現將方法作為參數傳遞的效果”,直接結合例子說明。 我們還是用基於上次的示例往下更改。 場景設定:根據圖形的不同,返 ...
  • 一、簡要說明 在上篇文章裡面,我們在 當中看到了許可權檢測代碼,通過註入 就可以實現許可權檢測。不過跳轉到源碼才發現,這個介面是 ASP.NET Core 原生提供的 “基於策略” 的許可權驗證介面,這就說明 ABP vNext 基於原生的授權驗證框架進行了自定義擴展。 讓我們來看一下 Volo.Abp. ...
  • [toc] SSH遠程管理 ssh功能 SSH是一個安全協議,在進行數據傳輸時,會對數據包進行加密處理,加密後在進行數據傳輸。確保了數據傳輸安全。那SSH服務主要功能有哪些呢? 1.提供遠程連接伺服器的服務 2.對傳輸的數據進行加密 Linux遠程鏈接:ssh協議(加密) telnet(明文) wi ...
  • 1.用戶與用戶組 Linux系統是一個多用戶、多任務的操作系統,任何一個要使用系統資源的用戶,都必須首先向系統管理員(root)申請一個賬號,然後以這個賬號的身份進入系統。 用戶的賬號一方面可以幫助系統管理員對使用系統的用戶進行跟蹤,並控制他們對系統資源的訪問(許可權);另一方面也可以幫助用戶組織文件 ...
  • 簡介: 磁碟設備之上是文件系統,測試磁碟的工具往往就是調用塊設備驅動的介面進行讀寫測試。而文件系統的測試軟體就是針對文件系統層提供的功能進行測試,包括文件的打開關閉速度以及順序讀寫隨機位置讀寫的速度。以及進程併發數目等各個方面進行詳細的測試。 IOZone是目前應用非常廣泛的文件系統測試標準工具,它 ...
  • 方法一:通過修改.bashrc或.bash_profile文件來實現  通過修改home目錄下的.bashrc或.bash_profile文件來實現。這兩個文件選擇其中一個在末尾加入如下一行,具體操作如下: [GeekDevOps@GeekDevOps /]$ cd ~ [GeekDevOps@G... ...
  • 1、下載docker源碼包 docker官網地址: https://download.docker.com/linux/static/stable/ 選擇.tgz的包下載,例如:https://download.docker.com/linux/static/stable/x86_64/docker... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...