在发现 MSTest 框架测试期间键入加载异常
Type load exception during discovering MSTest Framework tests
最近,当我们尝试使用 Jenkins 的 MSTest 运行 进行测试时,我们收到了 'TargetInvocationException' 错误。今天我从 MSTest 切换到 VsTest.Console.exe,虽然我能够得到更详细的错误消息,但问题是一样的。
我找不到任何关于 Google 可能导致此异常的指示。如果我理解正确,那么异常不是来自我们的测试,而是来自 MSTest 框架。
TpTrace Warning: 0 : 10032, 3, 2018/10/31, 15:22:23.137, 54721019933, testhost.x86.exe, TestSettings will soon be deprecated for automated unit and functional testing scenarios. It is recommended that you use RunSettings. To learn more, see http://aka.ms/runsettings
TpTrace Verbose: 0 : 10032, 3, 2018/10/31, 15:22:23.137, 54721020301, testhost.x86.exe, TestRequestHandler.SendData: sending data from testhost: {"Version":2,"MessageType":"TestSession.Message","Payload":{"MessageLevel":1,"Message":"TestSettings will soon be deprecated for automated unit and functional testing scenarios. It is recommended that you use RunSettings. To learn more, see http://aka.ms/runsettings"}}
TpTrace Error: 0 : 10032, 3, 2018/10/31, 15:22:23.256, 54721419216, testhost.x86.exe, TmiDiscoveryRequest: Error occured while discovering tests from source F:\Jenkins\Workspace\[...]\My.dll. System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.TypeInitializationException: The type initializer for 'Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestExtensionInfo' threw an exception. ---> System.TypeLoadException: Could not load type 'Microsoft.VisualStudio.TestTools.Common.TestTypesXml' from assembly 'Microsoft.VisualStudio.QualityTools.Common, Version=15.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.
at Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestExtensionInfo..cctor()
--- End of inner exception stack trace ---
at Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestExtensionInfo.GetExtensionNames(IWarningHandler warningHandler)
at Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestTip.InitializeExtensions()
at Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestTip..ctor(ITmi tmiInstance)
--- End of inner exception stack trace ---
at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
at System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes, StackCrawlMark& stackMark)
at System.Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
at System.Activator.CreateInstance(Type type, Object[] args)
at Microsoft.VisualStudio.TestTools.TestManagement.TipDelayLoader.LoadTip()
at Microsoft.VisualStudio.TestTools.TestManagement.TipDelayLoader.GetTip()
at Microsoft.VisualStudio.TestTools.TestManagement.Tmi.GetTipsFromTestTypeInfos(IList`1 infos)
at Microsoft.VisualStudio.TestTools.TestManagement.Tmi.LoadTestsFromTipsHelper(IEnumerable`1 locations, ProjectData projectData)
at Microsoft.VisualStudio.TestTools.TestManagement.Tmi.LoadTests(IEnumerable`1 locations, ProjectData projectData, TestConflictHandler vetoingHandler)
at Microsoft.VisualStudio.TestTools.TestManagement.Tmi.LoadTests(String location, ProjectData projectData, TestConflictHandler vetoingHandler)
at Microsoft.VisualStudio.TestTools.TestManagement.Tmi.LoadTests(String location, ProjectData projectData)
at Microsoft.VisualStudio.TestPlatform.Extensions.TmiHelper.TmiDiscoveryRequest.DiscoverTests(String source, Tmi tmi)
at Microsoft.VisualStudio.TestPlatform.Extensions.TmiHelper.TmiDiscoveryRequest.DiscoverTests(IEnumerable`1 sources, Tmi tmi)
TpTrace Information: 0 : 10032, 3, 2018/10/31, 15:22:23.257, 54721419815, testhost.x86.exe, TestDiscoveryManager.RunMessage: calling TestRunMessage(Warning, Exception has been thrown by the target of an invocation.) callback.
TpTrace Warning: 0 : 10032, 3, 2018/10/31, 15:22:23.257, 54721420131, testhost.x86.exe, Exception has been thrown by the target of an invocation.
我的想法是这个错误是在 Visual Studio 更新后出现的,但我不能确定。我们在 Jenkins 机器上使用 Visual Studio Community 2017 15.8.8。 运行 VS 的测试没有问题。另外值得一提的是,我们仍然使用 TestSettings,并且在开始时收到以下警告消息:
Test run will use DLL(s) built for framework .NETFramework,Version=v4.5 and platform X86. Following DLL(s) do not match framework/platform settings.
SPManagerTests.dll is built for Framework 4.5.2 and Platform AnyCPU.
但是我发现这些并不是那么重要
知道如何继续解决问题吗?
今天回过头来看问题,发现如下:
- VsTest.Console.exe 在我没有指定 .testsettings 文件时可以执行测试
- 当我尝试迁移到 .runsettings 时,我收到了一条类似的错误消息,我用谷歌搜索了一下:
Method not found: 'Void Microsoft.VisualStudio.TestTools.Common.TestRunConfiguration.AddTestSettingsProperties(System.Collections.Generic.Dictionary`2<System.String,System.Object>)'.
- 结果 there is an issue with the VS Remote Tools 2017 应该在三月份就修复了,但问题显然没有修复
如果您遇到同样的问题,那么只需卸载 Visual Studio 远程工具。 这两个问题都可以解决。在那之前我尝试用 MS 重新打开这个问题。
对于需要能够在目标机器上进行远程调试和 运行 测试的任何人,执行以下步骤将克服此错误:
从 KEY_LOCAL_MACHINE\SOFTWARE\Classes\Installer\Assemblies\Global
中删除 Microsoft.VisualStudio.TestTools.Common 的条目
运行 'gacutil /u Microsoft.VisualStudio.TestTools.Common'
需要第 1 步才能将其从 GAC 中删除。 VS Remote Tools 2017 的安装将有问题的 dll 添加到 GAC,该版本与 运行 测试所需的版本不同。
最近,当我们尝试使用 Jenkins 的 MSTest 运行 进行测试时,我们收到了 'TargetInvocationException' 错误。今天我从 MSTest 切换到 VsTest.Console.exe,虽然我能够得到更详细的错误消息,但问题是一样的。
我找不到任何关于 Google 可能导致此异常的指示。如果我理解正确,那么异常不是来自我们的测试,而是来自 MSTest 框架。
TpTrace Warning: 0 : 10032, 3, 2018/10/31, 15:22:23.137, 54721019933, testhost.x86.exe, TestSettings will soon be deprecated for automated unit and functional testing scenarios. It is recommended that you use RunSettings. To learn more, see http://aka.ms/runsettings
TpTrace Verbose: 0 : 10032, 3, 2018/10/31, 15:22:23.137, 54721020301, testhost.x86.exe, TestRequestHandler.SendData: sending data from testhost: {"Version":2,"MessageType":"TestSession.Message","Payload":{"MessageLevel":1,"Message":"TestSettings will soon be deprecated for automated unit and functional testing scenarios. It is recommended that you use RunSettings. To learn more, see http://aka.ms/runsettings"}}
TpTrace Error: 0 : 10032, 3, 2018/10/31, 15:22:23.256, 54721419216, testhost.x86.exe, TmiDiscoveryRequest: Error occured while discovering tests from source F:\Jenkins\Workspace\[...]\My.dll. System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.TypeInitializationException: The type initializer for 'Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestExtensionInfo' threw an exception. ---> System.TypeLoadException: Could not load type 'Microsoft.VisualStudio.TestTools.Common.TestTypesXml' from assembly 'Microsoft.VisualStudio.QualityTools.Common, Version=15.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.
at Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestExtensionInfo..cctor()
--- End of inner exception stack trace ---
at Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestExtensionInfo.GetExtensionNames(IWarningHandler warningHandler)
at Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestTip.InitializeExtensions()
at Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestTip..ctor(ITmi tmiInstance)
--- End of inner exception stack trace ---
at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
at System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes, StackCrawlMark& stackMark)
at System.Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
at System.Activator.CreateInstance(Type type, Object[] args)
at Microsoft.VisualStudio.TestTools.TestManagement.TipDelayLoader.LoadTip()
at Microsoft.VisualStudio.TestTools.TestManagement.TipDelayLoader.GetTip()
at Microsoft.VisualStudio.TestTools.TestManagement.Tmi.GetTipsFromTestTypeInfos(IList`1 infos)
at Microsoft.VisualStudio.TestTools.TestManagement.Tmi.LoadTestsFromTipsHelper(IEnumerable`1 locations, ProjectData projectData)
at Microsoft.VisualStudio.TestTools.TestManagement.Tmi.LoadTests(IEnumerable`1 locations, ProjectData projectData, TestConflictHandler vetoingHandler)
at Microsoft.VisualStudio.TestTools.TestManagement.Tmi.LoadTests(String location, ProjectData projectData, TestConflictHandler vetoingHandler)
at Microsoft.VisualStudio.TestTools.TestManagement.Tmi.LoadTests(String location, ProjectData projectData)
at Microsoft.VisualStudio.TestPlatform.Extensions.TmiHelper.TmiDiscoveryRequest.DiscoverTests(String source, Tmi tmi)
at Microsoft.VisualStudio.TestPlatform.Extensions.TmiHelper.TmiDiscoveryRequest.DiscoverTests(IEnumerable`1 sources, Tmi tmi)
TpTrace Information: 0 : 10032, 3, 2018/10/31, 15:22:23.257, 54721419815, testhost.x86.exe, TestDiscoveryManager.RunMessage: calling TestRunMessage(Warning, Exception has been thrown by the target of an invocation.) callback.
TpTrace Warning: 0 : 10032, 3, 2018/10/31, 15:22:23.257, 54721420131, testhost.x86.exe, Exception has been thrown by the target of an invocation.
我的想法是这个错误是在 Visual Studio 更新后出现的,但我不能确定。我们在 Jenkins 机器上使用 Visual Studio Community 2017 15.8.8。 运行 VS 的测试没有问题。另外值得一提的是,我们仍然使用 TestSettings,并且在开始时收到以下警告消息:
Test run will use DLL(s) built for framework .NETFramework,Version=v4.5 and platform X86. Following DLL(s) do not match framework/platform settings.
SPManagerTests.dll is built for Framework 4.5.2 and Platform AnyCPU.
但是我发现这些并不是那么重要
知道如何继续解决问题吗?
今天回过头来看问题,发现如下:
- VsTest.Console.exe 在我没有指定 .testsettings 文件时可以执行测试
- 当我尝试迁移到 .runsettings 时,我收到了一条类似的错误消息,我用谷歌搜索了一下:
Method not found: 'Void Microsoft.VisualStudio.TestTools.Common.TestRunConfiguration.AddTestSettingsProperties(System.Collections.Generic.Dictionary`2<System.String,System.Object>)'.
- 结果 there is an issue with the VS Remote Tools 2017 应该在三月份就修复了,但问题显然没有修复
如果您遇到同样的问题,那么只需卸载 Visual Studio 远程工具。 这两个问题都可以解决。在那之前我尝试用 MS 重新打开这个问题。
对于需要能够在目标机器上进行远程调试和 运行 测试的任何人,执行以下步骤将克服此错误:
从 KEY_LOCAL_MACHINE\SOFTWARE\Classes\Installer\Assemblies\Global
中删除 Microsoft.VisualStudio.TestTools.Common 的条目
运行 'gacutil /u Microsoft.VisualStudio.TestTools.Common'
需要第 1 步才能将其从 GAC 中删除。 VS Remote Tools 2017 的安装将有问题的 dll 添加到 GAC,该版本与 运行 测试所需的版本不同。