运行单元测试时遇到错误。如果我调试单元测试vstest.executionengine.x86.exe运行,则在测试通过时关闭。
如果我只是运行测试(即使测试就像创建新列表一样简单,没有断言)vstest.executionengine.x86.exe也不会关闭并在任务管理器中继续运行。
在编写包含删除文件/清理sqllite数据库的更复杂测试时,这对我来说是一个问题。
任何帮助都将不胜感激。
编辑:
重现的步骤:
答案 0 :(得分:56)
这是设计的。
仅当我们检测到两次连续测试运行之间的配置更改时,才会重新启动vstest.executionengine.exe。这有助于确保我们不会不必要地重新启动流程。
产品更新 使用VS2013,我们在Test下有一个新的菜单项 - >名为“保持测试执行引擎运行”的测试设置。您可以取消选中此选项以退出默认行为。
答案 1 :(得分:40)
我通过在受影响的测试项目中使用以下作为预构建事件来解决这个问题:
表示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"
将停止命令(因此构建)失败。
答案 2 :(得分:5)
为了它的价值,我遇到了同样的情况,结果发现我有一个没有正确清理其所有资源的测试。在我的特定情况下,有一个打开网络连接的后台线程在测试退出之前没有关闭。不知道为什么退出测试没有为我关闭这个,但是当我修复我的代码以正确处理我打开的所有资源时,一切都按预期工作。我没有添加任何黑客来杀死vstest.executionengine.exe
,我也不必选择退出Test -> Test Settings -> Keep Test Execution Engine Running
答案 3 :(得分:1)
我知道这已经老了,但我以为我会扔掉我刚发现的东西。
我正在运行的测试中有一些实现了IDisposable
的对象,因此代码分析告诉我,我的测试类也应如此。它需要一段时间来实现它,但是当我将它放在我的测试类上时,当this.Dispose();
被调用该接口的实现时,它实际上抛出了一个StackOverflow异常。所以我只是猛拉了界面,让CA继续抱怨。
我不需要切换'保持测试执行引擎运行'。
答案 4 :(得分:1)
使用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"
)
答案 5 :(得分:0)
最简单的方法是转到Windows任务管理器。查找在后台运行的vstest.executionengine.exe进程。终止该过程,它现在应该可以正常工作。