首页 > 解决方案 > 将测试结果发布到 Azure(VS 数据库项目、tSQLt、Azure Pipelines、Docker)

问题描述

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

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

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

我的管道是这样工作的。

发布结果的一切工作正常,但在这一步我收到以下错误:

[警告]无法读取/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 机器,这不是一个选项。

我没有选择,所以我正在寻找一些帮助。

标签: azuredockertsqlazure-pipelinestsqlt

解决方案


你在这里处理两个问题。您的结果集中有噪音,不是xml,您的 xml 结果在 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 查询进行修改,但除此之外,这是一个“全包式”运行所有测试并以 xml 格式获取结果的方法, Azure DevOps 可读


推荐阅读