.NET测试项目Docker容器化后PDF文件找不到求助
解决Docker容器中.NET测试PDF文件找不到的问题
核心原因分析
你的测试在本地和Azure Pipelines正常,但Docker容器内PDF上传测试失败,大概率是Selenium容器无法访问dotnet-tests容器内的文件——浏览器运行在独立的selenium容器中,它无法直接读取另一个容器的文件系统;其次可能是资源文件未正确复制到测试输出目录,或硬编码的绝对路径与测试运行路径不匹配。
具体解决方案
方案1:通过共享卷让Selenium容器访问文件
这是最可能解决问题的方案,因为PDF上传操作是由Selenium控制的浏览器执行的,浏览器需要能直接访问到文件:
- 修改
docker-compose.yml,给selenium服务添加卷挂载,将本地的测试文件目录共享到selenium容器:
services: selenium: image: selenium/standalone-chrome:4.9 container_name: selenium shm_size: 2g ports: - "4444:4444" - "7900:7900" networks: - testsuit-network healthcheck: test: [ "CMD", "curl", "-f", "http://selenium:4444/wd/hub/status" ] interval: 10s retries: 5 start_period: 30s timeout: 10s # 添加以下卷配置 volumes: - ./TestAutomation/Resources/TestFiles:/selenium-test-files
- 调整测试代码,通过环境变量切换文件路径,兼容本地和容器环境:
// 优先从环境变量获取测试文件路径,本地环境用程序集目录下的路径 string testFilesPath = Environment.GetEnvironmentVariable("TEST_FILES_PATH") ?? Path.Combine(AppContext.BaseDirectory, "Resources", "TestFiles"); filePath = Path.Combine(testFilesPath, fileName);
- 在
docker-compose.yml的dotnet-tests服务中添加环境变量,指定Selenium容器内的文件路径:
dotnet-tests: build: context: ./TestAutomation dockerfile: Dockerfile container_name: dotnet-tests depends_on: selenium: condition: service_healthy networks: - testsuit-network environment: - SELENIUM_URL=http://selenium:4444/wd/hub - TEST_FILES_PATH=/selenium-test-files # 添加这行 entrypoint: [ "dotnet", "test", "--logger:trx", "--filter", "DisplayName~Validate PDF file upload validation - Happy path scenario", "-l:console;verbosity=detailed" ]
方案2:确保资源文件被复制到测试输出目录
如果是测试代码本身找不到文件(而非Selenium的问题),检查并修正资源文件的复制配置:
在.NET项目中,右键
Happy.pdf文件,选择属性,设置复制到输出目录为始终复制或如果较新则复制。修改测试代码,基于程序集位置动态获取路径,避免硬编码绝对路径:
using System.Reflection; // 获取当前测试程序集的目录 var assemblyDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); string testFilesPath = Path.Combine(assemblyDirectory, "Resources", "TestFiles"); filePath = Path.Combine(testFilesPath, fileName);
- 可选:调整Dockerfile,确保测试运行在正确的输出目录:
FROM mcr.microsoft.com/dotnet/sdk:8.0 WORKDIR /app COPY ["TestAutomation.csproj", "./"] RUN dotnet restore "TestAutomation.csproj" COPY . . # 编译到指定输出目录 RUN dotnet build -c Release -o /app/out # 切换到输出目录运行测试 WORKDIR /app/out
方案3:检查路径大小写一致性
Linux容器对文件路径大小写敏感,确认代码中使用的文件名(如Happy.pdf)与容器内实际文件名的大小写完全一致,避免因大小写不匹配导致找不到文件。
内容的提问来源于stack exchange,提问作者Kashif Ali
相关产品推荐
相关产品推荐

