dotnet test命令日志仅记录解决方案中最后一个测试项目输出的问题
解决dotnet test合并所有测试项目trx日志的问题
问题原因
当用dotnet test直接运行解决方案时,它会逐个执行每个测试项目,每个项目都会生成独立的trx日志文件。如果指定了统一的LogFileName,后续项目的日志会覆盖前面的,最终只保留最后一个项目的输出。
解决方案
方法1:先生成分散日志,再合并成单个trx
修改dotnet test命令,生成独立日志
去掉固定的LogFileName参数,让每个测试项目生成唯一的trx文件:dotnet test $ProjectSln --results-directory ./Reports -l "trx" "/p:GeneratePackageOnBuild=False;Configuration=Release;Platform=Any CPU;SolutionDir=${RootDir}" -verbosity:minimal执行后,
./Reports目录下会生成多个trx文件,文件名格式类似TestResults_随机GUID_测试项目名.trx。合并trx文件
用Visual Studio自带的MSTest.exe工具完成合并:# 替换为你的VS安装路径,比如C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE "C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\MSTest.exe" /merge ./Reports/*.trx /resultsfile:./Reports/CombinedAllTests.trx执行后,
CombinedAllTests.trx就是包含所有测试项目结果的合并日志。
方法2:自定义脚本合并XML(适合无VS环境)
因为trx本质是XML格式,可写PowerShell脚本手动合并关键节点:
# 示例PowerShell脚本,合并所有trx到一个文件 $combinedPath = "./Reports/CombinedResults.trx" $firstTrx = Get-ChildItem ./Reports/*.trx | Select-Object -First 1 Copy-Item $firstTrx.FullName $combinedPath $xml = [xml](Get-Content $combinedPath) $resultsNode = $xml.TestRun.Results $definitionsNode = $xml.TestRun.TestDefinitions Get-ChildItem ./Reports/*.trx | Where-Object { $_.FullName -ne $firstTrx.FullName } | ForEach-Object { $trxXml = [xml](Get-Content $_.FullName) # 合并测试结果 foreach ($result in $trxXml.TestRun.Results.ChildNodes) { $importedNode = $xml.ImportNode($result, $true) $resultsNode.AppendChild($importedNode) | Out-Null } # 合并测试定义(去重避免重复节点) foreach ($definition in $trxXml.TestRun.TestDefinitions.ChildNodes) { $existing = $definitionsNode.SelectSingleNode("*[@name='$($definition.name)']") if (-not $existing) { $importedNode = $xml.ImportNode($definition, $true) $definitionsNode.AppendChild($importedNode) | Out-Null } } } $xml.Save($combinedPath)
额外注意
你原命令里的# "-verbosity:minimal"是无效的,#会把后面的参数当成注释,要去掉#,让-verbosity:minimal作为正常命令参数。
内容的提问来源于stack exchange,提问作者ismar agilent
相关产品推荐
相关产品推荐

