Lingua

DependsOnAttribute Classe

Definizione

Dichiara che un test (o ogni test di una classe di test) non deve iniziare fino al termine di uno o più test, formando un grafico delle dipendenze eseguito dall'utilità di pianificazione nell'assembly in ordine topologico. A differenza di un attributo di ordinamento flat, i rami indipendenti del grafico continuano a essere eseguiti in parallelo.

[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
Ereditarietà
DependsOnAttribute
Attributi

Esempio

[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() { }
}

Commenti

L'attributo dichiara un bordo "questo test dipende da tale test". L'applicazione più volte è il modo in cui un test dichiara più prerequisiti (fan-in); diversi test che denominano lo stesso prerequisito è la modalità di uscita di un grafico. Fan-out è il punto della funzionalità: una volta superato il prerequisito condiviso, ogni dipendente diventa eseguibile contemporaneamente e l'utilità di pianificazione è libera di eseguirle contemporaneamente, in base alla ParallelizeAttribute disponibilità del ruolo di lavoro e .

Se applicata a una classe, la dipendenza si applica a ogni test in tale classe. Quando la destinazione è un tipo (anziché un metodo specifico), il bordo punta a ogni test di quel tipo, quindi il dipendente inizia solo una volta completate tutte.

Ambito. Le dipendenze vengono risolte all'interno di una singola origine di test. Non è possibile attendere una destinazione in un altro assembly, anche se DependsOnAttribute(Type) e DependsOnAttribute(Type, String) accetterà felicemente un tipo da uno: tale arco non corrisponde a nulla e viene segnalato come dipendenza ignorata anziché ordinare in modo invisibile all'utente qualsiasi elemento.

Semantica degli errori. Se non viene superato un prerequisito, il dipendente viene ignorato, non è riuscito e il ignora propaga in modo transitivo verso il basso il grafico. Ignorando è la convenzione stabilita (TestNG, dependsOnMethodsTUnit [DependsOn], pytest-dependency) e mantiene il segnale leggibile: una causa radice viene segnalata come un errore più un set di skip chiaramente etichettati, anziché un muro di errori. Impostare ProceedOnFailure su true per un dipendente che deve comunque essere eseguito, in genere un test di controllo o pulizia.

Cicli. Un ciclo di dipendenza è un errore di configurazione e viene segnalato prima dell'esecuzione di qualsiasi test nell'assembly. Ogni test del ciclo non è riuscito con un messaggio che denomina il percorso del ciclo.

Interazione con parallelizzazione. L'ordinamento viene applicato indipendentemente da Scope. In ClassLevel (impostazione predefinita) l'unità di pianificazione è l'intera classe, quindi le dipendenze tra due classi vengono rispettate a livello di granularità della classe. Una dipendenza tra due metodi della stessa classe li ordina all'interno dell'esecuzione di tale classe. In MethodLevel ogni test viene pianificato singolarmente, che dà il maggior parallelismo e il miglior ordinamento. Se la pianificazione a livello di classe richiederebbe l'esecuzione di due classi prima dell'altra (il test della classe A dipende dalla classe B e viceversa), l'ordine dichiarato viene comunque rispettato: i test delle classi vengono eseguiti in sequenza, in ordine di dipendenza e un avviso li assegna , ma perdono il parallelismo; passando a recuperarlo MethodLevel di nuovo.

Un test contrassegnato DoNotParallelizeAttribute viene eseguito nella fase sequenziale, che si verifica dopo la fase parallela. Un test parallelizzabile che dipende da tale test viene quindi spostato nella fase sequenziale (transitivamente), in modo che il suo prerequisito sia stato eseguito per primo.

Test basati sui dati. La denominazione di un test che si espande in diversi test case (ad esempio tramite [DataRow]) crea un bordo per tutti i relativi case: l'entità dipendente attende ogni riga e viene ignorata se una riga non viene superata. La corrispondenza per riga non è supportata.

Ereditarietà. Un metodo di test dichiarato in una classe di base viene eseguito come test di ogni classe di test derivata e la dipendenza con cui dichiara i viaggi: il bordo viene risolto rispetto alla classe derivata , quindi ogni classe derivata ottiene il proprio bordo tra le proprie copie dei due test. Eliminando il bordo, l'ordine dichiarato viene eliminato in modo invisibile all'utente in ogni classe di test concreta. Il Inherited = false rifiuto esplicito di è la catena di override: un metodo che esegue l'override di un test dipendente senza dichiarare nuovamente l'attributo non ha alcuna dipendenza, perché il reinsecare un prerequisito in un metodo che l'autore riscrive tende a creare archi che nessuno ha chiesto.

Le dipendenze di test associano i test e rendono impossibile eseguire un dipendente in isolamento, quindi sono un'idoneità insufficiente per gli unit test. Esistono per l'integrazione in più passaggi e le suite end-to-end, in cui ristabilire lo stato costoso in ogni test è poco pratico.

Costruttori

Nome Descrizione
DependsOnAttribute(String)

Inizializza una nuova istanza della DependsOnAttribute classe dichiarando una dipendenza da un altro metodo di test della stessa classe di test.

DependsOnAttribute(Type, String)

Inizializza una nuova istanza della DependsOnAttribute classe dichiarando una dipendenza da un metodo di test specifico di un'altra classe di test.

DependsOnAttribute(Type)

Inizializza una nuova istanza della DependsOnAttribute classe dichiarando una dipendenza da ogni test di un'altra classe di test.

Proprietà

Nome Descrizione
ProceedOnFailure

Ottiene o imposta un valore che indica se l'oggetto dipendente viene ancora eseguito quando non viene superato un prerequisito. L'impostazione predefinita è false, ovvero il dipendente viene ignorato. Impostarlo su true per un test che deve essere eseguito indipendentemente dal risultato dei prerequisiti, ad esempio un test di controllo o pulizia. L'ordinamento viene comunque applicato.

TestClass

Ottiene la classe di test che dichiara il prerequisito o null quando il prerequisito è un metodo della stessa classe del dipendente.

TestMethodName

Ottiene il nome del metodo di test dei prerequisiti o null quando la dipendenza è destinata a ogni test di TestClass.

Si applica a