【问题标题】:NUnit is ignoring DomainUsage in the runsettings fileNUnit 忽略了运行设置文件中的 DomainUsage
【发布时间】:2020-01-19 22:27:28
【问题描述】:

我正在使用带有 NUnit 的“测试资源管理器”和 .runsettings 文件(通过在 GUI“选择设置文件”中选择选项来指定)在 Visual Studio 中运行测试

我的设置文件(称为mytests.runsettings)是:

<?xml version="1.0" encoding="utf-8"?>
<RunSettings>
  <RunConfiguration>
    <DisableAppDomain>True</DisableAppDomain>
  </RunConfiguration>
  <ForceListContent>true</ForceListContent>
  <NUnit>
    <DomainUsage>None</DomainUsage>
  </NUnit>
</RunSettings>

我已经验证它正在加载这个文件(通过添加框架节点并将其设置为假版本来验证,这会导致错误)。

但无论我做什么,没有 AppDomain 就无法运行!

从命令行运行是否工作:

nunit3-console.exe --domain=None --inprocess MyTests.dll

我需要做什么才能让它在 NUnit 中使用该设置?

【问题讨论】:

    标签: visual-studio nunit nunit-3.0 vstest visual-studio-test-runner


    【解决方案1】:

    我不相信你能做到。

    1. runsettings 文件中的NUnit 下没有可识别的DomainUsage 元素。 DomainUsage 是一个内部使用的属性,如果设置,它将被尊重。但你不能这样设置。您的 DomainUsage 元素只是被忽略了。

    2. 如果适配器收到您的DisableAppDomain 设置,那么它DomainUsage 设置为None。但是,我不相信它真的收到了。

    第 2 点需要一些解释。请注意,我已经有几年没有在适配器上工作了,我正在记忆中,但在这里......

    添加了DisableAppDomain 设置以允许Visual Studio 强制NUnit 尝试在不使用AppDomain 的情况下运行。测试资源管理器应该进行设置,以便可能以这种方式运行,即确保所有内容都已在当前域中可用。

    为了防止滥用该功能,我相信测试资源管理器总是会覆盖任何用户提供的设置。同样,这是对几年前所做工作的记忆,但您所看到的结果似乎证实了这一点。

    过去做出这一决定的理由是,Test Explorer 完全负责设置用于运行测试的 Process 和 AppDomain。用户无法影响这一点,NUnit 也没有。当然,在使用控制台运行器时,情况并非如此 - 控制权在用户手中。

    还有一点需要调查的是为什么你觉得有必要在没有创建测试AppDomain 的情况下运行。但这可能是另一个问题。 :-)

    我会请其他可能记忆力比我好的人来看看这个。

    更新:

    现在维护适配器的@Terje 回复并确认无法在runsettings 文件中设置DomainUsage 或在测试适配器下运行时我们知道的任何其他方式。文档已被更正,以避免暗示这是可能的。

    我们相信,但尚未通过实验证实,只要 TestExplorer 使用此设置来禁止测试适配器创建它时,它就会创建自己的 AppDomain。

    【讨论】:

    • 我很困惑,因为这个文档 (github.com/nunit/docs/wiki/Tips-And-Tricks) 说你可以在运行设置文件中设置DomainUsage。我可以通过环境变量设置DomainUsage 吗?还是通过项目属性命令?
    • 可能是当时写了这些提示。如果您查看github.com/nunit/nunit3-vs-adapter/blob/master/src/… 的当前代码,您会看到该设置被忽略。我已经让 Terje 对我的回答发表评论。
    • 谢谢,我很感激,也期待 Terje 的见解。你知道为什么 Visual Studio 设置不起作用吗?第 238 行似乎表明它应该:github.com/nunit/nunit3-vs-adapter/blob/master/src/…
    • 必须有人调试它才能弄清楚。但是,.runsettings 文件不是直接读取的,IIRC,而是由测试资源管理器调解,所以一切皆有可能。
    • 关于第 1 点:@charlie 是正确的,[当前] 无法从 runsettings 文件中设置此元素。这应该在 wiki 页面中指定。然而,我确实想知道这是否一直如此。
    【解决方案2】:

    这个答案是对上面@charlie 的回答的后续,只是这里需要更多的空间。 我根据是否设置了 DisableAppDomain 检查了正在创建的域。 当禁用应用程序域未设置时,应用程序域由 NUnit 创建,应用程序库和友好名称如下所示:

    NUnitCheckDomain 是测试 dll。

    当disable app domain为set时,NUnit不再设置自己的domain,然后你会看到它运行在testhost appdomain下,也就是运行所有测试的进程:

    所以这似乎以它应该和可以的方式工作。 您是否需要它在其中之一以外的其他应用程序域下运行?

    顺便说一句:如果我使用 NUnit3 控制台运行 NUnitCheckDomain 测试程序集,那么它 a) 在直接运行时可以工作 b) 与您在上面提供的参数(domain=None 和 --inprocess)一起使用时崩溃并且无法加载NUnit.Framework。 @charlie - 任何原因这不应该使用 NUnit3-Console 一样工作?

    【讨论】:

    • 感谢您的帮助。问题是我们通过HostedWebCore 使用IIS,它似乎只在默认的AppDomain 中。在没有域的命令行中使用 NUnit 时,这可以正常工作,但是 VS Test 创建了一个非默认的 AppDomain,然后导致此问题。有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-15
    • 2015-09-04
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-10
    相关资源
    最近更新 更多