利用PowerShell进行数据库部署冒烟测试
PowerShell是一種命令行外殼程序和腳本環境,使命令行用戶和腳本編寫者可以利用 .NET Framework的強大功能,也可以調用Azure。在Win10里面附帶PowerShell V5,PowerShell也能夠容易地集成到Jenkins里面。
本文要解決的問題:
數據庫部署之后進行冒煙測試,確保相應的對象,比如表,存儲過程,視圖,具體數據等等已經部署到位,避免到了后續集成測試時與其它錯誤混雜在一起,減少Root Cause的時間。
解決方案:
I. 以分號;作為一批次Sql語句的分隔
II. Sql語句執行返回有記錄,為正確
比如如下
-- check newly deployed SELECT * from sys.all_objects where name = 'td_searchbyname' and create_date > dateadd(MI, -10, getdate()); -- check deployed and no current modification SELECT * from sys.all_objects where name = 'td_searchbyemail' and modify_date < dateadd(MI, -10, getdate()); SELECT * FROM TABLE123 WHERE FIELDA = 'EXPECTEDVALUE' AND FIELDB = 'FFFF';-- check output of query procedure is the expected value, with several lines create table #TempTable1(name VARCHAR(50) PRIMARY KEY, quantity INTEGER) insert into #TempTable1 EXEC po_searchbyname 'Mike' SELECT * from #TempTable1 where quantity = 234;把文件的后綴名設為.sqlt, 余下的執行、報告等等交給PowerShell.
$FileList = Get-ChildItem -Path $SqltPath -Include "*.sqlt" -Recurse$SqlPath是.sqlt文件的根目錄,也可能就是其它Sql文件的根目錄,上述語句把全部.sqlt文件找到,放入FileList當中。然后,遍歷FileList當中。 然后,遍歷FileList當中。然后,遍歷FileList,根據每個.sqlt文件生成一個Pester的Test Context,如下
foreach ($SqltFile in $FileList) {$SqlList = Get-ZmSqlTestCaseList($SqltFile)Context "File:$($SqltFile.Name)" {It "SQL:" -TestCases $SqlList {$sqlcmd = $sqlConn.CreateCommand()$sqlcmd.CommandText = $Sql$result = $sqlcmd.ExecuteScalar()$result | Should -Not -BeNullOrEmpty}}}以上核心函數是Get-ZmSqlTestCaseList($SqltFile)
function Get-ZmSqlTestCaseList($SqltFile) {$RawSqlList = Get-Content $SqltFile -Delimiter ";"$SqlList = [System.Collections.ArrayList]::new()foreach ($RawSql in $RawSqlList) {$Sql = ConvertTo-ZmValidSql $RawSqlif ($Sql) {[void]$SqlList.Add(@{Sql = $Sql })}}return $SqlList }$RawSqlList = Get-Content $SqltFile -Delimiter “;”
根據“;”得到了初步的Sql語句列表,然后進行逐條檢查并轉換到有效的Sql語句,關鍵函數是ConvertTo-ZmValidSql
function ConvertTo-ZmValidSql([string]$RawSql) {if ($null -eq $RawSql) {return $null}$Sql = $RawSql.Trim()if ($Sql.Length -lt 8) {return $null}$BatchLineList = $Sql.Split("`n")$NotCommentLineCount = 0foreach ($item in $BatchLineList) {$item = $item.Trim()if ($item.Length -ge 2) {$NotCommentLineCount = $NotCommentLineCount - $item.SubString(0, 2).IndexOf("--")}}if ($NotCommentLineCount -eq 0) {return $null}return $Sql }以上語句是判斷以分號;分割的Sql語句是否有效,略作轉換。
$FileList = Get-ChildItem -Path $SqltPath -Include "*.sqlt" -Recurse Describe "DB-Smoke-Testing" {BeforeAll {$SqlConn.Open()}AfterAll {$SqlConn.Close()}foreach ($SqltFile in $FileList) {$SqlList = Get-ZmSqlTestCaseList($SqltFile)Context "File:$($SqltFile.Name)" {It "SQL:" -TestCases $SqlList {$Sqlcmd = $SqlConn.CreateCommand()$Sqlcmd.CommandText = $Sql$result = $Sqlcmd.ExecuteScalar()$result | Should -Not -BeNullOrEmpty}}} }其中$SqlConn是 System.Data.SqlClient.SqlConnection,在前面初始化。
以上測試運行結果與其它Junit結果一樣,可以被Jenkins記錄,方便查詢。
因此,對于DBO,只需在.sqlt文件當中寫好sql查詢語句。
小結:
本文闡述了一個數據庫冒煙測試具體問題,與博客過去文章有點不一樣,對于絕大多數老讀者而言,用不到。因此,最后要傳遞的信息是值得設法提升測試的便利性,加強持續集成和持續測試。
總結
以上是生活随笔為你收集整理的利用PowerShell进行数据库部署冒烟测试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 工程实践规模化推进要点分析
- 下一篇: ExcelBDD-Java开源组件发布了