Как отладить дотнет-тест в VS Code?
В этой статье описывается настройка параметров кода VS для указания цели отладки на выходные данные сборки проекта модульного тестирования. Поэтому я установил мой так:
{
"explorer.confirmDragAndDrop": false,
"git.allowForcePush": true,
"git.autofetch": true,
"window.zoomLevel": 0,
"csharp.unitTestDebuggingOptions": {
"sourceFileMap": {
"C:\\git\\MsTester\\bin\\Debug\\netcoreapp2.1": "C:\\git\\MsTester\\bin\\Debug\\netcoreapp2.1"
}
},
"files.autoSave": "afterDelay",
"files.exclude": {
"**/bin": true,
"**/node_modules": true,
"**/obj": true
},
"csharpfixformat.style.spaces.insideEmptyBraces": false,
"csharpfixformat.style.braces.allowInlines": false,
"csharpfixformat.style.spaces.beforeParenthesis": false,
"csharpfixformat.style.spaces.afterParenthesis": false,
"csharp.format.enable": false,
"extensions.ignoreRecommendations": true
}
Однако я не уверен, как настроить launch.json
сбросить dotnet test
так что он может прикрепить отладчик.
Это то, что я получил в настоящее время:
{
"version": "0.2.0",
"configurations": [
{
"name": "MsTester",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build",
"program": "${workspaceFolder}/MsTester/bin/Debug/netcoreapp2.1/MsTester.dll",
"windows": {
"args": [
"--filter",
"TestCategory=lbshell",
"--logger",
"trx",
"--results-directory",
".\\TestResults",
"--settings",
".\\Features\\runsettings.xml"
],
},
"cwd": "${workspaceFolder}/MsTester",
"console": "internalConsole",
"stopAtEntry": false,
"internalConsoleOptions": "openOnSessionStart"
},
]
}
Есть ли возможность сообщить VS Code, что его нужно выполнить? dotnet test
вместо dotnet run
?
Я надеялся, что эта страница покажет, как это сделать, но это не так.
3 ответа
Все заслуги принадлежат @Lance U. Matthews, поскольку он разместил это как комментарий к ответу на вопрос: как отлаживать MSTest в VSCode?. Я публикую это как правильный ответ, потому что он не делал этого уже год.
Следующий ответ был протестирован на VSCode v1.62.3 и инструментах dotnet v5.0.403.
Предположим, у вас есть решение .NET с такой структурой:
mysolution.sln
tests\
|---> tests.csproj
|---> UnitTest1.cs
.vscode\
|---> launch.json
|---> tasks.json
Скопируйте следующее в
tasks.json
файл:
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": ".NET Core Test with debugger",
"type": "process",
"isBackground": true,
"command": "dotnet",
"args": [ "test" ],
"options":
{
"cwd": "${workspaceFolder}/tests",
"env":
{
"VSTEST_HOST_DEBUG": "1"
},
},
"group": "test", "presentation":
{
"echo": true,
"reveal": "always",
"focus": false,
"panel": "shared"
},
"problemMatcher": []
},
]
}
И это в
launch.json
файл:
{
"version": "0.2.0",
"configurations": [
{
"name": ".NET Core Attach",
"type": "coreclr",
"request": "attach"
}
]
}
Теперь установите точку останова в любом месте вашего
UnitTest1.cs
файл и запустить
.NET Core Test with debugger
задача (Терминал->Выполнить задачу...). Должен запуститься инструмент командной строки для выполнения теста, а в нижней части терминала должно быть что-то вроде :
Process Id
конечно, будет другим, но это ожидаемое поведение.
Теперь вам нужно перейти на вкладку «Выполнить и отладить» (ctrl+shift+d) и выбрать «.NET Core Attach» (она должна быть в верхней левой части VSCode). Укажите идентификатор процесса, который ранее отображался в терминале: Теперь нажмите F5 один раз, и вы должны достичь одной из ваших точек останова.
Это может не решить вашу проблему полной передачи аргументов, но может решить проблему передачи параметров runsettings отлаживаемому коду. Используя этот метод, я смог передать содержимое runsettings моему коду при запуске отладчика (то есть когда я нажимаю "Debug Test" над методом):
В итоге я сделал следующее:
Сначала я написал небольшой код, который будет читать из файла настроек (через TestContext
) ИЛИ из пользовательской среды, если ключ не был доступен в файле настроек, то есть:
[ClassInitialize]
public static void TestClassInitialize(TestContext context)
{
v = Settings.GetSettingValueFromContextOrEnvironment("v", context);
}
Вот реализация GetSettingValueFromContextOrEnvironment
:
/// <summary>
/// Attempts to read a setting value from the context (populated through runsettings). If the
/// key is not present in the context, the value will be read from the user environment variable
/// instead.
///
/// This allows running the unit test code in VSCode debugger that currently doesn't seem to allow
/// passing runsettings file to the DLL.
/// </summary>
/// <param name="name"></param>
/// <param name="context"></param>
/// <returns></returns>
public static String GetSettingValueFromContextOrEnvironment(string name, TestContext context){
if (context.Properties.ContainsKey(name)){
return context.Properties[name].ToString();
} else {
String envVar = Environment.GetEnvironmentVariable(name, System.EnvironmentVariableTarget.User);
if (envVar == null){
throw new Exception(String.Format("Environment variable '{0}' was not available neither in the context file nor in the environment.", name));
} else {
return envVar;
}
}
}
Затем я написал Powershell, который прочитает мой файл настроек, чтобы проанализировать параметры и установить их как переменные пользовательской среды, например:
<# This script updates user environment variables with parameters stored in *.runsettings file that is provided to it as the only argument on the command line.
Example usage:
.\set_settings_env.ps1 local.runsettings
#>
param (
[Parameter(Mandatory=$true)][string]$settings_file
)
[xml]$xml = Get-Content $settings_file
foreach( $parameter in $xml.RunSettings.TestRunParameters.Parameter)
{
write-host("Setting environment variable: " + $parameter.name)
[Environment]::SetEnvironmentVariable($parameter.name, $parameter.value, "User")
}
Итак, теперь я могу запускать код из командной строки с определенным файлом runsettings и выполнять отладку, запустив сценарий для установки переменных среды.
Возможно, это то, что вы ищете: как отлаживать MSTest в VSCode?
(также проверьте комментарий). Таким образом, используя "VSTEST_HOST_DEBUG": "1", вы сможете подключить процесс отладки, аналогично тому, как это можно сделать в Java.