DependsOnAttribute Klasa
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Deklaruje, że test (lub każdy test klasy testowej) nie może rozpoczynać się, dopóki co najmniej jeden inny test nie zakończy się, tworząc graf zależności wykonywany przez harmonogram w zestawie w kolejności topologicznej. W przeciwieństwie do atrybutu porządkowania płaskiego niezależne gałęzie grafu nadal działają równolegle.
[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
- Dziedziczenie
-
DependsOnAttribute
- Atrybuty
Przykłady
[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() { }
}
Uwagi
Atrybut deklaruje krawędź "ten test zależy od tego testu". Zastosowanie go kilka razy polega na tym, jak test deklaruje więcej niż jedno wymaganie wstępne (fan-in); kilka testów nazewnictwa tych samych wymagań wstępnych jest jak wentylator grafu. Fan-out jest punktem funkcji: po upłynięciu współużytkowanego wymagania wstępne każde zależne staje się uruchamiane w tym samym czasie, a harmonogram jest bezpłatny do uruchamiania ich współbieżnie, z zastrzeżeniem ParallelizeAttribute dostępności procesu roboczego i.
Po zastosowaniu do klasy zależność ma zastosowanie do każdego testu w tej klasie. Gdy element docelowy jest typem (a nie określoną metodą), punkty brzegowe w każdym teście tego typu, więc zależne rozpoczyna się tylko po zakończeniu wszystkich z nich.
Zakres. Zależności są rozwiązywane w jednym źródle testowym. Cel w innym zestawie nie może być czekany, mimo że DependsOnAttribute(Type) i DependsOnAttribute(Type, String) szczęśliwie zaakceptuje typ z jednego: taka krawędź nie pasuje do niczego i jest zgłaszana jako ignorowana zależność, a nie dyskretnie porządkowanie niczego.
Semantyka błędów. Jeśli warunek wstępny nie zostanie przekazany, zależne zostanie pominięte, nie powiedzie się, a pomijanie propaguje przechodnio w dół grafu. Pomijanie jest ustanowioną konwencją (zależność TUnit, TUnit' i dependsOnMethods[DependsOn]utrzymuje sygnał czytelny: jedna główna przyczyna jest zgłaszana jako jedna awaria oraz zestaw wyraźnie oznaczonych pomijań, zamiast ściany awarii. Ustaw ProceedOnFailure wartość na true dla zależności, która musi być uruchamiana mimo to — zazwyczaj test inspekcji lub oczyszczania.
Cykle. Cykl zależności jest błędem konfiguracji i jest zgłaszany przed uruchomieniem jakiegokolwiek testu w zestawie. Każdy test w cyklu kończy się niepowodzeniem z komunikatem nazewnictwa ścieżki cyklu.
Interakcja z przetwarzaniem równoległym. Porządkowanie jest wymuszane niezależnie od Scope. W obszarze ClassLevel (ustawienie domyślne) jednostka planowania jest całą klasą, więc zależności między dwiema klasami są honorowane na stopień szczegółowości klas; zależność między dwiema metodami tej samej klasy porządkuje je w ramach przebiegu tej klasy. W każdym MethodLevel teście zaplanowano indywidualnie, co daje najbardziej równoległość i najlepsze kolejność. Jeśli planowanie na poziomie klasy wymagałoby uruchomienia dwóch klas przed sobą (test klasy A zależy od klas B i odwrotnie), zadeklarowana kolejność jest nadal honorowana — testy tych klas są uruchamiane sekwencyjnie, w kolejności zależności i ich nazwy ostrzegawcze - ale tracą równoległość; przełączenie, aby go odzyskać MethodLevel .
Test oznaczony DoNotParallelizeAttribute przebiegiem w fazie sekwencyjnej, która następuje po fazie równoległej. Test równoległy, który zależy od takiego testu, jest zatem przenoszony do fazy sekwencyjnej (przechodnio), dzięki czemu jego wymaganie wstępne zostało rzeczywiście uruchomione jako pierwsze.
Testy oparte na danych. Nazewnictwo testu, który rozszerza się na kilka przypadków testowych (na przykład za pośrednictwem [DataRow]) powoduje utworzenie krawędzi dla wszystkich jej przypadków: zależne oczekiwanie na każdy wiersz i zostanie pominięte, jeśli którykolwiek wiersz nie przejdzie pomyślnie. Dopasowywanie poszczególnych wierszy nie jest obsługiwane.
Dziedziczenie. Metoda testowa zadeklarowana w klasie bazowej jest uruchamiana jako test każdej pochodnej klasy testowej, a zależność, z nią deklarowana: krawędź jest rozpoznawana względem klasy pochodnej , więc każda klasa pochodna uzyskuje własną krawędź między własnymi kopiami dwóch testów. Usunięcie krawędzi spowoduje dyskretne odrzucenie zadeklarowanej kolejności w każdej betonowej klasie testowej. Co Inherited = false zrezygnuje z tego, jest zastępowanie łańcuchów: metoda, która zastępuje test zależny bez ponownego deklarowania atrybutu nie ma zależności, ponieważ ponowne wskazanie wymagań wstępnych do metody, o którą autor przepisał, ma tendencję do tworzenia krawędzi, o które nikt nie prosił.
Zależności testowe łączą ze sobą testy i uniemożliwiają uruchamianie zależności w izolacji, więc są one słabe dopasowanie do testów jednostkowych. Istnieją one w przypadku integracji wieloetapowej i kompleksowego zestawu, w których ponowne ustanowienie kosztownego stanu w każdym teście jest niepraktyczne.
Konstruktory
| Nazwa | Opis |
|---|---|
| DependsOnAttribute(String) |
Inicjuje nowe wystąpienie DependsOnAttribute klasy deklarujące zależność od innej metody testowej tej samej klasy testowej. |
| DependsOnAttribute(Type, String) |
Inicjuje nowe wystąpienie DependsOnAttribute klasy deklarujące zależność od określonej metody testowej innej klasy testowej. |
| DependsOnAttribute(Type) |
Inicjuje nowe wystąpienie DependsOnAttribute klasy deklarujące zależność od każdego testu innej klasy testowej. |
Właściwości
| Nazwa | Opis |
|---|---|
| ProceedOnFailure |
Pobiera lub ustawia wartość wskazującą, czy zależne nadal jest uruchamiane, gdy warunek wstępny nie zostanie przekazany. Wartość domyślna to , co oznacza, że zależność |
| TestClass |
Pobiera klasę testową deklarując wymaganie wstępne lub |
| TestMethodName |
Pobiera nazwę metody testu wymagań wstępnych lub |