web-dev-qa-db-ja.com

ユニットテストアダプタが例外をスローしました:要求されたタイプの1つ以上をロードできません

Visual Studio 2010コマンドプロンプトからSpecFlowテストを実行しようとしていますが、かなり鈍いエラーメッセージが表示されます。

ユニットテストアダプタが例外をスローしました:要求されたタイプの1つ以上をロードできません。詳細については、LoaderExceptionsプロパティを取得してください。

私のVS2010プロジェクトのセットアップに関するいくつかの情報:

  • Windows 7 Enterprise、64ビット(バージョン6.1.7601 Service Pack 1ビルド7601)
  • Visual Studio 2010 Premium(v10.0.40219.1 SP1Rel)
  • コード化されたUIテストの使用
  • CodedUIテストAPIに委任するSpecFlow1.9.0を使用する
  • MSTest
  • .NET v4.0.30319
  • 全体のソリューションは32ビットコードにコンパイルされています(私にはXPまだ)を使用している同僚がいます)

いくつかのDLLファイルをNuGetパッケージディレクトリからターゲットディレクトリにコピーするビルド後のイベントがあります。

copy $(SolutionDir)packages\SpecBind.1.2.1.71\lib\net45\SpecBind.dll $(TargetDir)
copy $(SolutionDir)packages\SpecBind.CodedUI.1.2.1.71\lib\net45\SpecBind.CodedUI.dll $(TargetDir)

これがないと、mstestはどういうわけか多くのSpecFlowアセンブリをロードできませんでした。

テストプロジェクトのApp.configの関連部分

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="specFlow" type="TechTalk.SpecFlow.Configuration.ConfigurationSectionHandler, TechTalk.SpecFlow" />
    <section name="specBind" type="SpecBind.Configuration.ConfigurationSectionHandler, SpecBind" />
  </configSections>

  <connectionStrings>
    ...
  </connectionStrings>

  <specFlow>
    <!-- For additional details on SpecFlow configuration options see http://go.specflow.org/doc-config -->
    <unitTestProvider name="MsTest" generatorProvider="Specflow.CodedUI.MsTestCodedUiGeneratorProvider, Specflow.CodedUI" runtimeProvider="TechTalk.SpecFlow.UnitTestProvider.MsTest2010RuntimeProvider, TechTalk.SpecFlow" />
    <stepAssemblies>
      <!-- This attribute is required in order to use StepArgument Transformation as described here; 
           https://github.com/marcusoftnet/SpecFlow.Assist.Dynamic/wiki/Step-argument-transformations  -->
      <stepAssembly Assembly="SpecFlow.Assist.Dynamic" />
      <stepAssembly Assembly="SpecBind" />
    </stepAssemblies>
  </specFlow>
  <specBind>
    <browserFactory provider="SpecBind.CodedUI.CodedUIBrowserFactory, SpecBind.CodedUI" browserType="IE" />
    <!-- For additional details on SpecBind configuration options see the project site. -->
  </specBind>
</configuration>

テストを開始するために使用していたコマンド:

C:\path\to\bin\Debug> mstest /testcontainer:MyTests.dll /test:SpecFlowFeatureName

Loading MyTests.dll
Starting Execution...

Results         Top Level Tests
--------        ------------------
Failed          ...
Failed          ...
Failed          ...

...

私は解決策を探し求めてきましたが、見つけ続けるのはVS2008への参照とコードカバレッジの無効化だけです。 VS2010を使用していますが、ローカルテスト設定でコードカバレッジが有効になっていません。

Windowsイベントログビューア

私のWindowsイベントログビューアを探し回った後、私はついにもっと多くの情報に出くわしました(人々がこのエラーでスタックトレースを見つけることができないと不平を言うのを聞いた-あなたのイベントビューアを見てください)

The description for Event ID 0 from source VSTTExecution cannot be found. Either the component that raises this event is not installed on your local computer or the installation is corrupted. You can install or repair the component on the local computer.

If the event originated on another computer, the display information had to be saved with the event.

The following information was included with the event: 

(QTAgent32.exe, PID 6920, Thread 213) Unit Test Adapter threw exception: System.Reflection.ReflectionTypeLoadException: Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.
   at System.Reflection.RuntimeModule.GetTypes(RuntimeModule module)
   at System.Reflection.RuntimeModule.GetTypes()
   at System.Reflection.Assembly.GetTypes()
   at Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestExecuter.GetAssemblyInfo(Assembly assembly)
   at Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestExecuter.GetTypeInfo(Type type, Boolean checkAlreadyExaminedType)
   at Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestExecuter.ResolveMethods()
   at Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestExecuter.Initialize(UnitTestResult result, UnitTestRunner runner, ConsoleOutputRedirector redirector)
   at Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestRunner.Run(UnitTestElement test, ITestContext testContext, Boolean isLoadTest, Boolean useMultipleCpus)

the message resource is present but the message is not found in the string/message table

このエラーを解決する方法がわかりません。エディターにロードされた.featureファイルを右クリックして[SpecFlowシナリオの実行...]を選択すると、Visual Studio内からSpecFlowテストが正常に実行されますが、コマンドラインから実行できません。

投稿できるアイデアや追加情報はありますか?

ちなみに、これは私の以前の質問から生じました: MSTestを使用してコマンドラインからSpecFlowシナリオをどのように実行しますか?

アップデート#1

もう少し調べてみると、次のブログ投稿が見つかりました: MSTestおよび64ビット 。ローカルのテスト設定を確認しましたが、32ビットでテストを実行する必要があります。

現在、このコマンドを使用しています。

mstest /testcontainer:MyTests.dll /testsettings:"..\..\..\Local.testsettings"

エラーメッセージ:

Test method Blah.Dee.Blah threw exception: 
System.IO.FileNotFoundException: Could not load file or Assembly 'Microsoft.VisualStudio.TestTools.UITest.Extension, Version=11.0.0.0, Culture=neutral, PublicKeyToken=...' or one of its dependencies. The system cannot find the file specified.WRN: Assembly binding logging is turned OFF.
To enable Assembly bind failure logging, set the registry value [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) to 1.
Note: There is some performance penalty associated with Assembly bind failure logging.
To turn this feature off, remove the registry value [HKLM\Software\Microsoft\Fusion!EnableLog].

TestCleanup method Blah.Dee.Blah.ScenarioTearDown threw exception. BoDi.ObjectContainerException: BoDi.ObjectContainerException: Interface cannot be resolved: SpecBind.BrowserSupport.IBrowser.

アップデート#2

Microsoft.VisualStudio.TestTools.UITest.Extensionへの参照を削除し、再度追加しました。掃除した。再構築されました。同じコマンドを再度実行しました。それでも同じエラーが発生します。

何らかの理由で、Microsoft.VisualStudio.TestTools.UITest.Extensionアセンブリをバージョン11として読み込もうとしていますが、マシンにバージョン10がインストールされています。このバージョンが指定されている場所を追跡して、変更できるようにしようとしています。

12
Greg Burghardt

上記の@jessehouwingのコメントの助けを借りて、私はこれを修正しました。私は2つの問題にぶつかっていました。

私が最初に参照したエラーは、実際にはmstestが64ビットプロセス(QTAgent.exe)でテストを実行しようとしたことが原因でした。プロジェクトは64ビットのWindows7マシンで32ビットコードとしてコンパイルされたため、32ビットプロセスとして実行する必要がありました。

Visual Studio 2010の場合:

  1. [テスト]メニュー-> [テスト設定の編集]-> [ローカル(local.testsettings)]をクリックします
  2. 左側のパネルで[ホスト]をクリックします
  3. [32ビットまたは64ビットプロセスでテストを実行する]ドロップダウンで[テストを32ビットプロセスで強制的に実行する]が選択されていることを確認します。私にとってこれはデフォルトでした
  4. Visual Studioコマンドプロンプトで、VisualStudioによって生成されたlocal.testsettingsファイルを参照してテストを実行します。

    mstest /testcontainer:foo.dll /testsettings:"path/to/solution/local.testsettings" /test:SpecFlowFeatureName
    

私が抱えていた2番目の問題は私自身のせいでした。以前、コード化されたUIテストとSpecFlowで遊んでいて、 SpecBind をインストールしました。これにより、テストプロジェクトのApp.configに多数の設定がスローされました。このNuGetパッケージは.NET4.5専用であり、.NET4.0を使用しています。そのNuGetパッケージと設定をApp.configから削除し、クリーンアップして再構築しました。これにより、この問題は完全に修正されました。

要するに、私は:

  • Mstestを32ビットプロセスで強制的に実行し、コマンドラインからこのlocal.testsettingsファイルを参照しました
  • 以前に少しNuGetに満足し、.NETランタイムと互換性のないパッケージをインストールしたため、SpecBindへのすべての参照を削除しました。
4
Greg Burghardt

他の誰かがこれに遭遇した場合に備えて、私にとっては、コードカバレッジが有効になっているためです。無効にすると問題が解決しました。

http://blogs.msdn.com/b/danielvl/archive/2010/02/16/enable-code-coverage-in-visual-studio.aspx

  • .testsettingsファイルを開きます
  • [テスト設定]で、[データと診断]をクリックします
  • 「コードカバレッジ」のチェックを外します
  • 「適用」をクリックします
8
Chris

これらのパッケージに必要なアセンブリ参照を見るとわかるように(これにはReflectorを使用しますが、IlSpyまたはJetBrainsのDotPeekも機能します)、v11バージョンに依存していることがわかります。 Visual Studio2012に同梱されています。これらはVisualStudio2010では使用できません。

Specbind References

SpecBindを削除すると、おそらく役立つか、CodedUIの古いバージョンに依存するバージョンを見つけることができます(この場合、SpecBindのはるかに古いバージョンを探している可能性があります)。

32ビットの問題については、プロジェクトのCPU構成をAnyCPUに設定する必要があります。ネイティブメソッドに依存している場合、または他のメソッドを参照している場合を除き、通常はx86に修正する必要はありません。ターゲットアーキテクチャとしてx86を使用するように特別に設定されたアセンブリ。

3
jessehouwing

これはとても厄介です.....

Visual Studio 2015のテストエージェントを使用する予定だったので、テストマシンにインストールしました。ローカルマシンでは2013年でした。テストは、ローカルのMsBuildで完全に実行されたため、何ができるのか理解できませんでした。 Microsoftが常に下位互換性を維持していると私が常に思っていたので、これが起こりました。

テストサーバー上のMsBuildは、欠落しているアセンブリに関する情報を提供できませんでした(最初に文句を言ったという理由だけで、Newtonsoft.Jsonを追加しましたが、その後、欠落している他の名前は表示されませんでした)。エラーメッセージが切り捨てられ、stacktraceおよびdebugtraceオプションが機能しませんでした...

Test Agent for Visual Studio 2013をテストマシンにインストールすると、それは魅力のように動作しました。

0
Nabil Shaik