利用PowerShell进行数据库部署冒烟测试
Posted zhangmike
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用PowerShell进行数据库部署冒烟测试相关的知识,希望对你有一定的参考价值。
PowerShell是一种命令行外壳程序和脚本环境,使命令行用户和脚本编写者可以利用 .NET Framework的强大功能,也可以调用Azure。在Win10里面附带PowerShell V5,PowerShell也能够容易地集成到Jenkins里面。
本文要解决的问题:
数据库部署之后进行冒烟测试,确保相应的对象,比如表,存储过程,视图,具体数据等等已经部署到位,避免到了后续集成测试时与其它错误混杂在一起,减少Root Cause的时间。
解决方案:
- 利用PowerShell里面的Pester测试框架,Pester提供了一个用来在PowerShell内部通过单元测试执行和验证PowerShell命令的框架。Pester遵循一个文件命名规范:命名的测试可以在测试时被自动发现,和一套简单的函数集,Pester相当于是PowerShell的xUnit。
- 用户只需专注在写好SQL语句来校验数据库,注意2个要点:
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文件找到,放入 F i l e L i s t 当 中 。 然 后 , 遍 历 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 $RawSql
if ($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 = 0
foreach ($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进行数据库部署冒烟测试的主要内容,如果未能解决你的问题,请参考以下文章
是否有可能弄清楚IE是否从C#或PowerShell代码重新下载Silverlight xaps?
易用性测试本地化测试部署测试无障碍测试回归测试冒烟测试A/B测试