You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET测试项目Docker容器化后PDF文件找不到求助

解决Docker容器中.NET测试PDF文件找不到的问题

核心原因分析

你的测试在本地和Azure Pipelines正常,但Docker容器内PDF上传测试失败,大概率是Selenium容器无法访问dotnet-tests容器内的文件——浏览器运行在独立的selenium容器中,它无法直接读取另一个容器的文件系统;其次可能是资源文件未正确复制到测试输出目录,或硬编码的绝对路径与测试运行路径不匹配。

具体解决方案

方案1:通过共享卷让Selenium容器访问文件

这是最可能解决问题的方案,因为PDF上传操作是由Selenium控制的浏览器执行的,浏览器需要能直接访问到文件:

  1. 修改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
  1. 调整测试代码,通过环境变量切换文件路径,兼容本地和容器环境:
// 优先从环境变量获取测试文件路径,本地环境用程序集目录下的路径
string testFilesPath = Environment.GetEnvironmentVariable("TEST_FILES_PATH") 
                       ?? Path.Combine(AppContext.BaseDirectory, "Resources", "TestFiles");
filePath = Path.Combine(testFilesPath, fileName);
  1. 在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的问题),检查并修正资源文件的复制配置:

  1. 在.NET项目中,右键Happy.pdf文件,选择属性,设置复制到输出目录为始终复制或如果较新则复制。

  2. 修改测试代码,基于程序集位置动态获取路径,避免硬编码绝对路径:

using System.Reflection;

// 获取当前测试程序集的目录
var assemblyDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string testFilesPath = Path.Combine(assemblyDirectory, "Resources", "TestFiles");
filePath = Path.Combine(testFilesPath, fileName);
  1. 可选:调整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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 17:31:06