2018年4月26日 星期四

SpecRun.Specflow 2-3-0 錯誤 Unable to find plugin in the plugin search path: SpecRun. Please check


SpecRun.Specflow 2-3-0 錯誤 Unable to find plugin in the plugin search path: SpecRun. Please check


今天幫新公司在專案上新增Specflow SpecRun 結果就....... 爆炸了,就在要被醫師宣告不治的時候,我嘗試了八百種方法,在我努力的從中午12點嘗試到凌晨12點,終於後終於搶救成功了QQ,我是土法煉鋼法我去另開一個SpecRun.Specflow 2-3-0 Sample專案,然後他居然可以執行~我就把兩個專案拿來比較,結果以我驚人的人品給我挖通的這條康莊大道。

更新2018-05-03

前兩天開啟專案又炸掉了,後來發現我的奇怪作法還是不能解決問題,所以有更新了作法,新的做法到現在為止他都很正經的運作著。





錯誤訊息


#error Unable to find plugin in the plugin search path: SpecRun. Please check http://go.specflow.org/doc-plugins for details.
#error TechTalk.SpecFlow.Generator
#error Server stack trace:
#error    於 TechTalk.SpecFlow.Generator.Plugins.GeneratorPluginLoader.LoadPlugin(PluginDescriptor pluginDescriptor)
#error    於 TechTalk.SpecFlow.Generator.GeneratorContainerBuilder.LoadPlugin(PluginDescriptor pluginDescriptor, IGeneratorPluginLoader pluginLoader, GeneratorPluginEvents generatorPluginEvents)
#error    於 TechTalk.SpecFlow.Generator.GeneratorContainerBuilder.LoadPlugins(ObjectContainer container, IGeneratorConfigurationProvider configurationProvider, SpecFlowConfigurationHolder configurationHolder, GeneratorPluginEvents generatorPluginEvents, SpecFlowProjectConfiguration specFlowConfiguration)
#error    於 TechTalk.SpecFlow.Generator.GeneratorContainerBuilder.CreateContainer(SpecFlowConfigurationHolder configurationHolder, ProjectSettings projectSettings)
#error    於 TechTalk.SpecFlow.Generator.TestGeneratorFactory.CreateGenerator(ProjectSettings projectSettings)
#error    於 System.Runtime.Remoting.Messaging.StackBuilderSink._PrivateProcessMessage(IntPtr md, Object[] args, Object server, Object[]& outArgs)
#error    於 System.Runtime.Remoting.Messaging.StackBuilderSink.SyncProcessMessage(IMessage msg)
#error Exception rethrown at [0]:
#error    於 System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
#error    於 System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
#error    於 TechTalk.SpecFlow.Generator.Interfaces.ITestGeneratorFactory.CreateGenerator(ProjectSettings projectSettings)
#error    於 TechTalk.SpecFlow.IdeIntegration.Generator.AppDomain.RemoteAppDomainTestGeneratorFactory.CreateGenerator(ProjectSettings projectSettings)
#error    於 TechTalk.SpecFlow.IdeIntegration.Generator.GeneratorServices.CreateTestGenerator()
#error    於 TechTalk.SpecFlow.IdeIntegration.Generator.IdeSingleFileGenerator.GenerateCode(String inputFilePath, String inputFileContent, GeneratorServices generatorServices, ProjectSettings projectSettings)
#error    於 TechTalk.SpecFlow.IdeIntegration.Generator.IdeSingleFileGenerator.Generate(String inputFilePath, String inputFileContent, GeneratorServices generatorServices, CodeDomHelper codeDomHelper, ProjectSettings projectSettings)
[Specflow].feature.cs




System.IO.FileNotFoundException: 無法載入檔案或組件 'Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' 或其相依性的其中之一。 系統找不到指定的檔案。
檔案名稱: 'Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed'
   於 TechTalk.SpecFlow.VisualStudio.CodeBehindGenerator.Actions.GenerateTestFileAction.DeserializeFeatureFileInput(GenerateTestFileParameters opts)
   於 TechTalk.SpecFlow.VisualStudio.CodeBehindGenerator.Actions.GenerateTestFileAction.GenerateTestFile(GenerateTestFileParameters opts)
警告: 組件繫結記錄切換為 OFF。
若要記錄組件繫結失敗,請將登錄值 [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) 設為 1。
注意: 與組件繫結失敗記錄相關的效能會有部分負面影響。
若要關閉此功能,請移除登錄值 [HKLM\Software\Microsoft\Fusion!EnableLog]。
測試八百種可能出現的錯誤



如果你也是要使用SpecRun我建議讓他乾淨些直接安裝NuGet SpecRun.Specflow 2-3-0 剩下相關的會一起幫您安裝好,如果有安裝相關也建議先移除。





確認擴充套件版本為[2017.1.14]



如果未來有更新的話,可以到https://github.com/techtalk/SpecFlow.VisualStudio/releases/tag/v2017.1.13下載的版本





確認完版號後,確認一下擴充套件設定




<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="specFlow" type="TechTalk.SpecFlow.Configuration.ConfigurationSectionHandler, TechTalk.SpecFlow" />
  </configSections>
  <specFlow>
    <!-- For additional details on SpecFlow configuration options see http://go.specflow.org/doc-config-->
  <!-- For additional details on SpecFlow configuration options see http://go.specflow.org/doc-config--><!-- use unit test provider SpecRun+NUnit or SpecRun+MsTest for being able to execute the tests with SpecRun and another provider --><unitTestProvider name="SpecRun" /><plugins>
      <add name="SpecRun" />
    </plugins></specFlow>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-1.5.2.14234" newVersion="1.5.2.14234" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-9.0.0.0" newVersion="9.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>
我的App.config資訊




<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="MSTest.TestAdapter" version="1.2.0" targetFramework="net461" />
  <package id="MSTest.TestFramework" version="1.2.0" targetFramework="net461" />
  <package id="Newtonsoft.Json" version="9.0.1" targetFramework="net461" />
  <package id="SpecFlow" version="2.3.0" targetFramework="net461" />
  <package id="SpecRun.Runner" version="1.7.1" targetFramework="net461" />
  <package id="SpecRun.SpecFlow.2-3-0" version="1.7.1" targetFramework="net461" />
  <package id="System.ValueTuple" version="4.3.0" targetFramework="net461" />
</packages>
我的packages.config資訊



2018-05-03 更新正確做法


<specFlow>
    <!--<unitTestProvider name="MsTest" />-->
    <unitTestProvider name="SpecRun" />
    <plugins>
      <add name="SpecRun" path="../packages/SpecRun.SpecFlow.2-3-0.1.7.1/lib/net45"/>
    </plugins>
  </specFlow>

在Config 中 specFlow 裡面的plugins 加上 path="../packages/SpecRun.SpecFlow.2-3-0.1.7.1/lib/net45"/
準確的是說去強制指定到packages 裡面的這個包和SpecRun.SpecFlowPlugin.dll檔案的資料夾





下面是我自己亂試有跑起來過的做法不推薦使用,不過一開始在測試時是會過得,後來又壞掉了,所以還是使用上面的做法必較好。




PS.[Specflow].feature.cs 這時候還是錯誤的先不需要理會



這時候我拿另外一個測試編譯成功的專案把SpecRun.SpecFlowPlugin.dll檔案複製




附上測試成功的檔案



然後把Specflow錯誤的專案Debug資料夾清空,貼上SpecRun.SpecFlowPlugin.dll檔案



接下來就直接跑測試,我是直接按左上角的全部測試。



菸 菸 菸 菸 菸

然後就各位客官!!!五支菸~~~~~~




然後這個討人厭的自動產生檔案就會出現了,打完收工睡覺去。



結論:
Specflow 雖然算是使用.NET技術中BDD(驅動測試開發)應該算是偏主流的一個好用的東西,不過實在是很容易炸掉,之前在2015轉2017也有炸掉過,所以我雖然有成功排除問題,可是明天、後天、大後天?讓人害怕環境改變下是否又會不穩定,我這次事件中也在爬文中發現很多人也是有這樣的問題,東西總是有好有壞,雖然容易炸掉不過相對於他對我帶來的便利性,我還是會繼續選擇使用他。

PS.最後放送我拿來比對一開始就可以執行的Sample GitHub https://github.com/ZeroTiem/SpecFlowRunExercise



參考資訊



沒有留言:

張貼留言

解決'Microsoft.ACE.OLEDB.12.0' 提供者並未登錄於本機電腦上的問題

  解決'Microsoft.ACE.OLEDB.12.0' 提供者並未登錄於本機電腦上的問題 環境 Server:Windows Server 2012 R2 Debug IDE: VS2019 Step1 確認是否有安裝Microsoft Access Dat...