azure - 将测试结果发布到 Azure(VS 数据库项目、tSQLt、Azure Pipelines、Docker)
问题描述
我正在尝试使用 Azure Pipeline 完全自动化数据库项目的构建、测试和发布。
我已经有一个包含三个数据库项目的 Visual Studio 解决方案。第一个项目是数据库,其中包含表、存储过程、函数、数据等。第二个项目是 tSQLt 框架(如果有人感兴趣的话,v 1.0.5873.27393)。最后,第三个项目是 tSQLt 测试。
我的目标是将解决方案检查到源代码控制中,管道将自动构建解决方案,将 dacpacs 部署到构建服务器(在本例中为 docker),运行 tSQLt 测试,并将结果发布回管道。
我的管道是这样工作的。
- 构建视觉工作室解决方案
- 发布工件
- 设置一个运行 Ubuntu 和 SQL Server 的 docker 容器
- 安装 SQLPackage
- 将 dacpacs 部署到 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.
我不确定列名和破折号是否应该在文件中,但我猜不是。我添加了另一个步骤来删除它们,只留下 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 机器,这不是一个选项。
我没有选择,所以我正在寻找一些帮助。
解决方案
你在这里处理两个问题。您的结果集中有噪音,不是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 可读
推荐阅读
- c# - 将具有等式值的字符串列表处理成具有有序等式值的列表
- javascript - 当前父页面的问题以及表单提交到 _blank 窗口的重定向
- mongodb - 创建新文档并将对所述文档的引用存储在另一个集合中
- git - 推送:未找到存储库。GitLab
- jquery - 仅在加载新页面时执行功能
- python - 'maxpool1/MaxPool'(操作:'MaxPool')从 2 中减去 3 导致的负尺寸大小
- javascript - 如何在不按顺序重复 Javascript 中的两个特定属性的情况下对对象数组进行排序?
- python - 列表中列表的交集
- ios - 适当大小的应用程序图标在资产目录中显示较小
- javascript - 放入 for 循环时,相同的语句会出错(javascript)