DependsOnAttribute Clase
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
Declara que una prueba (o cada prueba de una clase de prueba) no debe iniciarse hasta que una o varias pruebas hayan finalizado, formando un gráfico de dependencias que el programador en ensamblado se ejecuta en orden topológico. A diferencia de un atributo de ordenación plana, las ramas independientes del grafo se siguen ejecutando en paralelo.
[System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Method, AllowMultiple=true, Inherited=false)]
[System.Runtime.CompilerServices.Nullable(0)]
public sealed class DependsOnAttribute : Attribute
[System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Method, AllowMultiple=true, Inherited=false)]
public sealed class DependsOnAttribute : Attribute
[<System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Method, AllowMultiple=true, Inherited=false)>]
[<System.Runtime.CompilerServices.Nullable(0)>]
type DependsOnAttribute = class
inherit Attribute
[<System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Method, AllowMultiple=true, Inherited=false)>]
type DependsOnAttribute = class
inherit Attribute
Public NotInheritable Class DependsOnAttribute
Inherits Attribute
- Herencia
-
DependsOnAttribute
- Atributos
Ejemplos
[TestClass]
public class CheckoutTests
{
[TestMethod]
public void CreateCart() { }
// Fan-out: both of these wait for CreateCart, then may run in parallel with each other.
[TestMethod]
[DependsOn(nameof(CreateCart))]
public void AddItem() { }
[TestMethod]
[DependsOn(nameof(CreateCart))]
public void ApplyCoupon() { }
// Fan-in: waits for both.
[TestMethod]
[DependsOn(nameof(AddItem))]
[DependsOn(nameof(ApplyCoupon))]
public void Checkout() { }
// Runs even when its prerequisite failed.
[TestMethod]
[DependsOn(nameof(Checkout), ProceedOnFailure = true)]
public void WriteAuditRecord() { }
}
Comentarios
El atributo declara un borde "esta prueba depende de esa prueba". Aplicarlo varias veces es cómo una prueba declara más de un requisito previo (fan-in); varias pruebas que nombran el mismo requisito previo es el modo en que un grafo se ha agotado. La distribución ramificada es el punto de la característica: una vez que se ha superado el requisito previo compartido, cada dependiente se puede ejecutar al mismo tiempo y el programador es libre de ejecutarlos simultáneamente, sujeto a ParallelizeAttribute disponibilidad de trabajo y .
Cuando se aplica a una clase, la dependencia se aplica a todas las pruebas de esa clase. Cuando el destino es un tipo (en lugar de un método específico), el borde apunta en cada prueba de ese tipo, por lo que el dependiente solo se inicia una vez que todos ellos han finalizado.
Ámbito. Las dependencias se resuelven dentro de un único origen de prueba. No se puede esperar un destino en otro ensamblado, aunque DependsOnAttribute(Type) y DependsOnAttribute(Type, String) aceptará felizmente un tipo de uno: este tipo de borde no coincide con nada y se notifica como una dependencia ignorada en lugar de ordenar silenciosamente nada.
Semántica de errores. Si no se supera un requisito previo, se omite el dependiente, no se produce un error y la omisión propaga transitivamente el gráfico. Omitir es la convención establecida (testNG dependsOnMethods, la dependencia pytest de TUnit [DependsOn]) y mantiene la señal legible: una causa principal se notifica como un error más un conjunto de omisión claramente etiquetados, en lugar de un muro de errores. Se establece ProceedOnFailure en true para un dependiente que debe ejecutarse de todos modos, normalmente una prueba de auditoría o limpieza.
Ciclos. Un ciclo de dependencia es un error de configuración y se notifica antes de que se ejecute cualquier prueba en el ensamblado. Se produce un error en todas las pruebas del ciclo con un mensaje que denomina la ruta de acceso del ciclo.
Interacción con la paralelización. La ordenación se aplica independientemente de Scope. En ClassLevel (valor predeterminado) la unidad de programación es toda la clase, por lo que las dependencias entre dos clases se respetan en la granularidad de clase; una dependencia entre dos métodos de la misma clase los ordena dentro de la ejecución de esa clase. En MethodLevel cada prueba se programa individualmente, lo que proporciona el más paralelismo y la mejor ordenación. Si la programación de nivel de clase requeriría ejecutar dos clases entre sí (la prueba de la clase A depende de la clase B y viceversa), el orden declarado todavía se respeta: las pruebas de esas clases se ejecutan secuencialmente, en orden de dependencia y una advertencia las denomina , pero pierden su paralelismo; cambiar a MethodLevel obtenerlo de vuelta.
Una prueba marcada se DoNotParallelizeAttribute ejecuta en la fase secuencial, que se produce después de la fase paralela. Por lo tanto, una prueba paralelizable que depende de dicha prueba se mueve también a la fase secuencial (transitivamente), de modo que su requisito previo realmente se haya ejecutado primero.
Pruebas controladas por datos. Asignar un nombre a una prueba que se expanda en varios casos de prueba (por ejemplo, a través [DataRow]de ) crea un borde en todos sus casos: el dependiente espera cada fila y se omite si no se supera ninguna fila. No se admite la coincidencia por fila.
Herencia. Un método de prueba declarado en una clase base se ejecuta como prueba de cada clase de prueba derivada y la dependencia que declara viaja con él: el borde se resuelve en la clase derivada , por lo que cada clase derivada obtiene su propio borde entre sus propias copias de las dos pruebas. Al quitar el borde, descartaría silenciosamente la ordenación declarada en cada clase de prueba concreta. Lo que Inherited = false opta por no participar en es cadenas de invalidación : un método que invalida una prueba dependiente sin volver a declarar el atributo no tiene ninguna dependencia, ya que volver a apuntar un requisito previo a un método que el autor vuelve a escribir tiende a crear bordes que nadie le pide.
Las dependencias de prueba se unen y hacen imposible ejecutar un dependiente de forma aislada, por lo que son una mala opción para las pruebas unitarias. Existen para la integración de varios pasos y los conjuntos de un extremo a otro, donde el establecimiento de un estado costoso en cada prueba no es práctico.
Constructores
| Nombre | Description |
|---|---|
| DependsOnAttribute(String) |
Inicializa una nueva instancia de la DependsOnAttribute clase declarando una dependencia en otro método de prueba de la misma clase de prueba. |
| DependsOnAttribute(Type, String) |
Inicializa una nueva instancia de la DependsOnAttribute clase declarando una dependencia en un método de prueba específico de otra clase de prueba. |
| DependsOnAttribute(Type) |
Inicializa una nueva instancia de la DependsOnAttribute clase declarando una dependencia en cada prueba de otra clase de prueba. |
Propiedades
| Nombre | Description |
|---|---|
| ProceedOnFailure |
Obtiene o establece un valor que indica si el dependiente todavía se ejecuta cuando no se supera un requisito previo. El valor predeterminado es |
| TestClass |
Obtiene la clase de prueba que declara el requisito previo o |
| TestMethodName |
Obtiene el nombre del método de prueba de requisitos previos o |