Modo servidor

O modo servidor MTP permite que um editor, IDE ou outra ferramenta de teste lance uma aplicação de teste e conduza a descoberta e execução através de JSON-RPC. Usa o modo servidor quando construíres ferramentas em torno do MTP. Para execuções normais de linha de comandos e CI, execute a aplicação de teste diretamente ou use dotnet test.

Inicie o servidor público de JSON-RPC com --server ou --server jsonrpc.

Importante

O SDK .NET utiliza um protocolo binário interno separado através de --server dotnettestcli. Não passes esse valor tu próprio. dotnet test configura os argumentos de transporte e protocolo.

Utilize apenas o cliente de origem

O MTP 2.4 fornece um cliente JSON-RPC canónico. Adicione o pacote Microsoft.Testing.Platform.ServerMode.Client.Sources. O pacote injeta código-fonte C# no seu projeto em vez de adicionar uma assemblagem em tempo de execução.

A conceção apenas de origem proporciona o seguinte:

  • Sem DLL em tempo de execução ou dependência adicional de implementação.
  • Serialização nativa compatível com AOT, sem reflexão.
  • Tipos de protocolo e código de serialização provenientes do mesmo repositório do servidor MTP.

Os tipos injetados MtpServerClient, IMtpServerClient e de protocolo podem inicializar uma conexão, descobrir testes, executar testes, solicitar o encerramento do servidor e comunicar atualizações do nó de teste. Todos os tipos injetados permanecem internal no conjunto consumidor.

Cumprir os requisitos do cliente

Usa C# 12 ou mais tarde. O pacote respeita a definição da versão da linguagem do seu projeto. Se o seu framework de destino estiver predefinido para uma versão anterior de C#, defina LangVersion para 12.0 ou posterior. O pacote também fornece tipos de compatibilidade interna para o .NET Framework 4.6.2 e netstandard2.0.

Remova qualquer cópia manuscrita do cliente MTP antes de adicionar o pacote para evitar tipos internos duplicados.

Escolha um modelo de lançamento

Para iniciar a aplicação de teste como um processo externo, use MtpServerClient.LaunchAsync. O cliente é responsável por esse processo subordinado e termina-o durante a fase de encerramento, quando necessário.

Para um ambiente de host embutido ou UI-thread que não pode usar Process.Start, use MtpServerClient.LaunchInProcessAsync. O método executa a aplicação de teste através de um callback assíncrono no processo atual. Não bloqueie o tópico de lançamento porque o callback e o cliente partilham o processo.

Ambos os modelos de lançamento utilizam um transporte TCP em loopback. Como o WebAssembly do navegador não consegue criar o listener necessário, o arranque no processo lança PlatformNotSupportedException. O lançamento em processo não oferece um transporte alternativo do WebAssembly.

Desliga o cliente

Para encerrar o cliente e a aplicação iniciada sem bloquear a thread de chamada, chame IMtpServerClient.ShutdownAsync(). O método assíncrono evita problemas de capacidade de resposta do thread da IU e de interbloqueio em hosts embebidos.

Para um host em processo, MtpServerClientOptions.ServerShutdownTimeout controla quanto tempo a desmontagem demora após o cliente fechar o transporte. O padrão é 30 segundos. Leia ServerExitCode após o desligamento para obter o código de saída do callback. O valor mantém-se null enquanto a aplicação está a correr ou quando a aplicação falha, em vez de devolver um código de saída.

Declarar persistência de estado do cliente

A partir do MTP 2.4.1, defina a opção nullable MtpServerClientOptions.IsStateful para descrever como o cliente consome atualizações de test-node:

Value Declaração
true O cliente mantém um conjunto endereçável de nós de teste para a sessão e mantém o último estado conhecido de cada nó até que outra atualização o altere, tal como um explorador de teste do IDE poderia fazer.
false O cliente consome atualizações sem manter esse estado de nó de teste.
null (predefinição) O cliente não declara essa capacidade. O handshake de inicialização omite o campo.

O cliente envia um valor Booleano explícito através da capacidade do protocolo experimental capabilities.testing.isStateful . A manutenção de estado é independente da duração da ligação e da capacidade do servidor MultiRequestSupport. Um cliente não se torna com estado apenas porque envia vários pedidos pela mesma ligação.

O MTP 2.4.0 usa uma opção booleana não anulável com um padrão de false. Para preservar uma capacidade não declarada, use MTP 2.4.1 ou posterior.

Dentro de um framework ou extensão, utilize o serviço experimentalIClientInfo para inspecionar a declaração. Leia clientInfo.Capabilities.IsStateful para um resultado booleano conservador, que é false quando a capacidade não é declarada. No MTP 2.4.1 ou posterior, ClientCapabilitiesExtensions.GetIsStateful() preserva a distinção entre clientes não declarados, explicitamente sem estado e com estado.

Negociar compatibilidade de protocolos

A partir do MTP 2.4, a negociação de protocolos em modo servidor é independente da versão do pacote NuGet do MTP. Um cliente declara as versões do protocolo que suporta, e o servidor seleciona uma versão comum. Quando nenhuma versão suportada coincide, a aplicação de teste termina com o código de saída ProtocolError (12) em vez de continuar com um contrato de comunicação incompatível.

Use o esquema JSON versionado em modo servidor 1.0 para validar as mensagens. Os serializadores System.Text.Json e Jsonite seguem o mesmo esquema e envelope de erro.

Ver também