Nota
O acceso a esta páxina require autorización. Pode tentar iniciar sesión ou modificar os directorios.
O acceso a esta páxina require autorización. Pode tentar modificar os directorios.
La versión estable MSTest v4 ya está disponible. En esta guía de migración se explora lo que ha cambiado en MSTest v4 y cómo puede migrar a esta versión.
Note
Por lo general, MSTest v4 no es compatible binariamente con MSTest v3. Cualquier biblioteca compilada en v3 debe volver a compilarse en v4.
Cambios importantes en el código fuente
Estos son cambios importantes que podrían provocar que los proyectos de prueba no se compilen.
Cambios importantes en TestMethodAttribute
Cambie TestMethodAttribute.Execute por TestMethodAttribute.ExecuteAsync
Si implementa su propio TestMethodAttribute, debe cambiar la sustitución Execute por ExecuteAsync.
Este cambio se realizó para corregir errores de interbloqueo de larga duración causados por la naturaleza de bloqueo sincrónica de la API.
Por ejemplo, si anteriormente tenía lo siguiente:
public sealed class MyTestMethodAttribute : TestMethodAttribute
{
public override TestResult[] Execute(ITestMethod testMethod)
{
// ...
return result;
}
}
Tendrá que cambiarlo a lo siguiente:
public sealed class MyTestMethodAttribute : TestMethodAttribute
{
public override Task<TestResult[]> ExecuteAsync(ITestMethod testMethod)
{
// ...
return Task.FromResult(result);
}
}
TestMethodAttribute ahora usa atributos de información del autor de la llamada
El TestMethodAttribute constructor ha cambiado para tener parámetros que proporcionen atributos de información del autor de la llamada.
Si hereda de
TestMethodAttribute, también debe proporcionar un compilador que propague la información a la clase base.public class MyTestMethodAttribute : TestMethodAttribute { public MyTestMethodAttribute([CallerFilePath] string callerFilePath = "", [CallerLineNumber] int callerLineNumber = -1) : base(callerFilePath, callerLineNumber) { } }Si tiene aplicaciones de atributo como
[TestMethodAttribute("Custom display name")], cambie a[TestMethodAttribute(DisplayName = "Custom display name")].
Tip
Un analizador con una corrección de código estará disponible próximamente para ayudarle con esta migración. Un solo clic en el IDE corregirá todas las instancias de la solución.
"Se elimina el enum ClassCleanupBehavior"
Ahora, los métodos ClassCleanup solo se ejecutan al final de la clase de prueba. Se ha eliminado la compatibilidad con la limpieza de clases al final del ensamblado.
Si debe ejecutar la lógica de limpieza al final del ensamblado, hazlo en AssemblyCleanup en lugar de ClassCleanup.
El comportamiento predeterminado de la limpieza de clases era anteriormente "EndOfAssembly", que los usuarios consideraban un error.
Si anteriormente tenía el código siguiente:
[ClassCleanup(ClassCleanupBehavior.EndOfClass)]
public static void ClassCleanup(TestContext testContext)
{
}
Tendrá que cambiarlo a lo siguiente:
[ClassCleanup]
public static void ClassCleanup(TestContext testContext)
{
}
TestContext.Properties ahora es IDictionary<string, object>
Anteriormente, TestContext.Properties era un IDictionary. Para mejorar la tipificación, ahora es IDictionary<string, object>.
Si tiene llamadas a TestContext.Properties.Contains, actualícelas a TestContext.Properties.ContainsKey.
Se ha eliminado la enumeración TestTimeout
Esta enumeración solo tenía un único miembro, , Infinitecuyo valor era int.MaxValue.
Si tenía usos de [Timeout(TestTimeout.Infinite)], actualícelos a [Timeout(int.MaxValue)].
TestContext.ManagedType ahora se ha eliminado
Se quita la propiedad TestContext.ManagedType . En su lugar, use TestContext.FullyQualifiedTestClassName.
Los tipos no diseñados para el consumo público se hacen internos o se eliminan
-
Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface.ObjectModel.ITestMethodse convierte en interno.- Tenga en cuenta que esta interfaz es diferente de ITestMethod en el ensamblado TestFramework, que no cambió.
-
Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface.ObjectModel.ITestMethodno tiene ningún uso válido para los usuarios, por lo que se hizo interno.
- Algunos de los tipos ya obsoletos se convierten en internos. Esto incluye:
- MSTestDiscoverer
- MSTestExecutor
- AssemblyResolver
- LogMessageListener
- Gestor de Ejecución de Pruebas
- TestMethodInfo
- TestResultExtensions
- UnitTestOutcomeExtensions
- GenericParameterHelper
- Tipos en el ensamblado de servicios de plataforma
Cambio en la firma de las API de Assert
- Los APIs de aserción que aceptan parámetros
messageyobject[]ahora solo aceptanmessage. Use la interpolación de cadenas en su lugar. Se ha realizado un cambio necesario para admitir la expresión de argumentos del llamador para las API de aserción. -
Assert.AreEqualSe quitan las API deIEquatable<T>. Hay muy pocos usuarios de esta API y la API es engañosa. La mayoría de los usuarios no se ven afectados por esta eliminación, ya que la API no existía inicialmente en MSTest v3 y se introdujo en la versión 3.2.2.- Esta API también provoca problemas para los usuarios de F#. Por ejemplo, consulte fsharp/fslang-suggestions/issues/905.
- Si estás afectado, obtendrás un error de compilación relacionado con la inferencia de tipos genéricos. Todo lo que debe hacer es especificar explícitamente el argumento de tipo como
object.
- Las API en desuso
Assert.ThrowsExceptionhan sido eliminadas. Un analizador y un códigofijo en MSTest 3.10 le ayudan a migrar a las API más recientes. - Los usos de
Assert.IsInstanceOfType<T>(x, out var t)ahora deben cambiar avar t = Assert.IsInstanceOfType<T>(x).- Las sobrecargas existentes que no tenían el parámetro
outse han cambiado para devolver la instancia de tipoTen lugar de void. Esto solo supone un cambio importante para F#.
- Las sobrecargas existentes que no tenían el parámetro
Se ha quitado la API ExpectedExceptionAttribute
Se quita la API en desuso ExpectedExceptionAttribute . Un analizador (MSTEST0006) y un codefijo en MSTest 3.2 le ayudarán a migrar a Assert.Throws.
Por ejemplo, si tenía el código siguiente:
[ExpectedException(typeof(SomeExceptionType))]
[TestMethod]
public void TestMethod()
{
MyCall();
}
Usted (o el analizador y la corrección de código) debe cambiarlo por lo siguiente:
[TestMethod]
public void TestMethod()
{
Assert.ThrowsExactly<SomeExceptionType>(() => MyCall());
}
Se han eliminado los marcos de destino no compatibles
Se ha eliminado la compatibilidad con los marcos de destino .NET Core 3.1 a .NET 7. La versión mínima admitida de .NET es .NET 8. Este cambio no afecta a .NET Framework. .NET Framework 4.6.2 sigue siendo el objetivo mínimo compatible de .NET Framework.
La estrategia de despliegue se ha trasladado de fuentes de datos individuales a TestMethodAttribute
La estrategia de implementación es una característica reciente introducida en MSTest 3.7 para solucionar las limitaciones conocidas.
La propiedad se agregó en orígenes de datos individuales como DataRowAttribute y DynamicDataAttribute. Esta propiedad se ha trasladado a TestMethodAttribute.
ConditionBaseAttribute.ShouldRun Cambio de API
Se ha cambiado el nombre de la ConditionBaseAttribute.ShouldRun propiedad a IsConditionMet. Esto hace que sea más claro que ConditionMode no se debe usar en la implementación.
Se actualizan varios analizadores para que emitan advertencias por defecto.
La gravedad predeterminada de los analizadores siguientes cambió de Información a Advertencia:
- MSTEST0001
- MSTEST0007
- MSTEST0017
- MSTEST0023
- MSTEST0024
- MSTEST0025
- MSTEST0030
- MSTEST0031
- MSTEST0032
- MSTEST0035
- MSTEST0037
- MSTEST0045
Cambios disruptivos en el comportamiento
Estos son cambios importantes que podrían afectar al comportamiento en tiempo de ejecución.
DisableAppDomain ahora tiene como valor predeterminado true cuando se ejecuta en Microsoft.Testing.Platform
En la versión 4, y cuando se ejecuta con Microsoft.Testing.Platform, AppDomains se deshabilita de forma predeterminada (cuando no se especifica) ya que el aislamiento personalizado proporcionado es inútil en la mayoría de los casos y tiene un impacto importante en los rendimientos (hasta 30% más lento cuando se ejecuta bajo aislamiento).
Sin embargo, la característica sigue estando disponible. Si tiene escenarios que lo requieren, agregue la DisableAppDomain configuración en runsettings.
TestContext lanza una excepción cuando se utiliza incorrectamente
El TestContext tipo se pasa a AssemblyInitialize, ClassInitialize y a las pruebas, pero la información disponible en cada fase es diferente. Ahora, se produce una excepción al acceder a una propiedad relacionada con una información de ejecución de prueba como parte de AssemblyInitialize o ClassInitialize.
-
TestContext.FullyQualifiedTestClassNameno se puede tener acceso a él en la inicialización del ensamblado. -
TestContext.TestNameno se puede tener acceso a él en la inicialización del ensamblado ni en la inicialización de clase.
El estado de TestCase.Id está cambiando
Para solucionar errores pendientes prolongados que muchos usuarios presentaron, la generación de TestCase.Id ha cambiado. Esto afecta a las características de Azure DevOps, por ejemplo, el seguimiento de errores de prueba a lo largo del tiempo.
TreatDiscoveryWarningsAsErrors ahora tiene como valor predeterminado true
v4 usa valores predeterminados más estrictos. Por lo tanto, el valor predeterminado de TreatDiscoveryWarningsAsErrors es ahora true. Debe ser un cambio transparente para la mayoría de los usuarios y ayudar a otros usuarios a descubrir errores ocultos.
MSTest.Sdk ya no agrega Microsoft.NET.Test.Sdk referencia al usar Microsoft.Testing.Platform
De forma predeterminada, MSTest.Sdk usa Microsoft.Testing.Platform. Si la UseVSTest propiedad MSBuild se establece en true, usará VSTest en su lugar. En MSTest 3.x, el SDK agregó una referencia a Microsoft.NET.Test.Sdk (que aporta compatibilidad con VSTest) incluso cuando se usa Microsoft.Testing.Platform. Esta referencia de paquete no es necesaria cuando se ejecuta con Microsoft.Testing.Platform y se ha quitado en MSTest v4.
Si desea tener compatibilidad con VSTest (por ejemplo, si quiere ejecutar con vstest.console), debe agregar manualmente una referencia de paquete del paquete NuGet a su Microsoft.NET.Test.Sdk proyecto.