将测试结果发布到 Azure(VS 数据库项目、tSQLt、Azure Pipelines,Docker)

Publishing test results to Azure (VS Database Project, tSQLt, Azure Pipelines, Docker)

我正在尝试使用 Azure Pipeline 完全自动化构建、测试和发布数据库项目。

我已经有一个 Visual Studio 解决方案,它包含三个数据库项目。第一个项目是数据库,其中包含表、存储过程、函数、数据等。第二个项目是 tSQLt 框架(v 1.0.5873.27393,如果有人感兴趣的话)。最后第三个项目是 tSQLt 测试。

我的目标是将解决方案签入源代码管理,管道将自动构建解决方案,将 dacpacs 部署到构建服务器(在本例中为 docker),运行 t SQLt 测试,并将结果发布回管道。

我的管道是这样工作的。

发布结果之前的一切都正常,但在这一步我遇到了以下错误:

[警告]无法读取 /home/vsts/work/1/Results。xml。错误:根级别的数据无效。第 1 行,位置 1.

我在管道中添加了另一个步骤来显示 Results.xml 文件的内容。看起来像这样:

XML_F52E2B61-18A1-11d1-B105-00805F49916B                                                                                                                                                                                                                        
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
<testsuites><testsuite id="1" name="MyNewTestClassOne" tests="1" errors="0" failures="0" timestamp="2021-02-01T10:40:31" time="0.000" hostname="f6a05d4a3932" package="tSQLt"><properties/><testcase classname="MyNewTestClassOne" name="TestNumberOne" time="0.

我不确定列名和破折号是否应该在文件中,但我猜不是。我添加了另一个步骤来删除它们,只留下 XML。但这给了我一个不同的错误来处理:

##[警告]无法读取 /home/vsts/work/1/Results。xml。错误:存在未闭合的文字字符串。第 2 行,位置 1.

这个有点明显,因为正如您在上面看到的,XML 是不完整的。

这是我的管道的一部分,运行tSQLt 测试并将结果输出到 Results.xml

- script: |
    sqlcmd -S 127.0.0.1,1433 -U SA -P Password.1! -d StagingDB -Q 'EXEC tSQLt.RunAll;'
  displayName: 'tSQLt - Run All Tests'
- script: |
    cd $(Pipeline.Workspace)
    sqlcmd -S 127.0.0.1,1433 -U SA -P Password.1! -d StagingDB -Q 'SET NOCOUNT ON; EXEC tSQLt.XmlResultFormatter;' -o 'tSQLt_Results.xml'
  displayName: 'tSQLt - Output Results'

我研究了很多这方面的博客和文章,大多数人都在做同样的事情。有些人使用 PowerShell 而不是 sqlcmd,但考虑到我使用的是 Ubuntu 机器,这不是这里的选项。

我别无选择,所以我正在寻求这方面的帮助。

您正在处理 2 个问题。您的结果集中有噪音,即 not xml 并且您的 xml 结果是 t运行 在 256 个字符之后分类。我可以帮你解决这两个问题。

我做的基本上是这样的:

/opt/mssql-tools/bin/sqlcmd \
    -S "localhost, 31114" -U sa \
    -P "password" \
    -d dbname \
    -y0 \
    -Q "BEGIN TRY EXEC tSQLt.RunAll END TRY BEGIN CATCH END CATCH; EXEC tSQLt.XmlResultFormatter" \
        | grep -w "<testsuites>" \
        | tee "resultfile.xml"

注意事项:

  • y0重要。这会将 xml 结果集的长度从 256 增加到无限。
  • grep 与正则表达式 - 确保你只得到 xml 而不是它周围的噪音。

如果你只想 运行 测试的一个子集,你需要修改传入的 SQL 查询,但除此之外,这是一个包罗万象的“ oneliner" 到 运行 所有测试并以 xml 格式获得结果,Azure DevOps 可读