利用PowerShell进行数据库部署冒烟测试

Posted zhangmike

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用PowerShell进行数据库部署冒烟测试相关的知识,希望对你有一定的参考价值。

PowerShell是一种命令行外壳程序和脚本环境,使命令行用户和脚本编写者可以利用 .NET Framework的强大功能,也可以调用Azure。在Win10里面附带PowerShell V5,PowerShell也能够容易地集成到Jenkins里面。

本文要解决的问题:

数据库部署之后进行冒烟测试,确保相应的对象,比如表,存储过程,视图,具体数据等等已经部署到位,避免到了后续集成测试时与其它错误混杂在一起,减少Root Cause的时间。

解决方案:

  1. 利用PowerShell里面的Pester测试框架,Pester提供了一个用来在PowerShell内部通过单元测试执行和验证PowerShell命令的框架。Pester遵循一个文件命名规范:命名的测试可以在测试时被自动发现,和一套简单的函数集,Pester相当于是PowerShell的xUnit。
  2. 用户只需专注在写好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当中。 然后,遍历 FileListFileList,根据每个.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进行数据库部署冒烟测试的主要内容,如果未能解决你的问题,请参考以下文章

利用PowerShell进行数据库部署冒烟测试

是否有可能弄清楚IE是否从C#或PowerShell代码重新下载Silverlight xaps?

冒烟测试的7个好处,你是否经常用到它?

易用性测试本地化测试部署测试无障碍测试回归测试冒烟测试A/B测试

冒烟测试

冒烟测试