49

我在运行单元测试时遇到了错误。如果我调试单元测试 vstest.executionengine.x86.exe 运行,然后在测试通过时关闭。

如果我只是运行测试(即使测试就像创建一个新列表一样简单,没有断言)vstest.executionengine.x86.exe 不会关闭并继续在任务管理器中运行。

在编写更复杂的测试(包括删除文件/清理 sqllite 数据库)时,这给我带来了问题。

任何帮助,将不胜感激。

编辑 :

重现步骤 :

  • 创建新的单元测试项目
  • 调试单元测试 - vstest.executionengine.x86 打开和关闭,测试通过。
  • 运行单元测试 - vstest.executionengine.x86 打开并保持打开状态
4

6 回答 6

57

这是设计使然。

仅当我们检测到两次连续测试运行之间的配置更改时,才会重新启动 vstest.executionengine.exe。这有助于确保我们不会对进程重启造成不必要的影响。

产品更新 对于 VS2013,我们在测试 -> 测试设置下有一个新菜单项,称为“保持测试执行引擎运行”。您可以取消选中此项以退出默认行为。

于 2012-12-05T05:16:10.620 回答
41

我通过使用以下作为受影响测试项目的预构建事件来解决此问题:

对于 64 位:

taskkill /F /IM vstest.executionengine.exe /FI "MEMUSAGE gt 1"

或 32 位:

taskkill /F /IM vstest.executionengine.x86.exe /FI "MEMUSAGE gt 1"

这会在构建测试项目之前默默地杀死执行引擎。/FI "MEMUSAGE gt 1"如果执行引擎未运行,则停止命令(因此构建)失败。

于 2013-02-03T21:12:47.130 回答
5

不管它的价值是什么,我遇到了同样的情况,结果我有一个测试没有正确清理它的所有资源。在我的具体情况下,有一个打开网络连接的后台线程在测试退出之前没有关闭。不知道为什么退出测试并没有为我关闭它,但是当我修复我的代码以正确处理我打开的所有资源时,一切都按预期工作。我不必添加任何黑客来杀死vstest.executionengine.exe,也不必选择退出Test -> Test Settings -> Keep Test Execution Engine Running

于 2015-05-02T22:20:15.507 回答
2

我在使用 Resharper 的测试运行器运行测试时遇到了这个问题,它似乎不尊重Test-->Test Settings-->Keep Test Execution Engine Running设置。在我的情况下,它导致构建失败并出现以下错误:

警告 MSB3026:无法将“...\SQLite.Interop.dll”复制到“bin\Debug\x86\SQLite.Interop.dll”。在 1000 毫秒内开始重试 10。该进程无法访问文件“bin\Debug\x86\SQLite.Interop.dll”,因为它正被另一个进程使用。

正如@HappyCat 建议的那样,向测试项目添加预构建事件对我有用。我还需要将它包装在 if 语句中,以防止它在构建服务器上运行并干扰其他作业。

if $(ConfigurationName) == Debug (
    echo "attempting to kill vstest to prevent access denied on sqlite.interop.dll"
    taskkill /F /IM vstest.executionengine.x86.exe /FI "MEMUSAGE gt 1"
)
于 2017-03-16T15:43:22.820 回答
1

我知道这很旧,但我想我会加入我刚刚发现的东西。

我正在运行的测试中有一些已实现IDisposable的对象,因此代码分析告诉我我的测试类也应该如此。花了一段时间才意识到这一点,但是当this.Dispose();我把它放在我的测试类上时,当被调用该接口的实现时,它实际上是抛出了一个 StackOverflow 异常。所以我只是猛拉界面,让CA继续抱怨。

我不需要切换“保持测试执行引擎运行”。

于 2014-09-25T19:11:36.170 回答
0

最简单的方法是去windows任务管理器。注意在后台运行的 vstest.executionengine.exe 进程。终止该进程,它现在应该可以正常工作了。

于 2019-07-16T04:19:31.090 回答