在 STA 下运行 NUnit 测试的问题

Posted

技术标签:

【中文标题】在 STA 下运行 NUnit 测试的问题【英文标题】:Problem with runnig NUnit tests under STA 【发布时间】:2009-08-10 18:05:24 【问题描述】:

我有一些 NUnit 测试用例需要在 STA 模型下运行。

正如在许多网站或博客(例如 here)中所讨论的,我向我的 NUnit 测试程序集添加了一个配置文件(“app.conig”),其中包含以下内容。

 <?xml version="1.0" encoding="utf-8" ?>
 <configuration>
   <configSections>
     <sectionGroup name="NUnit">
       <section name="TestRunner" type="System.Configuration.NameValueSectionHandler"/>
     </sectionGroup>
   </configSections>
   <NUnit>
     <TestRunner>
       <add key="ApartmentState" value="STA" />
     </TestRunner>
   </NUnit>
 </configuration>

为了验证测试是否真的在 STA 下运行,我放置了这个测试用例:

 [Test]
 public void CheckSTA()
 
    ApartmentState aptState = Thread.CurrentThread.GetApartmentState();

    Assert.IsTrue(aptState == ApartmentState.STA);
 

如果我在 NUnit 控制台或 NUnit GUI 上运行我的单元测试不使用 NUnit 项目文件,这会很好。

但是,一旦我通过 NUnit 项目文件 (.nunit) 将单元测试加载到 NUnit GUI,单元测试就会开始失败。

我已按照此博客 (Here) 上的内容尝试了不同的配置文件名,但使用“app.config”以外的任何配置文件名都会导致我的单元测试在任何情况下都失败。

也就是说,设置它以便我的单元测试无论如何都在 STA 下运行的正确方法是什么?

【问题讨论】:

【参考方案1】:

从 NUnit 2.5 开始,您可以使用 RequiresSTAAttribute。

【讨论】:

请在nunit.org/index.php?p=requiresSTA&r=2.5找到文档和示例代码 最简单的 2.5 方法就是将 [assembly:RequiresSTA] 属性添加到您的 AssemblyInfo.cs。正如你所做的那样,我发现 NUnit 项目忽略了 App.config STA 设置(尽管 Resharper 和 Visual Studio 会尊重它)。应用程序集属性是一个很好的即发即弃的解决方案! 如果您更新答案以包含 NUnit 3.0 的 [Apartment(ApartmentState.STA)],则可获得奖励积分。【参考方案2】:

评论经常被忽略,因为jnm2 给出了一个重要的提示......显然,如果在此处添加此评论作为附加答案,我可以获得一些奖励积分...... ;-)

对于 NUnit 3.x 使用 [Apartment(ApartmentState.STA)]

附言额外奖励:我修复了文档的链接。

【讨论】:

【参考方案3】:

对于 NUnit 3.11,另一个对我有用的解决方案是将以下属性放在 AssemblyInfo 中:

[程序集:RequiresThread(ApartmentState.STA)]

【讨论】:

以上是关于在 STA 下运行 NUnit 测试的问题的主要内容,如果未能解决你的问题,请参考以下文章

NUnit3 测试不在 TFS 构建上运行

在 STA Thread WPF 下运行多个 xunit 测试时出现问题

问题在Jenkins上运行NUnit测试

如何迭代地运行 nunit 测试

你如何从 Jenkins 运行 NUnit 测试?

Unity 单元测试(NUnit,UnityTestTools)