你能为MSTest运行配置设置临时环境变量吗?

7
我正在使用Visual Studio 2008和C#中的MSTest。我有一个特定的环境变量,我想在运行特定测试或更好地运行配置中的所有测试期间进行路径修改。
我尝试使用测试运行配置设置脚本来完成此操作,但正如我所预料的那样,由于它是批处理文件,一旦退出,更改就会丢失,因此这种方法行不通。
是否有其他方法可以设置临时系统环境变量,在运行所有测试期间有效?

你是从命令行(Dos/PowerShell)运行MSTest吗?还是从Visual Studio运行? - Rob
在 Visual Studio 2008 中,如果那不太清楚的话。使用默认的测试运行器等。 - Rodney S. Foley
2个回答

6
虽然我对这个解决方案不太满意,但是通过使用 ClassInitializeAttribute 来处理测试类,并使用 Environment.SetEnvironmentVariable 进行所需更改,再在装饰有 ClassCleanupAttribute 的方法中进行清理,我成功地完成了所需的工作。
虽然没有更好的答案,但这是我能够设置一组测试环境变量并在完成后清理它的方法。 但是,我更希望能够在代码之外处理此问题,并以某种方式成为测试配置的一部分。 无论如何,问题已得到解决。

如果您像这样设置变量 Environment.SetEnvironmentVariable("BatchSize", "1000", EnvironmentVariableTarget.Process); 它只会针对该进程,并在进程结束后被清除吗? - Jepzen

1

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

评论编辑:我知道您的想法,但是如我所述,UT框架旨在用于创建单元测试。单元测试的概念要求它不应依赖于任何外部资源,包括环境变量。这样做的测试是集成测试,并且需要许多基础设施(通常比等效LOC的单元测试套件花费更长时间)。

要为依赖于环境变量的代码创建单元测试,请考虑将实际检查环境变量的代码行拆分为另一个类中的方法,然后使用RhinoMocks或其他工具模拟该类,以提供“虚拟”值进行测试而无需检查(或更改)实际环境变量。

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

这似乎是一种更糟糕的做法。单元测试框架应该支持在代码之外添加临时环境变量的某些方法,这些变量将在测试或测试结束时消失。如果分配给变量的数据发生更改,则还需要更改大量代码。 - Rodney S. Foley
1
你如何提出一个单元测试框架,该框架的设计理念是单元测试不应该触及或依赖外部资源,也不应该修改外部资源? - KeithS
我建议他们考虑到我们无法控制的因素。我们使用的第三方库有时会做些愚蠢的事情,需要类似这样的处理方式。单元测试不应该仅仅是一种方式或者说是唯一的正确方式,就像其他任何东西一样,它应该是灵活的,“测试”框架不应该局限于“单元测试”,所有类型的测试,从集成测试到持续测试等,都应该得到“测试”框架的支持。 - Rodney S. Foley
好的,你如何使用MSTest进行Fixture类型的安装和拆卸? - Rodney S. Foley
我无法将您的回答标记为正确答案,因为它没有提供在MSTest中如何实现您所述内容的示例,且不能使用第三方库。我已经使用MSTest特定功能并在C#中解决了这个问题。但是,就目前而言,您的回答实际上并没有回答我的MSTest相关问题。 - Rodney S. Foley
@RodneyS.Foley - 抱歉如果这有点“死贴”,但是如果单元测试不仅测试单个代码单元(通常是单个函数的单个路径),那么它就不是单元测试。最好它应该被称为“单元组合测试”,但更好的名称可能是集成测试。如果其他人对MSTest中的“设置和拆卸”感到好奇,那么它们是ClassInitializeClassCleanupTestInitializeTestCleanup,尽管在过去十年中我只使用了这些东西大约六次,并且只真正使用了MSTest。 - StingyJack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接