使用 NUnit 时,我应该如何在运行时修改 app.config?

Posted

技术标签:

【中文标题】使用 NUnit 时,我应该如何在运行时修改 app.config?【英文标题】:How should I modify app.config at runtime when using NUnit? 【发布时间】:2013-12-06 11:13:27 【问题描述】:

我有一个正在测试控制台应用项目的 NUnit 测试项目。控制台应用程序项目大量使用 app.config 文件。从我的 NUnit 测试项目运行测试时,被测试的代码使用我的 Tests.dll.config 文件中的配置值。该文件位于我的测试项目的根目录中,是被测试应用的 app.config 文件的副本。

但是,在某些测试中,我需要更改某些配置设置的值。我一直在我的 Nunit 测试中使用它来做到这一点:

ConfigurationManager.AppSettings.Set("SettingKey" , "SettingValue");

我不希望我在一个测试中所做的这些运行时配置更改干扰或被任何其他测试看到。这是正确的方法吗?

更新 我还应该提到我的测试是并行运行的。我认为这是因为我正在使用 Re-sharper。 因此,如果我在一个测试中更改配置,我认为它可能会在另一个测试中更改配置,这是我不想要的。

【问题讨论】:

【参考方案1】:

是否可以在接口中包装代码读取配置? 例如:

public interface IAppSettings

   string Get(string settingKey);

因此您可以轻松地从 app.settings 文件中抽象出来。 然后在您的 NUnit 项目中,您可以通过一个简单的类实现 IAppSettings 并配置您的应用程序以使用它。在这种情况下,您无需阅读真正的 app.config 文件,并且可以轻松更改配置。它还将加快您的测试速度。

【讨论】:

谢谢。我可能会这样看。【参考方案2】:

您似乎对集成测试而不是单元测试感兴趣。原因是您的测试需要访问配置文件修改一些值,以便您的测试可以正确运行。

您说过您不希望您的运行时配置更改干扰其他测试。 处理这个问题的最好方法是使用 NUnit 内置的测试初始化​​和拆除方法。

例如,您可以使用 A. NUnit [setup] 属性对您的配置进行运行时更改

B. NUnit [teardown] 属性回滚你所做的更改

查看更多信息 http://www.nunit.org/index.php?p=setup&r=2.2.10

请注意,您班级中的每个测试都将运行上述设置/拆卸序列。

因此,如果您需要更多自定义方法,您可以简单地创建自己的设置方法,并在断言调用拆卸方法以清理/回滚您在设置方法中所做的事情之后,从您需要的测试中调用它。这样,它只会影响您需要它来更改配置值的测试。

例如(在伪代码中)

Public void Mytestmethod()
       Call my own test init
       Call SUT
       Perform Any asserts
       Call My own tear down

【讨论】:

问题是 Resharper 并行运行我的测试,所以我猜在一个测试初始化​​中更改配置可能会影响另一个测试? 不,我不这么认为。 Evern ReShaper 并行运行它们,您的测试上下文与测试本身隔离。所以我提到的 Setup/Teardown 或自定义方法应该没有效果。我们确实在我的工作环境中运行这样的 R# 测试。

以上是关于使用 NUnit 时,我应该如何在运行时修改 app.config?的主要内容,如果未能解决你的问题,请参考以下文章

使用 NUnit 对 app.config 文件进行单元测试

如何将非托管库引用添加到 NUnit 测试

如何在测试拆解时使用 NUnit 3 读取 ITestResult

即使在配置文件中使用 .NET 4.0 后,nunit 代理也会挂起

NUnit3 测试不在 TFS 构建上运行

NUnit 3.2.0 Console Runner System.NullReferenceException 与 /domain=multiple 一起运行时