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

将测试结果发布到Azure(VS数据库项目、tSQLt、Azure管道、Docker),azure,docker,tsql,azure-pipelines,tsqlt,Azure,Docker,Tsql,Azure Pipelines,Tsqlt,我正在尝试使用Azure管道完全自动化数据库项目的构建、测试和发布 我已经有了一个VisualStudio解决方案,它由三个数据库项目组成。第一个项目是数据库,它包含表、存储过程、函数、数据等。。第二个项目是tSQLt框架(v1.0.5873.27393,如果有人感兴趣)。最后,第三个项目是tSQLt测试 我的目标是将解决方案签入源代码管理,管道将自动构建解决方案,将DACPAC部署到构建服务器(本例中为docker),运行tSQLt测试,并将结果发布回管道 我的管道是这样工作的 构建Visu

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

我已经有了一个VisualStudio解决方案,它由三个数据库项目组成。第一个项目是数据库,它包含表、存储过程、函数、数据等。。第二个项目是tSQLt框架(v1.0.5873.27393,如果有人感兴趣)。最后,第三个项目是tSQLt测试

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

我的管道是这样工作的

  • 构建VisualStudio解决方案
  • 发布工件
  • 设置运行Ubuntu和SQL Server的docker容器
  • 安装SQLPackage
  • 将DACPAC部署到SQL实例
  • 运行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.
我已经研究了很多关于这方面的博客和文章,大多数人都在做同样的事情。有些人使用PowerShell而不是sqlcmd,但考虑到我使用的是Ubuntu机器,这里没有选择


我已经没有选择了,所以我想在这方面寻求一些帮助。

您正在处理两个问题。结果集中存在噪声,即不是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"
/opt/mssql工具/bin/sqlcmd\
-S“本地主机,31114”-U sa\
-P“密码”\
-d数据库名\
-y0\
-Q“BEGIN-TRY-EXEC-tSQLt.RunAll-END-TRY-BEGIN-CATCH-END-CATCH;EXEC-tSQLt.XmlResultFormatter”\
|grep-w“\
|tee“resultfile.xml”
需要注意的几件事:

  • y0
    重要。这将xml结果集的长度从256设置为无限
  • 带正则表达式的grep-确保您只获取xml,而不是它周围的噪音

如果只想运行测试的一个子集,则需要对传入的SQL查询进行修改,但除此之外,这是一个全面的“oneliner”,用于运行所有测试并以xml格式获取结果,Azure DevOps可读

有关类似问题的解决方案,请参见-跨平台PowerShell是一个选项-您好BrokenBad Marco的回答有帮助吗?如果是这样,你可以,它可以帮助其他社区成员谁得到同样的问题,我们可以存档此线程,谢谢Stausend Dank!!不可能的
/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"