2011-06-07 47 views
6

我在C#中使用Visual Studio 2008中的MSTest。我有一个特定的环境变量,我愿意和我希望仅在运行特定测试期间执行的路径修改,或者更好,但是在运行配置中进行所有测试。您可以为MSTest运行配置设置临时环境变量吗?

我试过使用测试运行配置安装脚本来做到这一点,但正如我预期的那样,因为它是一个批处理文件,一旦它退出,这些更改就会丢失,所以不会工作。

是否有任何其他方式来设置临时系统环境变量,这些变量在所有正在运行的测试中都有效?

+0

您是否从命令行(Dos/PowerShell)运行MSTest?还是从Visual Studio? – Rob 2011-06-07 17:06:54

+0

如果不清楚,请在Visual Studio 2008中对不起。使用默认的测试运行器等。 – 2011-06-07 17:10:18

回答

4

虽然我对这个解决方案不满意,但我能够通过使用ClassInitializeAttribute作为测试类,然后使用Environment.SetEnvironmentVariable来完成我需要的更改,然后清理干净在用ClassCleanupAttribute装饰的方法中。

由于缺乏更好的答案,这是我能够为一组测试设置环境变量并在完成时清理它。不过,我会优先选择在代码外部进行处理,并以某种方式成为测试配置的一部分。无论问题已经解决。

1

如果您相信您的测试套件不会在测试过程中“中止”,则可以使用FixtureSetup和FixtureTeardown方法来设置并删除已更改的环境变量。

从评论发表编辑:我看到你来自哪里,但正如在我的编辑中,UT框架被设计用于创建单元测试。单元测试的概念决定了它不应该依赖于任何外部资源,包括环境变量。这样做的测试是集成测试,并且需要大量的基础设施才能到位(通常比同等LOC的单元测试套件长很多倍)。

创建单元测试依赖于环境变量的代码,考虑拆分直接实际检查环境变量的代码行。并将其放入另一个类的方法中,然后使用RhinoMocks或其他任何方法来模拟该类,以便在不检查(或更改)实际环境变量的情况下为测试提供“虚拟”值。

如果这真的是一个集成测试,并且您确实需要环境变量集(例如您正在更改路径,以便您可以使用Process.Start调用您自己的notepad.exe而不是Windows),那就是FixtureSetup和FixtureTeardown方法/属性适用于;执行测试应该成功的固定的可重复环境的复杂设置,然后将环境重置为原来的方式,而不管测试中发生了什么。通常,测试失败会引发异常并立即终止该测试的执行,因此测试方法本身结束时的代码不能保证运行。

+0

这似乎是一种更糟糕的情况。看起来单元测试框架工作应该支持CODE之外的一些方法来添加在测试或测试结束时将消失的临时环境变量。如果分配给变量的数据发生变化,还需要更改大量代码。 – 2011-06-07 17:09:15

+1

你如何提出一个单元测试框架,这个框架是围绕单元测试不应该接触或依靠外部资源修改外部资源的概念而设计的? – KeithS 2011-06-07 17:13:10

+0

我建议他们考虑到我们无法控制的东西。我们使用的第三方图书馆有时会做出愚蠢的东西,需要像这样的废话。单元测试不仅仅是一种方式或高速公路,它应该是可变的,“测试”框架不应该是“单元测试”从集成到连续的所有类型的测试的独有,更应该由“测试“框架。 – 2011-06-07 17:34:37