AWS Run-Command远程EC2运行C#/Selenium/NUnit测试异常
这种跨环境的执行问题我碰过不少,核心差异就在AWS Run Command的执行上下文和手动登录会话完全不同上,给你梳理几个大概率的排查方向和解决办法:
1. 执行账户的权限与桌面会话限制
AWS Run Command默认用的是ssm-user(或者系统内置的Local System账户,取决于你的SSM Agent配置),这个账户和你手动登录EC2用的账户有两个关键区别:
- 没有桌面交互权限:Selenium启动浏览器需要桌面会话,而Run Command默认是无桌面的后台执行,直接启动浏览器会报错。
- 权限范围不同:可能没有访问测试依赖文件(比如浏览器驱动、测试资源)的权限,或者环境变量里没包含工具路径。
解决办法:
- 给Selenium启用无头模式:在你的C#测试代码里配置浏览器的无头参数,以Chrome为例:
var chromeOptions = new ChromeOptions(); chromeOptions.AddArgument("--headless=new"); // 新版Chrome的无头模式 chromeOptions.AddArgument("--disable-gpu"); chromeOptions.AddArgument("--no-sandbox"); // 避免权限问题 using var driver = new ChromeDriver(chromeOptions); - 如果必须用有桌面的模式,可以配置SSM Agent以交互式用户运行,或者在Run Command里调用
psexec来启动带桌面的会话(不过这个方案比较复杂,优先推荐无头模式)。
2. 环境变量与路径缺失
手动登录时,你的用户环境变量(比如PATH里包含了NUnit、ChromeDriver的路径)在Run Command的会话里是不存在的,它只会加载系统级的环境变量。这会导致找不到测试工具或者依赖组件。
解决办法:
在你的.bat脚本开头显式设置需要的环境变量,或者用绝对路径调用所有工具:
:: 切换到测试项目根目录 cd C:\your-test-project-folder :: 显式添加工具路径到PATH set PATH=%PATH%;C:\Program Files\NUnit.org\nunit-console;C:\drivers\chromedriver :: 用绝对路径执行测试 "C:\Program Files\NUnit.org\nunit-console\nunit3-console.exe" YourTestAssembly.dll
3. 工作目录不匹配
Run Command默认的工作目录是SSM Agent的安装目录(比如C:\Program Files\Amazon\SSM),而不是你的测试项目目录,这会导致测试找不到依赖的配置文件、资源,或者生成的TestResult.xml不在预期路径。
解决办法:
在.bat脚本的第一行就切换到测试项目的绝对路径,比如:
cd /d C:\path\to\your-test-project :: 然后再执行测试命令
4. 日志捕获不全导致无法定位错误
Run Command的默认输出可能只捕获到测试失败的结果,没拿到具体的错误信息(比如Selenium启动失败的原因、NUnit找不到测试用例的提示)。
解决办法:
在.bat脚本里把测试的输出重定向到日志文件,然后在PowerShell脚本里先读取这个日志文件,再解析TestResult.xml:
:: 执行测试并输出详细日志到文件 nunit3-console.exe YourTestAssembly.dll > test-execution.log 2>&1 :: 检查日志是否有错误,再继续后续步骤 if %errorlevel% neq 0 ( echo Test execution failed, check test-execution.log for details exit /b 1 )
之后在PowerShell脚本里可以把test-execution.log的内容上传到Bamboo的构建日志里,方便你排查具体错误。
快速排查步骤总结
- 先给测试加上详细日志,拿到具体的失败原因;
- 检查Run Command的执行账户是否有足够权限;
- 确认脚本里用了绝对路径或者显式设置了环境变量;
- 切换到正确的工作目录;
- 给Selenium启用无头模式(如果是UI测试)。
内容的提问来源于stack exchange,提问作者J-Roel

