每次构建时,我都有 NUnit GUI 运行程序在我的单元测试程序集上运行测试。问题是当我尝试构建时,调试文件夹中的 .dll 正在被 NUnit 使用,这会阻止它被构建,从而阻止自动测试运行。有没有解决的办法?
3 回答
我可以建议一种稍微不同的方法,但与@UvarajGopu 的思路相同......
只要您使用高于“Express”版本的 Visual Studio,并且如果您在单独的项目中编写 UnitTest(通常与正在测试的项目一起,带有“.UnitTests”后缀),那么请执行以下操作:
- 将您的 UnitTests 项目设置为启动项目(在解决方案资源管理器中右键单击,“设置为启动项目”)
- 在该项目的项目属性中,在“调试”选项卡中,选择“启动外部程序”,然后选择 NUnit GUI 可执行文件。将 UnitTests 程序集的名称放在“命令行参数”中。
现在您可以简单地按 F5(开始调试)来构建您的项目,然后为您启动 NUnit GUI。这还有一个额外的好处,如果您的测试失败,您可以添加断点,并逐步使用调试器(无需手动附加调试器)。
每当您构建解决方案时。我建议您关闭与您的 .dll 一起加载的 Nunit。卸载后尝试构建,然后您的构建将成功。
由于 Nunit 正在使用您的 .dll。它不会让你的构建成功。
不久前我遇到了类似的问题,我的最终解决方案是放弃使用 NUnit GUI 运行程序,直接从代码中运行它们。
在我的项目中,我引用了那些新构建的 dll 以及 nunit.core 和 nunit.utils 所需的 NUnit 库。代码本身非常简单:
TestResult ExecuteTests(string testAssemblyPath) {
CoreExtensions.Host.InitializeService();
TestPackage testPackage = new TestPackage(testAssemblyPath);
testPackage.BasePath = Path.GetDirectoryName(testAssemblyPath);
RemoteTestRunner testRunner = new RemoteTestRunner();
testRunner.Load(testPackage);
TestResult testResult = testRunner.Run(new NullListener(), TestFilter.Empty, true, LoggingThreshold.Warn);
testRunner.Unload();
CoreExtensions.Host.UnloadService();
return testResult;
}
该TestResult
对象非常强大。除其他外,它包含所有结果、子结果、测试本身等。为了分析它们,您可以创建一个简单的解析器或使用 NUnit 库提供的一种可能性。我最喜欢的是XmlResultWriter
,但也有其他可用的。所有这些都可以在 nunit.util.dll 中找到。
不幸的是,这仍然会阻止重新构建加载的 dll。我通过在单独的 AppDomain 中运行它并在测试完成运行后卸载此域来避免这个问题。然后 dll 被很好地释放,你可以随心所欲地使用它。