把 netstandard1.x 和 netcoreapp1.x 從 .NET 專案的 target frameworks 移除之後,接著開始把相依套件更新到最新版本,結果陸續碰到新版本所帶來的 breaking changes。先記錄其中一個比較微妙的狀況……
然而,當專案的相依套件大致更新完畢時,卻發現原本可以執行的測試專案突然不能執行了。具體的情形是,在 Visual Studio 2019 使用 Test Explorer 來執行測試時,顯示有一個測試專案裡面的測試案例全都沒有執行,同時在最底下的狀態列告知「發現非預期的錯誤,請查看測試輸出面板。」如下圖:
如上圖的測試輸出面板,可以看到實際的錯誤訊息是:
Visual Studio 的測試結果摘要只顯示有些測試沒有執行(藍色驚嘆號圖示),不夠醒目,可能會沒注意到。若使用
初次看到這個錯誤訊息,毫無頭緒,程式碼明明都通過編譯了,而且也沒有去更動測試程式碼。唯一有變動、而且比較可能有關係的,是更新了各專案的相依套件的版本。
🎯 Unable to find testhost.dll. Please publish your test project and retry
其中 Andreas 的回答正好解決了我的問題:把測試專案的 target framework 從 netcoreapp2.0 改為 netcoreapp2.1 就行了。
想必是我最近更新專案的相依套件時,一併把 Microsoft.NET.Test.SDK 從 v15.9更新至 v16.5.0 而導致測試失敗。我把測試專案的 target framework 來回改成 netcoreapp2.0 和 2.1,確認了 2.0 無法執行測試,2.1 則沒問題。
另一位 SteveHansen 的留言則是明確指出,當他把 Microsoft.NET.Test.SDK 從 v16.2 更新至 v16.4 之後,就會出現上述錯誤,而他的解決方法是把測試專案的 target framework 從 netcoreapp2.0 改為 netcoreapp3.0。
如果你也碰到同樣的狀況,用上述方法卻沒能解決,可以檢查一下你的測試專案是否有安裝 Microsoft.NET.Test.Sdk 套件以及必要的測試套件。以 xUnit 為例,你需要在測試專案裡面加入 "xunit" 和 "xunit.runner.visualstudio" 套件。
👉TLDR:Microsoft.NET.Test.SDK v16.4 以上的版本,搭配 .NET Core 2.1、2.2 或 3.x 來跑測試應該都沒問題(使用 xUnit),就是不能搭配 .NET Core 2.0(以及 .NET Standard 2.0)。
狀況描述
為了讓 .NET 專案的相依套件能夠跟上時代,我開始把一些 .NET 專案的 target frameworks 去掉 .NET Standard 1.x .NET Standard 1.x 和 .NET Core 1.x,而只保留 .NET Standard 2.0/2.1 和 .NET Core 2.x/3.x。當這個「汰舊」工作完成,我就接著「換新」,逐一把各專案的相依套件更新到最新或還算新的版本。然而,當專案的相依套件大致更新完畢時,卻發現原本可以執行的測試專案突然不能執行了。具體的情形是,在 Visual Studio 2019 使用 Test Explorer 來執行測試時,顯示有一個測試專案裡面的測試案例全都沒有執行,同時在最底下的狀態列告知「發現非預期的錯誤,請查看測試輸出面板。」如下圖:
如上圖的測試輸出面板,可以看到實際的錯誤訊息是:
找不到 ...\bin\Debug\netcoreapp2.0\testhost.dll。請發佈您的測試專案並重試。
Visual Studio 的測試結果摘要只顯示有些測試沒有執行(藍色驚嘆號圖示),不夠醒目,可能會沒注意到。若使用
dotnet test
命令來執行測試,就很容易發現這個錯誤,如下圖:初次看到這個錯誤訊息,毫無頭緒,程式碼明明都通過編譯了,而且也沒有去更動測試程式碼。唯一有變動、而且比較可能有關係的,是更新了各專案的相依套件的版本。
解決方法
用錯誤訊息去搜尋,可以找到許多討論串,而我是在底下這帖 stackoverflow 討論串找到解法:🎯 Unable to find testhost.dll. Please publish your test project and retry
其中 Andreas 的回答正好解決了我的問題:把測試專案的 target framework 從 netcoreapp2.0 改為 netcoreapp2.1 就行了。
想必是我最近更新專案的相依套件時,一併把 Microsoft.NET.Test.SDK 從 v15.9更新至 v16.5.0 而導致測試失敗。我把測試專案的 target framework 來回改成 netcoreapp2.0 和 2.1,確認了 2.0 無法執行測試,2.1 則沒問題。
另一位 SteveHansen 的留言則是明確指出,當他把 Microsoft.NET.Test.SDK 從 v16.2 更新至 v16.4 之後,就會出現上述錯誤,而他的解決方法是把測試專案的 target framework 從 netcoreapp2.0 改為 netcoreapp3.0。
💬 由此可見,Microsoft.NET.Test.SDK v16.x 搭配 .NET Core 2.1、2.2 或 3.x 應該都沒問題,就是不能搭配 .NET Core 2.0(以及 .NET Standard 2.0)。
如果你也碰到同樣的狀況,用上述方法卻沒能解決,可以檢查一下你的測試專案是否有安裝 Microsoft.NET.Test.Sdk 套件以及必要的測試套件。以 xUnit 為例,你需要在測試專案裡面加入 "xunit" 和 "xunit.runner.visualstudio" 套件。
相關討論串
- Unable to find testhost.dll. Please publish your test project and retry
- Updating Microsoft.NET.Test.Sdk, Microsoft.TestPlatform.TestHost from 16.2.0 causes netcoreapp2.0 tests to stop working
- XUnit extension library project causes issues during test discovery
沒有留言: