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

VS2017下NUnit 3.11的SetUp/OneTimeSetUp方法未触发求助

NUnit 3.11中SetUp/OneTimeSetUp未触发导致空引用异常的解决方案

兄弟,我一眼就揪出问题根源了——你把MSTest的属性和NUnit框架混着用了!这就是SetUp方法完全没执行、driver一直为空最后抛出NullReferenceException的核心原因。

问题拆解

  1. 属性不匹配:你代码里的[TestClass]是MSTest框架的测试类标记,但你用的是NUnit 3.11。NUnit根本识别不了这个属性,自然不会去执行标注了[SetUp]的初始化方法。
  2. Base类的错误设置:你的Base类不仅没必要加[TestClass](它是工具类不是测试类),还默认用了internal访问修饰符,跨命名空间访问会出问题;而且IE分支的代码里重新声明了局部变量IWebDriver driver,没给类的this.driver赋值,就算选IE浏览器,driver还是空的。

修正后的代码

测试类(Training.cs)

using GV5Base;
using NUnit.Framework; // 务必引用NUnit的命名空间

namespace DBPAutomation.Test 
{
    // 用NUnit的[TestFixture]替换MSTest的[TestClass]
    [TestFixture]
    public class Training 
    {
        public IWebDriver driver;

        // NUnit的[SetUp]会在每个测试方法执行前触发
        [SetUp]
        public void BrowserInitialize() 
        {
            Base bs = new Base();
            bs.SetBrowser("Chrome");
            driver = bs.driver;
        }

        // 别忘了添加测试方法示例
        [Test]
        public void VerifyGoogleTitle()
        {
            StringAssert.Contains("Google", driver.Title);
        }

        // 每个测试执行后清理浏览器
        [TearDown]
        public void CleanupBrowser()
        {
            driver?.Quit();
        }
    }
}

工具类(Base.cs)

using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.IE;

// 改为public类,允许跨命名空间访问
namespace Base 
{
    // 这里不需要任何测试框架属性,它只是工具类
    public class Base 
    {
        public IWebDriver driver;
        public string TestUrl = "http://google.com";

        public void SetBrowser(string browser) 
        {
            if(browser == "Chrome") 
            {
                this.driver = new ChromeDriver();
                driver.Navigate().GoToUrl(TestUrl);
            } 
            else if(browser == "IE") 
            {
                // 去掉局部变量声明,给类的driver字段赋值
                this.driver = new InternetExplorerDriver();
                driver.Navigate().GoToUrl(TestUrl);
            }
        }
    }
}

关于OneTimeSetUp的补充说明

如果你想用[OneTimeSetUp](整个测试类的所有测试方法执行前只跑一次初始化),需要注意:

  • 修饰的方法如果是非静态的,必须给测试类加[TestFixture(SingleInstance = true)](NUnit默认每个测试方法创建一个类实例,不加的话OneTimeSetUp会被执行多次)
  • 这种方式下driver会被所有测试共享,要注意测试之间的隔离问题(比如每个测试后刷新页面或重置状态)

最后检查

  • 确认项目已经安装了NUnit和NUnit3TestAdapter的NuGet包
  • 在Visual Studio的测试运行器中选择NUnit,而不是MSTest

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:33:25