本地运行C#测试用例正常,Azure Pipeline报MagickBlobErrorException求助
我之前也碰到过一模一样的问题!这个报错核心原因就是相对路径在Azure Pipeline的执行环境里和你本地开发环境的工作目录不匹配,导致程序找不到指定的图片文件。
问题拆解
你本地运行时,项目的启动目录和图片文件的相对位置是吻合的,所以../../../Images/OutputImages/output-SlightSkew.jpg能正确指向文件;但在Azure Pipeline中,测试任务的工作目录可能是解决方案根目录、测试项目的bin目录或者其他路径,这时候多级回退的相对路径就指向了一个不存在的位置,自然抛出UnableToOpenBlob异常。
具体解决方案
下面几个方法亲测有效,你可以按需尝试:
用绝对路径替代相对路径(最稳妥)
基于当前程序集的执行目录来构建绝对路径,彻底避免相对路径的歧义:using System.Reflection; using System.IO; using ImageMagick; // 获取当前测试程序集的目录 var assemblyDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); // 组合出图片的完整绝对路径(根据你的项目结构调整回退的层级) var fullImagePath = Path.GetFullPath(Path.Combine(assemblyDirectory, "..", "..", "..", "Images", "OutputImages", "output-SlightSkew.jpg")); MagickImage sourceImage = new MagickImage(fullImagePath);Path.GetFullPath会帮你解析出最终的绝对路径,不管执行环境的工作目录是什么,都能精准定位到文件。确保图片文件被复制到输出目录
右键你的图片文件output-SlightSkew.jpg,在属性面板里设置复制到输出目录为「始终复制」或「如果较新则复制」。这样在构建时,图片会被同步到测试项目的输出目录中,之后你可以用更短的相对路径(比如./Images/OutputImages/output-SlightSkew.jpg)来访问,或者结合输出目录路径使用。检查Pipeline环境的文件结构
在Azure Pipeline的测试任务前,加一个PowerShell(Windows环境)步骤,打印当前工作目录和目录结构,确认图片是否存在:Write-Host "当前工作目录: $PWD" # 递归查找目标图片,确认位置 Get-ChildItem -Recurse | Where-Object {$_.Name -eq "output-SlightSkew.jpg"}这能帮你快速排查是路径写错了,还是文件根本没被部署到Pipeline环境里。
基于解决方案根目录构建路径
如果图片文件存放在解决方案根目录下的Images文件夹里,可以直接定位到解决方案根目录:var assemblyDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); // 回退到解决方案根目录(层级根据你的项目结构调整) var solutionRoot = Path.GetFullPath(Path.Combine(assemblyDir, "..", "..", "..", "..")); var imagePath = Path.Combine(solutionRoot, "Images", "OutputImages", "output-SlightSkew.jpg");
另外还要注意:如果你的Pipeline用的是DotNetTest任务,要确保测试项目的.csproj文件里正确包含了图片文件,避免构建时遗漏。
内容的提问来源于stack exchange,提问作者Karthick Raja

