如何在Visual Studio 2022的NUnit项目中运行ASP.NET MVC应用并测试
解决ASP.NET MVC4网站的Selenium自动化测试启动问题
1. 先给MVC4项目设置固定调试端口
- 打开MVC4项目的属性窗口,切换到「Web」选项卡
- 在「服务器」区域选择「IIS Express」,勾选「特定端口」并设置一个固定值(比如
50000) - 保存设置后,调试时网站会固定运行在
http://localhost:50000,避免每次URL变化
2. 在NUnit测试项目中通过代码启动网站
可以通过调用IIS Express的命令行来启动网站,在NUnit的一次性初始化/清理方法中完成网站的启停,配合Selenium执行测试:
完整代码示例
using System; using System.Diagnostics; using System.Net.Http; using System.Threading; using NUnit.Framework; using OpenQA.Selenium; using OpenQA.Selenium.Chrome; namespace YourTestProjectNamespace { [TestFixture] public class MvcWebsiteSeleniumTests { private Process _iisExpressProcess; private IWebDriver _webDriver; private const string TargetWebsiteUrl = "http://localhost:50000"; // 替换为你的MVC4项目物理路径 private const string WebsiteProjectPath = @"C:\Projects\YourMvc4WebsiteRoot"; // IIS Express默认路径,根据VS安装位置调整 private const string IisExePath = @"C:\Program Files\IIS Express\iisexpress.exe"; [OneTimeSetUp] public void InitializeTestSuite() { // 启动IIS Express托管网站 _iisExpressProcess = new Process { StartInfo = new ProcessStartInfo { FileName = IisExePath, Arguments = $"/path:\"{WebsiteProjectPath}\" /port:50000", UseShellExecute = false, CreateNoWindow = true } }; _iisExpressProcess.Start(); // 等待网站启动就绪,避免Selenium提前访问导致失败 WaitForWebsiteReady(TargetWebsiteUrl); // 初始化ChromeDriver(需提前安装对应NuGet包) _webDriver = new ChromeDriver(); _webDriver.Manage().Window.Maximize(); } [Test] public void TestHomePageTitle() { _webDriver.Navigate().GoToUrl(TargetWebsiteUrl); Assert.That(_webDriver.Title, Does.Contain("你的网站首页标题")); } [Test] public void TestNavigationToAboutPage() { _webDriver.Navigate().GoToUrl($"{TargetWebsiteUrl}/Home/About"); Assert.That(_webDriver.FindElement(By.TagName("h2")).Text, Does.Contain("About")); } [OneTimeTearDown] public void CleanupTestSuite() { // 关闭Selenium驱动 _webDriver?.Quit(); _webDriver?.Dispose(); // 终止IIS Express进程 _iisExpressProcess?.Kill(); _iisExpressProcess?.Dispose(); } private void WaitForWebsiteReady(string url, int timeoutSeconds = 30) { var httpClient = new HttpClient(); var startTimestamp = DateTime.Now; while (DateTime.Now.Subtract(startTimestamp).TotalSeconds < timeoutSeconds) { try { var response = httpClient.GetAsync(url).Result; if (response.IsSuccessStatusCode) { return; } } catch { // 忽略启动过程中的请求失败,继续等待 } Thread.Sleep(1000); } throw new TimeoutException($"网站在{timeoutSeconds}秒内未完成启动"); } } }
3. 关键注意事项
- 确保测试项目已安装
Selenium.WebDriver和Selenium.WebDriver.ChromeDriverNuGet包 - 运行测试时,Visual Studio需以管理员权限启动,避免IIS Express启动权限不足
- 如果不想固定端口,可以通过代码动态获取可用端口,但固定端口更适合自动化测试的稳定性
- 若IIS Express路径与示例不同,需根据实际安装位置调整
IisExePath的值
内容的提问来源于stack exchange,提问作者Tom C
相关产品推荐
相关产品推荐

