如何在没有单元测试的情况下报告存储过程
How to report on stored procedures without unit tests
我们的 SQL 项目有大量存储过程,它们都应该伴随单元测试。
我正在尝试编写一些 Powershell 来报告未伴随单元测试的存储过程。
查找存储过程列表很简单 - 检查它们是否有测试,不是那么简单。该代码似乎存储在资源文件中。
这是我目前拥有的:
$sps = ((gci -recurse -include *.sql | select-string "CREATE PROCEDURE") -split ':' | select-string "CREATE PROCEDURE" | ForEach-Object {$_ -Replace "CREATE PROCEDURE ", ""}) -split " " | select-string "\."
foreach ($sp in $sps)
{
Write-Host $sp
#ToDo: For each stored procedure, report on a count of EXEC statements calling this procedure in .resx files
}
有什么建议吗?
费尽周折(我的 Powershell-fu 糟透了),我想到了这个:
# Only include stored procedures that are in the project files
$prjs = (gci -recurse -include *.sqlproj) | select fullname | select-string ":"
foreach ($prj in $prjs)
{
$file = ($prj -Replace "@{FullName=","") -Replace "}",""
$xml = [xml](Get-Content $file)
$used = (((($xml.Project.ItemGroup.Build) | select Include) -split "\") | select-string ".sql") -replace "}",""
}
# Pull a list of SPs from the project code
$sps = ((gci -recurse -include $used | select-string "CREATE PROC") -split ':' | select-string "CREATE PROC" | ForEach-Object {$_ -Replace "CREATE PROCEDURE ", ""} | ForEach-Object {$_ -Replace "CREATE PROC ", ""}) -split " " | select-string "\."
$fails = 0
$passes = 0
foreach ($sp in $sps)
{
# Handle disparity in presentation between [schema].[SpName] between SP and test code
$sp2 = ($sp -Replace "\[", "") -Replace "\]", ""
# Count each SP name presentation in test code
$valium1 = (gci -recurse -include *.resx | select-string -SimpleMatch $sp).count
$valium2 = (gci -recurse -include *.resx | select-string -SimpleMatch $sp2).count
# If we don't have a match for either presentation, then no test exists
if ($valium1 -eq 0 -AND $valium2 -eq 0)
{
$fails++;
Write-Host "***FAIL***" $sp
}
else
{
$passes++;
Write-Host "***PASS***" $sp
}
}
$total = [int]$fails + [int]$passes
Write-Host
Write-Host "Passes: " $passes
Write-Host "Fails : " $fails
Write-Host "------------"
Write-Host "Total : " $total
Write-Host "------------"
我们的 SQL 项目有大量存储过程,它们都应该伴随单元测试。
我正在尝试编写一些 Powershell 来报告未伴随单元测试的存储过程。
查找存储过程列表很简单 - 检查它们是否有测试,不是那么简单。该代码似乎存储在资源文件中。
这是我目前拥有的:
$sps = ((gci -recurse -include *.sql | select-string "CREATE PROCEDURE") -split ':' | select-string "CREATE PROCEDURE" | ForEach-Object {$_ -Replace "CREATE PROCEDURE ", ""}) -split " " | select-string "\."
foreach ($sp in $sps)
{
Write-Host $sp
#ToDo: For each stored procedure, report on a count of EXEC statements calling this procedure in .resx files
}
有什么建议吗?
费尽周折(我的 Powershell-fu 糟透了),我想到了这个:
# Only include stored procedures that are in the project files
$prjs = (gci -recurse -include *.sqlproj) | select fullname | select-string ":"
foreach ($prj in $prjs)
{
$file = ($prj -Replace "@{FullName=","") -Replace "}",""
$xml = [xml](Get-Content $file)
$used = (((($xml.Project.ItemGroup.Build) | select Include) -split "\") | select-string ".sql") -replace "}",""
}
# Pull a list of SPs from the project code
$sps = ((gci -recurse -include $used | select-string "CREATE PROC") -split ':' | select-string "CREATE PROC" | ForEach-Object {$_ -Replace "CREATE PROCEDURE ", ""} | ForEach-Object {$_ -Replace "CREATE PROC ", ""}) -split " " | select-string "\."
$fails = 0
$passes = 0
foreach ($sp in $sps)
{
# Handle disparity in presentation between [schema].[SpName] between SP and test code
$sp2 = ($sp -Replace "\[", "") -Replace "\]", ""
# Count each SP name presentation in test code
$valium1 = (gci -recurse -include *.resx | select-string -SimpleMatch $sp).count
$valium2 = (gci -recurse -include *.resx | select-string -SimpleMatch $sp2).count
# If we don't have a match for either presentation, then no test exists
if ($valium1 -eq 0 -AND $valium2 -eq 0)
{
$fails++;
Write-Host "***FAIL***" $sp
}
else
{
$passes++;
Write-Host "***PASS***" $sp
}
}
$total = [int]$fails + [int]$passes
Write-Host
Write-Host "Passes: " $passes
Write-Host "Fails : " $fails
Write-Host "------------"
Write-Host "Total : " $total
Write-Host "------------"