Megosztás a következőn keresztül:


Tesztelési keretrendszer létrehozása

Ez a cikk bemutatja, hogyan hozhat létre egyéni tesztelési keretrendszert a Microsoft.Testing.Platform számára. A tesztelési keretrendszer az egyetlen kötelező bővítmény. Felderíti és futtatja a teszteket, és jelentéseket készít az eredményekről a platformon.

A bővítménypont teljes összefoglalását és a folyamaton belüli/folyamaton kívüli fogalmakat az egyéni bővítmények létrehozása című témakörben talál.

Ha meglévő VSTest-alapú tesztelési keretrendszert migrál, a ITestFramework felület natív implementálása az ajánlott módszer. A VSTest Bridge bővítmény átmeneti lépésként érhető el, de a natív implementáció biztosítja a legjobb élményt.

Tesztelési keretrendszer bővítménye

A tesztelési keretrendszer az elsődleges bővítmény, amely lehetővé teszi a tesztelési platform számára a tesztek felderítését és végrehajtását. A tesztelési keretrendszer feladata, hogy a tesztek eredményeit visszakossa a tesztelési platformra. A tesztkörnyezet az egyetlen kötelező bővítmény, amely egy tesztelési munkamenet végrehajtásához szükséges.

Tesztelési keretrendszer regisztrálása

Ez a szakasz bemutatja, hogyan regisztrálhatja a tesztelési keretrendszert a tesztelési platformon. Tesztalkalmazás-készítőnként csak egy tesztelési keretrendszert regisztrálhat a TestApplication.RegisterTestFrameworkMicrosoft.Testing.Platform architektúra dokumentációjában látható API használatával.

A regisztrációs API a következőképpen van definiálva:

ITestApplicationBuilder RegisterTestFramework(
    Func<IServiceProvider, ITestFrameworkCapabilities> capabilitiesFactory,
    Func<ITestFrameworkCapabilities, IServiceProvider, ITestFramework> adapterFactory);

A RegisterTestFramework API két gyárat vár:

  1. Func<IServiceProvider, ITestFrameworkCapabilities>: Ez a meghatalmazott elfogadja a IServiceProvider felületet implementáló objektumot, és visszaad egy objektumot, amely megvalósítja a ITestFrameworkCapabilities felületet. A IServiceProvider hozzáférést biztosít a platformszolgáltatásokhoz, például konfigurációkhoz, naplózókhoz és parancssori argumentumokhoz.

    A ITestFrameworkCapabilities felület a tesztelési keretrendszer által támogatott képességek platformra és bővítményekre való bejelentésére szolgál. Lehetővé teszi, hogy a platform és a bővítmények megfelelően működjenek együtt bizonyos viselkedések implementálásával és támogatásával. A képességek fogalmának jobb megértéséhez tekintse meg a megfelelő szakaszt.

  2. Func<ITestFrameworkCapabilities, IServiceProvider, ITestFramework>: Ez egy delegált, amely egy ITestFrameworkCapabilities objektumot vesz fel, amely a Func<IServiceProvider, ITestFrameworkCapabilities>által visszaadott példány, és egy IServiceProvider-t, amely ismét hozzáférést biztosít a platformszolgáltatásokhoz. A várt visszatérési objektum az, amely implementálja az ITestFramework felületet. A ITestFramework szolgál a teszteket felderítő és futtató végrehajtó motorként, majd visszaküldi az eredményeket a tesztelési platformnak.

A platformnak el kell különítenie a ITestFrameworkCapabilities létrehozását és a ITestFramework létrehozását, hogy elkerülje a tesztelési keretrendszer létrehozását, ha a támogatott képességek nem elegendőek az aktuális tesztelési munkamenet végrehajtásához.

Tekintse meg a következő felhasználói kód példáját, amely egy üres képességkészletet visszaadó tesztelési keretrendszer-regisztrációt mutat be:

internal class TestingFrameworkCapabilities : ITestFrameworkCapabilities
{
    public IReadOnlyCollection<ITestFrameworkCapability> Capabilities => [];
}

internal class TestingFramework : ITestFramework
{
   public TestingFramework(ITestFrameworkCapabilities capabilities, IServiceProvider serviceProvider)
   {
       // ...
   }
   // Omitted for brevity...
}

public static class TestingFrameworkExtensions
{
    public static void AddTestingFramework(this ITestApplicationBuilder builder)
    {
        builder.RegisterTestFramework(
            _ => new TestingFrameworkCapabilities(),
            (capabilities, serviceProvider) => new TestingFramework(capabilities, serviceProvider));
    }
}

// ...

Most vegye figyelembe a példa megfelelő belépési pontját a regisztrációs kóddal:

var testApplicationBuilder = await TestApplication.CreateBuilderAsync(args);
// Register the testing framework
testApplicationBuilder.AddTestingFramework();
using var testApplication = await testApplicationBuilder.BuildAsync();
return await testApplication.RunAsync();

Megjegyzés:

Az üres ITestFrameworkCapabilities visszaadása nem akadályozhatja meg a tesztmunkamenet végrehajtását. Minden tesztelési keretrendszernek képesnek kell lennie a tesztek felderítésére és futtatására. A hatást olyan bővítményekre kell korlátozni, amelyek kikapcsolhatnak, ha a tesztelési keretrendszer nem rendelkezik bizonyos funkcióval.

Tesztelési keretrendszer létrehozása

A Microsoft.Testing.Platform.Extensions.TestFramework.ITestFramework-t a tesztelési keretrendszert biztosító bővítmények implementálják.

public interface ITestFramework : IExtension
{
    Task<CreateTestSessionResult> CreateTestSessionAsync(CreateTestSessionContext context);
    Task ExecuteRequestAsync(ExecuteRequestContext context);
    Task<CloseTestSessionResult> CloseTestSessionAsync(CloseTestSessionContext context);
}

A IExtension felület

Az ITestFramework interfész örökli az IExtension interfészt, amely egy olyan felület, amelytől minden bővítménypont örököl. IExtension a bővítmény nevének és leírásának lekérésére szolgál. A IExtension lehetővé teszi a bővítmény dinamikus engedélyezését vagy letiltását a telepítés során, Task<bool> IsEnabledAsync()keresztül. Győződjön meg arról, hogy visszatér true e függvényből, ha nincs különleges követelménye annak letiltására.

A CreateTestSessionAsync metódus

A CreateTestSessionAsync metódust a tesztmunkamenet elején hívjuk meg, és a tesztelési keretrendszer inicializálására szolgál. Az API elfogad egy CreateTestSessionContext objektumot, és visszaad egy CreateTestSessionResult.

public sealed class CreateTestSessionContext : TestSessionContext
{
    public CancellationToken CancellationToken { get; }
}

A SessionUid tulajdonság a TestSessionContext következőből öröklődik (lásd a TestSessionContext szakaszt). A CancellationToken a CreateTestSessionAsyncvégrehajtásának leállítására szolgál.

A visszatérési objektum egy CreateTestSessionResult:

public sealed class CreateTestSessionResult
{
    public string? WarningMessage { get; set; }
    public string? ErrorMessage { get; set; }
    public bool IsSuccess { get; set; }
}

A IsSuccess tulajdonság jelzi, hogy a munkamenet létrehozása sikeres volt-e. Amikor falsead vissza, a teszt végrehajtása leáll.

A CloseTestSessionAsync metódus

A CloseTestSessionAsync metódus funkció szempontjából a CreateTestSessionAsync ellentéte, az egyetlen különbség az objektumnevekben van. További információért lásd a(z) CreateTestSessionAsync szakaszt.

A ExecuteRequestAsync metódus

A ExecuteRequestAsync metódus egy ExecuteRequestContexttípusú objektumot fogad el. Ez az objektum, ahogy a neve is sugallja, tartalmazza a tesztelési keretrendszer által várhatóan végrehajtandó műveletre vonatkozó részleteket. A ExecuteRequestContext definíciója a következő:

public sealed class ExecuteRequestContext
{
    public IRequest Request { get; }
    public IMessageBus MessageBus { get; }
    public CancellationToken CancellationToken { get; }
    public void Complete();
}

IRequest: Ez minden típusú kérelem alapfelülete. Gondolj a tesztelési keretrendszerre úgy, mint egy folyamaton belüli állapotalapú kiszolgálóra, ahol az életciklus a következő:

A tesztelési keretrendszer életciklusát ábrázoló szekvenciadiagram.

Az előző ábrán látható, hogy a tesztelési platform három kérést ad ki a tesztelési keretrendszer példányának létrehozása után. A tesztelési keretrendszer feldolgozza ezeket a kéréseket, és a kérés részét képező IMessageBus szolgáltatást használja az egyes kérések eredményének kézbesítéséhez. Egy adott kérés kezelése után a tesztelési keretrendszer meghívja rajta a Complete() metódust, jelezve a tesztelési platformnak, hogy a kérés teljesült. A tesztelési platform figyeli az összes elküldött kérést. Miután az összes kérés teljesült, meghívja a CloseTestSessionAsync, és megsemmisíti a példányt (ha IDisposable/IAsyncDisposable implementálva van). Nyilvánvaló, hogy a kérések és azok befejezései átfedésben lehetnek, ami lehetővé teszi a kérések egyidejű és aszinkron végrehajtását.

Megjegyzés:

A tesztelési platform jelenleg nem küld átfedő kéréseket, és a következő elküldése előtt megvárja a kérések befejezését >>. Ez a viselkedés azonban a jövőben változhat. Az egyidejű kérések támogatását az képességek rendszer határozza meg.

A IRequest implementáció határozza meg a teljesítendő pontos kérést. A tesztelési keretrendszer azonosítja a kérés típusát, és ennek megfelelően kezeli azt. Ha a kérelem típusa ismeretlen, kivételt kell emelni.

Az elérhető kérésekről az IRequest szakaszban talál részletes információkat.

IMessageBus: Ez a kérelemhez társított szolgáltatás lehetővé teszi, hogy a tesztelési keretrendszer aszinkron módon közzétenni a folyamatban lévő kéréssel kapcsolatos információkat a tesztelési platformon. Az üzenetbusz a platform központi központjaként szolgál, és megkönnyíti az aszinkron kommunikációt az összes platformösszetevő és -bővítmény között. A tesztelési platformon közzétehető információk átfogó listájáért tekintse meg az IMessageBus szakaszt.

CancellationToken: Ez az azonosító a feldolgozás megszakítására szolgál egy adott kérés esetén.

Complete(): Ahogyan az előző sorozatban is látható, a Complete metódus értesíti a platformot arról, hogy a kérelem sikeresen feldolgozásra került, és hogy az összes releváns információ átadásra került a IMessageBusrészére.

Figyelmeztetés

Ha figyelmen kívül hagyja a Complete() meghívását a kérelemben, a tesztalkalmazás nem válaszol.

Ha testre szeretné szabni a tesztelési keretrendszert a követelményeknek vagy a felhasználók igényeinek megfelelően, használhat egy személyre szabott szakaszt a konfigurációs fájlban, vagy egyéni parancssori beállításokkal.

Kérelmek kezelése

A következő szakasz részletes leírást nyújt a tesztelési keretrendszer által fogadott és feldolgozott különböző kérelmekről.

Mielőtt továbblépnénk a következő szakaszra, elengedhetetlen, hogy alaposan megértsd az IMessageBusfogalmát, amely a tesztvégrehajtási információk tesztelési platformhoz való továbbításának alapvető szolgáltatása.

TestSessionContext

A TestSessionContext minden kérés megosztott tulajdonsága, amely a folyamatban lévő tesztelési munkamenetről nyújt információt:

public class TestSessionContext
{
    public SessionUid SessionUid { get; }
}

public readonly struct SessionUid(string value)
{
    public string Value { get; }
}

A TestSessionContext tartalmazza a SessionUid-et, amely a folyamatban lévő tesztelési munkamenet egyedi azonosítója, és segíti a munkamenet adatainak naplózását és korrelálását.

TesztVégrehajtásiKérelemFelfedezése

public class DiscoverTestExecutionRequest
{
    public TestSessionContext Session { get; }
    public ITestExecutionFilter Filter { get; }
}

A DiscoverTestExecutionRequest utasítja a tesztelési keretrendszert , hogy felderítse a teszteket, és közvetítse ezt az információt az IMessageBus-re.

Az előző szakaszban leírtak szerint a felderített teszt tulajdonsága DiscoveredTestNodeStateProperty. Íme egy általános kódrészlet a hivatkozáshoz:

var testNode = new TestNode
{
    Uid = GenerateUniqueStableId(),
    DisplayName = GetDisplayName(),
    Properties = new PropertyBag(
        DiscoveredTestNodeStateProperty.CachedInstance),
};

await context.MessageBus.PublishAsync(
    this,
    new TestNodeUpdateMessage(
        discoverTestExecutionRequest.Session.SessionUid,
        testNode));

// ...

TesztFuttatásKérés

public class RunTestExecutionRequest
{
    public TestSessionContext Session { get; }
    public ITestExecutionFilter Filter { get; }
}

A RunTestExecutionRequest utasítja a tesztelési keretrendszert , hogy hajtsa végre a teszteket, és közölje ezeket az információkat az IMessageBus.

Íme egy általános kódrészlet a hivatkozáshoz:

var skippedTestNode = new TestNode()
{
    Uid = GenerateUniqueStableId(),
    DisplayName = GetDisplayName(),
    Properties = new PropertyBag(
        SkippedTestNodeStateProperty.CachedInstance),
};

await context.MessageBus.PublishAsync(
    this,
    new TestNodeUpdateMessage(
        runTestExecutionRequest.Session.SessionUid,
        skippedTestNode));

// ...

var successfulTestNode = new TestNode()
{
    Uid = GenerateUniqueStableId(),
    DisplayName = GetDisplayName(),
    Properties = new PropertyBag(
        PassedTestNodeStateProperty.CachedInstance),
};

await context.MessageBus.PublishAsync(
    this,
    new TestNodeUpdateMessage(
        runTestExecutionRequest.Session.SessionUid,
        successfulTestNode));

// ...

var assertionFailedTestNode = new TestNode()
{
    Uid = GenerateUniqueStableId(),
    DisplayName = GetDisplayName(),
    Properties = new PropertyBag(
        new FailedTestNodeStateProperty(assertionException)),
};

await context.MessageBus.PublishAsync(
    this,
    new TestNodeUpdateMessage(
        runTestExecutionRequest.Session.SessionUid,
        assertionFailedTestNode));

// ...

var failedTestNode = new TestNode()
{
    Uid = GenerateUniqueStableId(),
    DisplayName = GetDisplayName(),
    Properties = new PropertyBag(
        new ErrorTestNodeStateProperty(ex.InnerException!)),
};

await context.MessageBus.PublishAsync(
    this,
    new TestNodeUpdateMessage(
        runTestExecutionRequest.Session.SessionUid,
        failedTestNode));

A TestNodeUpdateMessage adatok

Ahogy az IMessageBus szakaszban is szerepel, az üzenetbusz használata előtt meg kell adnia a szolgáltatni kívánt adatok típusát. A tesztelési platform egy jól ismert típust , TestNodeUpdateMessagedefiniált, amely a tesztfrissítési információkfogalmát képviseli.

A dokumentum ezen része ismerteti, hogyan használhatja fel ezeket a hasznos adatokat. Vizsgáljuk meg a felületet:

public sealed class TestNodeUpdateMessage(
    SessionUid sessionUid,
    TestNode testNode,
    TestNodeUid? parentTestNodeUid = null)
{
    public TestNode TestNode { get; }
    public TestNodeUid? ParentTestNodeUid { get; }
}

public class TestNode
{
    public required TestNodeUid Uid { get; init; }
    public required string DisplayName { get; init; }
    public PropertyBag Properties { get; init; } = new();
}

public sealed class TestNodeUid(string value);

public sealed partial class PropertyBag
{
    public PropertyBag();
    public PropertyBag(params IProperty[] properties);
    public PropertyBag(IEnumerable<IProperty> properties);
    public int Count { get; }
    public void Add(IProperty property);
    public bool Any<TProperty>();
    public TProperty? SingleOrDefault<TProperty>();
    public TProperty Single<TProperty>();
    public TProperty[] OfType<TProperty>();
    public IEnumerable<IProperty> AsEnumerable();
    public IEnumerator<IProperty> GetEnumerator();
    ...
}

public interface IProperty
{
}
  • TestNodeUpdateMessage: A TestNodeUpdateMessage két tulajdonságból áll: egy TestNode és egy ParentTestNodeUid. A ParentTestNodeUid azt jelzi, hogy egy tesztnek lehet szülőtesztje, amely bevezeti a tesztfa fogalmát,, ahol TestNodeegymáshoz viszonyítva rendezhetők. Ez a struktúra lehetővé teszi a csomópontok közötti fa kapcsolaton alapuló jövőbeli fejlesztéseket és funkciókat. Ha a tesztelési keretrendszer nem igényel tesztfastruktúrát, akkor dönthet úgy, hogy nem használja, és egyszerűen null értékre állítja, ami egy egyszerű, sík TestNodelistát eredményez.

  • TestNode: A TestNode három tulajdonságból áll, amelyek közül az egyik a Uidtípusú TestNodeUid. Ez a Uid a csomópont EGYEDI STABIL AZONOSÍTÓ szolgál. A UNIQUE STABLE ID kifejezés azt jelenti, hogy ugyanazon TestNodeAZONOSUid kell fenntartania a különböző futtatások és operációs rendszerek között. A TestNodeUid egy tetszőleges átlátszatlan sztring, amelyet a tesztelési platform változtatás nélkül fogad el.

Fontos

Az azonosító stabilitása és egyedisége kulcsfontosságú a tesztelési tartományban. Lehetővé teszik egyetlen teszt pontos célzását a végrehajtáshoz, és lehetővé teszik, hogy az azonosító állandó azonosítóként szolgáljon egy teszthez, megkönnyítve a hatékony bővítményeket és funkciókat.

A második tulajdonság a DisplayName, amely a teszt emberbarát neve. Ez a név például a --list-tests parancssor végrehajtásakor jelenik meg.

A harmadik attribútum a Properties, amely egy PropertyBag típusú. Ahogy a kód is mutatja, ez egy speciális tulajdonságcsomag, amely a TestNodeUpdateMessageáltalános tulajdonságait tartalmazza. Ez azt jelenti, hogy bármely tulajdonságot hozzáfűzhet a csomóponthoz, amely megvalósítja a helyőrző felületet IProperty.

A tesztplatform azonosítja a TestNode.Properties hozzáadott tulajdonságokat annak megállapításához, hogy egy teszt sikeres, sikertelen vagy kihagyott-e.

Az elérhető tulajdonságok aktuális listáját a TestNodeUpdateMessage.TestNode szakaszban található relatív leírással találja.

A PropertyBag típus általában minden IData-ben elérhető, és felhasználható arra, hogy a platform és a bővítmények által lekérdezhető egyéb tulajdonságokat tároljon. Ez a mechanizmus lehetővé teszi, hogy új információkkal bővítse a platformot anélkül, hogy kompatibilitástörő változásokat vezetünk be. Ha egy összetevő felismeri a tulajdonságot, lekérdezheti azt; ellenkező esetben figyelmen kívül fogja hagyni.

Végül ez a szakasz egyértelművé teszi, hogy a teszt keretrendszer implementálásának el kell készítenie az IDataProducer-t, amely TestNodeUpdateMessage-eket hoz létre az alábbi mintában:

internal sealed class TestingFramework
    : ITestFramework, IDataProducer
{
   // ...

   public Type[] DataTypesProduced =>
   [
       typeof(TestNodeUpdateMessage)
   ];

   // ...
}

Ha a tesztadapterhez fájlok közzététele szükséges a végrehajtás során, ebben a forrásfájlban megtalálja a felismert tulajdonságokat: https://github.com/microsoft/testfx/blob/main/src/Platform/Microsoft.Testing.Platform/Messages/FileArtifacts.cs. Mint látható, általánosan adhat meg fájlokat, vagy társíthatja őket egy adott TestNode-hoz. Ne feledje, hogy ha le szeretne küldeni egy SessionFileArtifact, azt előzetesen deklarálnia kell a platformon, az alábbiak szerint:

internal sealed class TestingFramework
    : ITestFramework, IDataProducer
{
   // ...

   public Type[] DataTypesProduced =>
   [
       typeof(TestNodeUpdateMessage),
       typeof(SessionFileArtifact)
   ];

   // ...
}

Jól ismert tulajdonságok

A kérések szakaszban leírtak szerint a tesztplatform azonosítja a megadott tulajdonságokat, amelyek hozzá TestNodeUpdateMessage vannak adva egy TestNode adott állapot meghatározásához (például sikeres, sikertelen, kihagyott stb.). Ez lehetővé teszi, hogy a futtatókörnyezet pontosan megjelenítse a sikertelen tesztek listáját a megfelelő információkkal a konzolon, és beállítsa a tesztelési folyamathoz szükséges kilépési kódot.

Ebben a szegmensben ismertetjük a különböző jól ismert IProperty lehetőségeket és azok következményeit.

A jól ismert tulajdonságok átfogó listájáért tekintse meg a TestNodeProperties.cs. Ha azt tapasztalja, hogy hiányzik egy tulajdonságleírás, kérjük, jelezzen egy problémát.

Ezek a tulajdonságok a következő kategóriákba oszthatók:

  1. Általános információk: Bármilyen kéréshez megadható tulajdonságok.
  2. Felderítési információk: A DiscoverTestExecutionRequest felderítési kérelem során megadott tulajdonságok.
  3. Végrehajtási adatok: A tesztvégrehajtási kérelem során megadott tulajdonságok RunTestExecutionRequest.

Bizonyos tulajdonságok szükségesek, míg mások nem kötelezőek. A kötelező tulajdonságok szükségesek az alapvető tesztelési funkciók biztosításához, például a sikertelen tesztek jelentéséhez, valamint annak jelzéséhez, hogy a teljes tesztmunkamenet sikeres volt-e.

Az opcionális tulajdonságok viszont további információk megadásával javítják a tesztelési élményt. Különösen hasznosak IDE-forgatókönyvekben (például VS, VSCode stb.), konzolfuttatásokban, vagy olyan bővítmények támogatásakor, amelyek részletesebb információkat igényelnek a megfelelő működéshez. Ezek az opcionális tulajdonságok azonban nem befolyásolják a tesztek végrehajtását.

Megjegyzés:

A bővítmények riasztással és kivételek kezelésével vannak megbízva, ha adott információkra van szükségük a megfelelő működéshez. Ha egy bővítmény nem rendelkezik a szükséges információkkal, az nem okozhatja a teszt végrehajtásának meghiúsulását, hanem egyszerűen le kell tiltani.

Általános információk
public record KeyValuePairStringProperty(
    string Key,
    string Value)
        : IProperty;

A KeyValuePairStringProperty egy általános kulcs/érték pár adatait jelenti.

public record struct LinePosition(
    int Line,
    int Column);

public record struct LinePositionSpan(
    LinePosition Start,
    LinePosition End);

public abstract record FileLocationProperty(
    string FilePath,
    LinePositionSpan LineSpan)
        : IProperty;

public sealed record TestFileLocationProperty(
    string FilePath,
    LinePositionSpan LineSpan)
        : FileLocationProperty(FilePath, LineSpan);

TestFileLocationProperty a teszt helyének a forrásfájlban való rögzítésére szolgál. Ez különösen akkor hasznos, ha a kezdeményező egy IDE, például Visual Studio vagy Visual Studio Code.

public sealed record TestMethodIdentifierProperty(
    string AssemblyFullName,
    string Namespace,
    string TypeName,
    string MethodName,
    string[] ParameterTypeFullNames,
    string ReturnTypeFullName)

TestMethodIdentifierProperty egy tesztmetódus egyedi azonosítója.

public sealed record TestMetadataProperty(
    string Key,
    string Value)

TestMetadataProperty-t a jellemzőinek vagy a TestNode kifejezésére használják.

Felderítési információk
public sealed record DiscoveredTestNodeStateProperty(
    string? Explanation = null)
{
    public static DiscoveredTestNodeStateProperty CachedInstance { get; }
}

A DiscoveredTestNodeStateProperty azt jelzi, hogy ezt a Tesztcsomópontot felfedezték. Ezt használják, amikor egy DiscoverTestExecutionRequest-át elküldenek a tesztelési keretrendszernek. Vegye figyelembe a CachedInstance tulajdonság által kínált praktikus gyorsítótárazott értéket. Ez a tulajdonság kötelező .

Végrehajtási adatok
public sealed record InProgressTestNodeStateProperty(
    string? Explanation = null)
{
    public static InProgressTestNodeStateProperty CachedInstance { get; }
}

A InProgressTestNodeStateProperty tájékoztatja a tesztelési platformot, hogy a TestNode végrehajtásra lett ütemezve, és jelenleg folyamatban van. Vegye figyelembe a CachedInstance tulajdonság által kínált praktikus gyorsítótárazott értéket.

public readonly record struct TimingInfo(
    DateTimeOffset StartTime,
    DateTimeOffset EndTime,
    TimeSpan Duration);

public sealed record StepTimingInfo(
    string Id,
    string Description,
    TimingInfo Timing);

public sealed record TimingProperty : IProperty
{
    public TimingProperty(TimingInfo globalTiming)
        : this(globalTiming, [])
    {
    }

    public TimingProperty(
        TimingInfo globalTiming,
        StepTimingInfo[] stepTimings)
    {
        GlobalTiming = globalTiming;
        StepTimings = stepTimings;
    }

    public TimingInfo GlobalTiming { get; }

    public StepTimingInfo[] StepTimings { get; }
}

A TimingProperty a TestNode végrehajtásával kapcsolatos időzítési adatok továbbítására használható. Emellett lehetővé teszi az egyes végrehajtási lépések időzítését StepTimingInfokeresztül. Ez különösen akkor hasznos, ha a tesztkoncepció több fázisra van osztva, például inicializálásra, végrehajtásra és törlésre.

A következő tulajdonságok közül csak egyszükségesTestNode, és közli a TestNode eredményét a tesztelési platformmal.

public sealed record PassedTestNodeStateProperty(
    string? Explanation = null)
        : TestNodeStateProperty(Explanation)
{
    public static PassedTestNodeStateProperty CachedInstance
        { get; } = new PassedTestNodeStateProperty();
}

PassedTestNodeStateProperty értesíti a tesztelési platformot, hogy a TestNode sikeresen teljesítve lett. Vegye figyelembe a CachedInstance tulajdonság által kínált praktikus gyorsítótárazott értéket.

public sealed record SkippedTestNodeStateProperty(
    string? Explanation = null)
        : TestNodeStateProperty(Explanation)
{
    public static SkippedTestNodeStateProperty CachedInstance
        { get; } =  new SkippedTestNodeStateProperty();
}

SkippedTestNodeStateProperty tájékoztatja a tesztplatformot, hogy a TestNode ki lett hagyva. Vegye figyelembe a CachedInstance tulajdonság által kínált praktikus gyorsítótárazott értéket.

public sealed record FailedTestNodeStateProperty : TestNodeStateProperty
{
    public FailedTestNodeStateProperty()
        : base(default(string))
    {
    }

    public FailedTestNodeStateProperty(string explanation)
        : base(explanation)
    {
    }

    public FailedTestNodeStateProperty(
        Exception exception,
        string? explanation = null)
        : base(explanation ?? exception.Message)
    {
        Exception = exception;
    }

    public Exception? Exception { get; }
}

Egy állítás után FailedTestNodeStateProperty tájékoztatja a tesztelési platformot, hogy ez a TestNode sikertelen.

public sealed record ErrorTestNodeStateProperty : TestNodeStateProperty
{
    public ErrorTestNodeStateProperty()
        : base(default(string))
    {
    }

    public ErrorTestNodeStateProperty(string explanation)
        : base(explanation)
    {
    }

    public ErrorTestNodeStateProperty(
        Exception exception,
        string? explanation = null)
            : base(explanation ?? exception.Message)
    {
        Exception = exception;
    }

    public Exception? Exception { get; }
}

ErrorTestNodeStateProperty tájékoztatja a tesztelési platformot, hogy ez a TestNode sikertelen volt. Ez a hibatípus eltér a FailedTestNodeStateProperty-tól, amelyet állítási hibákhoz használnak. Például jelenthet olyan problémákat a ErrorTestNodeStatePropertysegítségével, mint a tesztinicializálási hibák.

public sealed record TimeoutTestNodeStateProperty : TestNodeStateProperty
{
    public TimeoutTestNodeStateProperty()
        : base(default(string))
    {
    }

    public TimeoutTestNodeStateProperty(string explanation)
        : base(explanation)
    {
    }

    public TimeoutTestNodeStateProperty(
        Exception exception,
        string? explanation = null)
            : base(explanation ?? exception.Message)
    {
        Exception = exception;
    }

    public Exception? Exception { get; }

    public TimeSpan? Timeout { get; init; }
}

TimeoutTestNodeStateProperty tájékoztatja a tesztelési platformot, hogy ez a TestNode időtúllépési okból meghiúsult. Az időtúllépést a Timeout tulajdonság használatával jelentheti.

public sealed record CancelledTestNodeStateProperty : TestNodeStateProperty
{
    public CancelledTestNodeStateProperty()
        : base(default(string))
    {
    }

    public CancelledTestNodeStateProperty(string explanation)
        : base(explanation)
    {
    }

    public CancelledTestNodeStateProperty(
        Exception exception,
        string? explanation = null)
        : base(explanation ?? exception.Message)
    {
        Exception = exception;
    }

    public Exception? Exception { get; }
}

CancelledTestNodeStateProperty tájékoztatja a tesztelési platformot, hogy ez a TestNode törlés miatt meghiúsult.