Modo de servidor

El modo de servidor MTP permite a un editor, IDE u otra herramienta de prueba iniciar una aplicación de prueba y impulsar la detección y ejecución mediante JSON-RPC. Use el modo de servidor al crear herramientas alrededor de MTP. En el caso de las ejecuciones normales de línea de comandos y CI, ejecute la aplicación de prueba directamente o use dotnet test.

Inicie el servidor JSON-RPC público con --server o --server jsonrpc.

Importante

El SDK de .NET utiliza un protocolo binario interno separado a través de --server dotnettestcli. No pases ese valor tú mismo. dotnet test configura los argumentos de transporte y protocolo.

Utiliza el cliente solo fuente.

MTP 2.4 proporciona un cliente JSON-RPC canónico. Agregue el paquete Microsoft.Testing.Platform.ServerMode.Client.Sources. El paquete inyecta código fuente de C# en su proyecto en lugar de añadir un ensamblado en tiempo de ejecución.

El diseño basado únicamente en el origen proporciona:

  • No hay ningún archivo DLL en tiempo de ejecución ni dependencia de implementación adicional.
  • Serialización nativa compatible con AOT y sin reflexión.
  • Tipos de protocolo y código de serialización del mismo repositorio que el servidor MTP.

Los tipos inyectados MtpServerClient, IMtpServerClient y de protocolo pueden inicializar una conexión, descubrir pruebas, ejecutar pruebas, solicitar el cierre del servidor e informar de actualizaciones de nodos de prueba. Todos los tipos inyectados siguen siendo internal para el ensamblado consumidor.

Cumplir los requisitos del cliente

Use C# 12 o una versión posterior. El paquete respeta la configuración de versión del idioma de tu proyecto. Si el marco de trabajo de destino tiene como valor predeterminado una versión anterior de C#, establezca LangVersion en 12.0 o una versión posterior. El paquete también proporciona tipos de compatibilidad internos para .NET Framework 4.6.2 y netstandard2.0.

Quite cualquier copia escrita a mano del cliente MTP antes de agregar el paquete para evitar tipos internos duplicados.

Elección de un modelo de inicio

Para iniciar la aplicación de prueba como un proceso externo, use MtpServerClient.LaunchAsync. El cliente es el propietario de ese proceso hijo y lo cierra durante la desactivación cuando es necesario.

Para un host embebido o un entorno con hilo de interfaz de usuario que no puede usar Process.Start, use MtpServerClient.LaunchInProcessAsync. El método ejecuta la aplicación de prueba a través de una devolución de llamada asincrónica en el proceso actual. No bloquee el hilo de inicio porque la función de devolución de llamada y el cliente comparten el proceso.

Ambos modelos de ejecución utilizan un transporte TCP de bucle cerrado. El navegador WebAssembly no puede crear el listener requerido, por lo que el inicio en el proceso genera PlatformNotSupportedException. La ejecución en proceso no ofrece un transporte alternativo de WebAssembly.

Apagar el cliente

Para desmontar el cliente y la aplicación iniciada sin bloquear el hilo de llamada, llame a IMtpServerClient.ShutdownAsync(). El método asíncrono evita problemas de capacidad de respuesta del hilo de la interfaz de usuario y de interbloqueo en hosts integrados.

En el caso de un host en proceso, MtpServerClientOptions.ServerShutdownTimeout controla cuánto tiempo espera la desmontaje después de que el cliente cierre el transporte. El valor predeterminado es 30 segundos. Lee ServerExitCode tras el apagado para obtener el código de salida de la llamada de retorno. El valor permanece null mientras la aplicación se ejecuta o cuando se produce un error en la aplicación en lugar de devolver un código de salida.

Declarar el estado del cliente

A partir de MTP 2.4.1, establezca la opción MtpServerClientOptions.IsStateful nullable para describir cómo el cliente consume actualizaciones de nodo de prueba:

Value Declaración
true El cliente retiene un conjunto direccionable de nodos de prueba para la sesión y conserva el último estado conocido de cada nodo hasta que otra actualización lo cambie, como podría hacer el explorador de pruebas de un IDE.
false El cliente consume actualizaciones sin conservar ese estado de nodo de prueba.
null (valor predeterminado) El cliente no declara la funcionalidad. El protocolo de enlace de inicialización omite el campo.

El cliente envía un valor booleano explícito a través de la capacidad del protocolo experimental capabilities.testing.isStateful. La persistencia de estado es independiente de la duración de la conexión y de la capacidad del servidor MultiRequestSupport. Un cliente no se vuelve con estado simplemente porque envía varias solicitudes a través de la misma conexión.

MTP 2.4.0 usa una opción booleana que no acepta valores NULL con un valor predeterminado de false. Para conservar una funcionalidad no declarada, use MTP 2.4.1 o posterior.

Dentro de un marco o extensión, use el servicio experimental IClientInfo para examinar la declaración. Lea clientInfo.Capabilities.IsStateful para obtener un resultado booleano conservador, que es false cuando la funcionalidad no está declarada. En MTP 2.4.1 o posterior, ClientCapabilitiesExtensions.GetIsStateful() conserva la distinción entre clientes no declarados, explícitamente sin estado y con estado.

Negociación de la compatibilidad del protocolo

A partir de MTP 2.4, la negociación del protocolo en modo servidor es independiente de la versión del paquete NuGet MTP. Un cliente declara las versiones de protocolo que admite y el servidor selecciona una versión común. Cuando no coincide ninguna versión compatible, la aplicación de prueba finaliza con el código de salida ProtocolError (12) en lugar de continuar con un contrato de comunicación incompatible.

Utilice el esquema JSON versionado de modo servidor 1.0 para validar los mensajes. Los serializadores System.Text.Json y Jsonite siguen el mismo esquema y la misma estructura de error.

Véase también