Windows 10 Home の WSL2 + Docker を検証するための環境を考えた時、Windows 10 Pro の Hyper-V にいれるのが手っ取り早いのですが、CPU仮想化支援の有効化コマンドレットに気づかず Windows Server 2019 上の Windows 10 Home じゃないとダメだっけと思ってさまよった時のメモ。
結果は VMのCPU仮想化支援を有効にすればどちらも変わらず動作する。
前の記事の前段となる個人的なメモです。ローカル環境が Windows 10 Home の人が環境を汚さずやるにはいいのでは。
従来の Docker Desktop for Windows では ホストマシンとコンテナのドライブ共有が必要だったが、これは不要になった模様。
実際、なにもしなくてもボリュームマウントされた。Firewall や アンチマルウェアとのバトルがなくなってめでたい。
Hyper-V 上の Windows 10 Home はだめなの?
問題なく動作する。
Windows 10 Pro 上の Hyper-V で Windows 10 Home をいれても wsl2 + Docker 動かすこともできるし、Azure 上のWindows Server 2019 上で Nested Hyper-V の上に Windows 10 Home をいれても wsl2 + Docker を動かすことができる。
もし CPU 側の 仮想化支援を有効にしていない場合、Windows 10 Home on Hyper-V on Windows Pro も Windows 10 Home on Nested Hyper-V on Windows Server 2019 (Azure) も動作しない。
問題を把握するためには、dotnet test の基本的な挙動を把握しておく必要があります。
ざっくり説明します。
ローカルで適当に xUnit のプロジェクトを作って、適当に失敗する Factを作りdotnet test で実行すると、テストの失敗個所が表示されます。
このテストの失敗個所が表示されるのは、verbosity レベルが minimal 以上の時で、dotnet test はデフォルトで minimal に設定されています。
$ dotnet test
Test run for C:\git\guitarrapc\dotnet-test-lab\tests\XUnitTestProject1\bin\Debug\netcoreapp3.1\XUnitTestProject1.dll(.NETCoreApp,Version=v3.1)
Microsoft (R) Test Execution Command Line Tool Version 16.3.0
Copyright (c) Microsoft Corporation. All rights reserved.
Starting test execution, please wait...
A total of 1 test files matched the specified pattern.
[xUnit.net 00:00:01.61] XUnitTestProject1.UnitTest1.BoolFailTest [FAIL]
X XUnitTestProject1.UnitTest1.BoolFailTest [7ms]
Error Message:
Assert.False() Failure
Expected: False
Actual: True
Stack Trace:
at XUnitTestProject1.UnitTest1.BoolFailTest() in C:\git\guitarrapc\dotnet-test-lab\tests\XUnitTestProject1\UnitTest1.cs:line 33
Test Run Failed.
Total tests: 4
Passed: 3
Failed: 1
Total time: 2.9317 Seconds
この結果の解像度をオーバーライドすることは、dotnet test 自体、あるいは Test Loggerごとに設定可能です。
dotnet test 自体のverbosity をオーバーライドするなら--verbosity 引数を使って dotnet test --verbosity [quiet|minimal|normal|detailed] を指定します
dotnet test の特定のテストロガーをオーバーライドするなら --logger:ロガー名;verbosity=[quiet|minimal|normal|detailed] を指定します
dotnet test 自体のverbosity を上げると、ビルドログなど見たくないログも増えてしまうのであまり好まれないと思います。
そのため通常は、Consoleロガーのverbosity だけ挙げて対処するでしょう。
たとえばConsoleLoggerのverbosity を normal にするならこのように指定します。
normal にしてお手元で実行すると、今まで dotnet test で出力されていなかった1つ一つのテストが成功、失敗にかかわらず出力されるはずです。
dotnet test "--logger:Console;verbosity=normal"
このことから、押さえておくべきは2つです。
dotnet test をverbosity 指定なしに実行したときは minimal を期待している
$ dotnet test -c Debug
Test run for /root/project/tests/XUnitTestProject1/bin/Debug/netcoreapp3.1/XUnitTestProject1.dll(.NETCoreApp,Version=v3.1)
VSTest: Starting vstest.console...
VSTest: Arguments: dotnet exec /usr/share/dotnet/sdk/3.1.100/vstest.console.dll --testAdapterPath:/root/.nuget/packages/coverlet.collector/1.2.0/build/netstandard1.0/ --framework:.NETCoreApp,Version=v3.1 --logger:Console;verbosity=minimal --Diag:/root/project/bin/default/log.txt /root/project/tests/XUnitTestProject1/bin/Debug/netcoreapp3.1/XUnitTestProject1.dll
Microsoft (R) Test Execution Command Line Tool Version 16.3.0
Copyright (c) Microsoft Corporation. All rights reserved.
Starting test execution, please wait...
A total of 1 test files matched the specified pattern.
[xUnit.net 00:00:00.49] XUnitTestProject1.UnitTest1.BoolFailTest [FAIL]
Test run in progress.VSTest: Exit code: 1
Exited with code exit status 1
#!/bin/bash -eo pipefail
dotnet test -c Debug "--logger:Console;verbosity=minimal"
Test run for /root/project/tests/XUnitTestProject1/bin/Debug/netcoreapp3.1/XUnitTestProject1.dll(.NETCoreApp,Version=v3.1)
VSTest: Starting vstest.console...
VSTest: Arguments: dotnet exec /usr/share/dotnet/sdk/3.1.100/vstest.console.dll --testAdapterPath:/root/.nuget/packages/coverlet.collector/1.2.0/build/netstandard1.0/ --framework:.NETCoreApp,Version=v3.1 --logger:Console;verbosity=minimal --Diag:/root/project/bin/default/log.txt /root/project/tests/XUnitTestProject1/bin/Debug/netcoreapp3.1/XUnitTestProject1.dll
Microsoft (R) Test Execution Command Line Tool Version 16.3.0
Copyright (c) Microsoft Corporation. All rights reserved.
Starting test execution, please wait...
A total of 1 test files matched the specified pattern.
[xUnit.net 00:00:00.49] XUnitTestProject1.UnitTest1.BoolFailTest [FAIL]
Test run in progress.VSTest: Exit code: 1
Exited with code exit status 1
これはもちろん、dotnet test -c Debug --verbosity=minimal でも変わらず quiet のままです。
var verbosityExists = parameters.TryGetValue(ConsoleLogger.VerbosityParam, out string verbosity);
if (verbosityExists && Enum.TryParse(verbosity, true, out Verbosity verbosityLevel))
{
this.verbosityLevel = verbosityLevel;
}