VS2017下NUnit 3.11的SetUp/OneTimeSetUp方法未触发求助
NUnit 3.11中SetUp/OneTimeSetUp未触发导致空引用异常的解决方案
兄弟,我一眼就揪出问题根源了——你把MSTest的属性和NUnit框架混着用了!这就是SetUp方法完全没执行、driver一直为空最后抛出NullReferenceException的核心原因。
问题拆解
- 属性不匹配:你代码里的
[TestClass]是MSTest框架的测试类标记,但你用的是NUnit 3.11。NUnit根本识别不了这个属性,自然不会去执行标注了[SetUp]的初始化方法。 - 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
相关产品推荐
相关产品推荐

