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

如何在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.ChromeDriver NuGet包
  • 运行测试时,Visual Studio需以管理员权限启动,避免IIS Express启动权限不足
  • 如果不想固定端口,可以通过代码动态获取可用端口,但固定端口更适合自动化测试的稳定性
  • 若IIS Express路径与示例不同,需根据实际安装位置调整IisExePath的值

内容的提问来源于stack exchange,提问作者Tom C

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 20:05:47