A partir de las versiones .NET 11 Preview 4 y Visual Studio 18.8, VSTest, la robusta plataforma que impulsa las operaciones de dotnet test y el Explorador de Pruebas, experimentará un cambio fundamental. Dejará de depender de la librería Newtonsoft.Json, una decisión estratégica que marca un hito importante en la evolución del ecosistema .NET. En su lugar, VSTest adoptará System.Text.Json para entornos .NET y JSONite para .NET Framework, alineándose con las directrices de seguridad y rendimiento actuales de Microsoft.
Este cambio es principalmente una medida de servicio y seguridad proactiva. La buena noticia es que la vasta mayoría de los proyectos de prueba no requerirán ninguna acción por parte del desarrollador. Sin embargo, un pequeño porcentaje de proyectos podría encontrar errores de compilación o ejecución de pruebas obvios. Para estos casos, la solución suele ser directa: una simple adición o modificación de una línea en la configuración de PackageReference.
¿Por qué este cambio es necesario?
Durante muchos años, Newtonsoft.Json ha sido un componente integral del SDK de .NET y Visual Studio, siendo un pilar para la serialización y deserialización de datos JSON. Sin embargo, con el tiempo, el panorama de seguridad ha evolucionado, y todas las versiones de Newtonsoft.Json anteriores a la 13.0.0 han sido marcadas como vulnerables en NuGet.org. Mantener una dependencia de una librería con vulnerabilidades conocidas expone la plataforma de pruebas a riesgos de seguridad y futuros avisos. Eliminar esta dependencia es parte de un esfuerzo más amplio y sistemático para erradicar Newtonsoft.Json del SDK de .NET, buscando mejorar la seguridad general, reducir la superficie de ataque y asegurar que los desarrolladores trabajen con componentes más modernos y mejor mantenidos.
Esta migración no solo aborda preocupaciones de seguridad inmediatas, sino que también prepara a VSTest para el futuro, garantizando su alineación con las tecnologías de serialización JSON más recientes y eficientes nativas de .NET. Al reducir la huella de dependencias externas, el equipo de VSTest puede ofrecer una plataforma más ligera, predecible y fácil de mantener.
Aspectos que NO cambian
Es fundamental entender que, a pesar de la eliminación de una dependencia clave, muchos aspectos cruciales de VSTest permanecerán inalterados, asegurando una transición fluida y la continuidad de las operaciones de prueba:
- Formato de comunicación (wire format): El formato de los mensajes de VSTest se mantiene idéntico. Esto significa que los datos se serializarán exactamente de la misma manera, independientemente de si se utiliza
Newtonsoft.Json,System.Text.JsonoJSONite. La interoperabilidad entre diferentes versiones y componentes de prueba está garantizada. - Compatibilidad de testhosts: Los testhosts más antiguos seguirán siendo completamente compatibles con la plataforma actualizada, y viceversa. Esta retrocompatibilidad es vital para permitir a los equipos actualizar la plataforma VSTest sin tener que refactorizar de inmediato todos sus proyectos o infraestructuras de prueba.
- Rendimiento de serialización: La eficiencia en la serialización de datos se mantendrá igual o, en algunos escenarios, incluso mejorará. La adopción de
System.Text.Json, en particular, es un paso hacia un rendimiento optimizado, ya que está diseñado para ser altamente eficiente y está profundamente integrado en el runtime de .NET.
Estos puntos de no cambio son cruciales, ya que minimizan el riesgo y el esfuerzo de migración para la mayoría de los usuarios, permitiéndoles beneficiarse de las mejoras de seguridad sin interrupciones operativas.
¿Quién NO se verá afectado?
La mayoría de los proyectos de prueba caen dentro de esta categoría y no deberían experimentar ningún problema. Esto incluye:
- Proyectos que no utilizan
Newtonsoft.Json: Si tu proyecto nunca ha tenido una dependencia directa o indirecta de esta librería para sus operaciones de prueba, este cambio no tendrá ningún impacto. - Proyectos que referencian
Newtonsoft.JsoncomoPackageReferencenormal: Los proyectos que ya incluyenNewtonsoft.Jsonde forma explícita mediante unPackageReferenceen su archivo.csprojseguirán funcionando como antes. Esto subraya la importancia de la declaración explícita de dependencias. - Proyectos xUnit y NUnit que se ejecutan en .NET o utilizan AppDomains: Estos tipos de proyectos ya requerían una referencia explícita a
Newtonsoft.Jsonsi lo usaban, por lo que su comportamiento no cambiará con la actualización.
Esta categorización demuestra que los proyectos que siguen las mejores prácticas de gestión de dependencias y no se apoyaban en dependencias transitorias ‘filtradas’ por VSTest serán los menos impactados.
¿Quién SÍ se verá afectado y cómo solucionarlo?
Para aquellos proyectos que sí se vean afectados, es importante destacar que los fallos no serán silenciosos. Cada error se reportará claramente en la ejecución de la prueba y se reflejará en los informes TRX, así como en las vistas de pruebas de Azure DevOps y GitHub, facilitando su identificación y resolución. A continuación, se detallan los escenarios comunes y sus soluciones:
Error de compilación: Referencia a Newtonsoft.Json faltante
Si un proyecto de prueba utilizaba tipos de Newtonsoft.Json (como JObject o JsonConvert) sin haber incluido explícitamente el paquete en su .csproj, anteriormente compilaba sin problemas. Esto ocurría porque Newtonsoft.Json «se filtraba» a través de la dependencia interna de VSTest. Con la eliminación de esta dependencia, el compilador ya no encontrará los tipos necesarios.
Solución: La corrección es sencilla. Simplemente añade el paquete Newtonsoft.Json como una PackageReference explícita a tu proyecto de prueba:
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
Es una buena práctica de desarrollo declarar explícitamente todas las dependencias directas que tu proyecto utiliza, lo que mejora la claridad y la reproducibilidad de tus builds.
Error en tiempo de ejecución: FileNotFoundException para Newtonsoft.Json
Algunos proyectos podrían haber referenciado Newtonsoft.Json, pero excluyendo los activos de tiempo de ejecución mediante la etiqueta <ExcludeAssets>runtime</ExcludeAssets>. Estos proyectos dependían de que la copia de Newtonsoft.Json de VSTest estuviera presente en tiempo de ejecución. Tras la actualización, si esta dependencia ya no está disponible globalmente, la ejecución de la prueba fallará con un error como:
System.IO.FileNotFoundException: No se pudo cargar el archivo o ensamblado 'Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed'.
Solución: Para resolver este problema, simplemente elimina la etiqueta <ExcludeAssets>runtime</ExcludeAssets> de tu PackageReference para Newtonsoft.Json, o asegúrate de instalar el paquete sin excluir los activos de tiempo de ejecución. Esto garantizará que la librería necesaria esté disponible cuando tu código lo requiera.
Error de carga de extensión en un adaptador de prueba o recolector de datos
Los adaptadores de prueba y los recolectores de datos personalizados que utilizaban Newtonsoft.Json sin declararlo explícitamente como una dependencia en su propio paquete verán fallos durante la carga. El mensaje de error típico será similar a:
El recolector de datos 'SampleDataCollector' lanzó una excepción durante la carga del tipo, la construcción o la inicialización: System.IO.FileNotFoundException: No se pudo cargar el archivo o ensamblado 'Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed'.
El mensaje identificará la extensión exacta que requiere una actualización. Aunque el equipo de VSTest no tiene constancia de ningún adaptador o recolector actualmente distribuido que se vea afectado por esto, es una consideración importante para los autores de extensiones.
Solución: Los autores de extensiones deben añadir Newtonsoft.Json a su propio paquete como una dependencia explícita (o migrar sus extensiones para usar System.Text.Json o JSONite). Para los consumidores de estas extensiones, una solución temporal podría ser añadir Newtonsoft.Json al proyecto de prueba o deshabilitar la extensión afectada hasta que se publique una versión actualizada.
Cambio en la API pública
VSTest expuso el tipo Newtonsoft.Json.Linq.JToken en un punto específico de su API de comunicación. Este tipo se está eliminando de la superficie pública. Su uso era principalmente relevante para el código que participaba directamente en el protocolo VSTest y es improbable que haya tenido consumidores en escenarios del mundo real. Sin embargo, los autores de extensiones que interactúan a un nivel muy bajo con la plataforma de pruebas deben estar al tanto de este cambio.
¿Cuándo se implementará este cambio?
Los desarrolladores pueden esperar ver la implementación de esta actualización en las siguientes versiones:
| Lanzamiento | Fecha |
|---|---|
| .NET 11 Preview 4 | 12 de mayo de 2026 |
| Visual Studio 18.8 Insiders 1 | 9 de junio de 2026 |
Estas fechas proporcionan un marco de tiempo claro para que los desarrolladores planifiquen y adapten sus proyectos si es necesario.
Pruebas anticipadas y soporte
Para aquellos que deseen probar estos cambios antes de su lanzamiento oficial, los paquetes de vista previa están disponibles en NuGet bajo la denominación Microsoft.TestPlatform.* en la versión 1.0.0-alpha-stj. Fomentamos activamente la participación de la comunidad en estas pruebas anticipadas para identificar y abordar cualquier problema potencial antes de la disponibilidad general.
Para más detalles y discusiones, se pueden consultar los siguientes recursos en GitHub:
- Detalles y discusión: microsoft/vstest#15677
- Pull Request de origen: microsoft/vstest#15540
- Seguimiento de cambios importantes del SDK: dotnet/docs#53174
Si tu proceso de compilación o ejecución de pruebas falla después de actualizar con un error que menciona Newtonsoft.Json, recuerda que la solución es casi siempre una simple PackageReference. Para cualquier situación no cubierta en este resumen, por favor, no dudes en abrir una incidencia en el repositorio de GitHub de VSTest: microsoft/vstest. La comunidad y el equipo de desarrollo están ahí para ayudar a asegurar una transición exitosa para todos.