Akce testovatelnosti

Za účelem simulace nespolehlivé infrastruktury poskytuje Azure Service Fabric vývojáři způsoby simulace různých reálných selhání a přechodů stavu. Ty jsou vystavené jako akce testovatelnosti. Akce jsou rozhraní API nízké úrovně, která způsobují konkrétní injektáž chyb, přechod stavu nebo ověření. Kombinací těchto akcí můžete psát komplexní testovací scénáře pro vaše služby.

Service Fabric nabízí několik běžných testovacích scénářů, které se skládají z těchto akcí. Důrazně doporučujeme využít tyto předdefinované scénáře, které jsou pečlivě zvoleny k testování běžných přechodů stavu a selhání. Akce se ale dají použít k vytvoření vlastních testovacích scénářů, když chcete přidat pokrytí pro scénáře, které ještě nejsou předdefinované scénáře pokryté nebo které jsou přizpůsobené vaší aplikaci.

Implementace akcí jazyka C# se nacházejí v sestavení System.Fabric.dll. Modul PowerShellu pro system fabric najdete v sestavení Microsoft.ServiceFabric.Powershell.dll. Jako součást instalace za běhu se nainstaluje modul ServiceFabric PowerShell, který umožňuje snadné použití.

Ladné vs. nechutné chybové akce

Akce testovatelnosti jsou rozdělené do dvou hlavních kontejnerů:

  • Neočekávané chyby: Tyto chyby simulují selhání, jako jsou restartování počítače a selhání procesů. V takových případech selhání se kontext spuštění procesu náhle zastaví. To znamená, že před opětovným spuštěním aplikace nelze spustit žádné vyčištění stavu.
  • Řádné chyby: Tyto chyby simulují řádné akce, jako jsou přesuny a výpadky repliky aktivované vyrovnáváním zatížení. V takových případech služba obdrží oznámení o uzavření a může stav před ukončením vyčistit.

Pro zajištění lepší kvality ověřování spusťte službu a obchodní úlohy a současně vygenerujte různé řádné a nevděčné chyby. Nevděčné chyby se procvičí ve scénářích, kdy se proces služby náhle ukončí uprostřed nějakého pracovního postupu. Tím se otestuje cesta obnovení, jakmile Service Fabric obnoví repliku služby. To vám pomůže otestovat konzistenci dat a to, jestli se stav služby po selhání správně udržuje. Druhá sada selhání (bezproblémová selhání) testuje, že služba správně reaguje na přesun replik service Fabric. To testuje zpracování zrušení v metodě RunAsync. Služba musí zkontrolovat nastavení tokenu zrušení, správně uložit jeho stav a ukončit metodu RunAsync.

Seznam akcí testovatelnosti

Akce Popis Spravované rozhraní API Rutina PowerShellu Elegantní/nevděčné chyby
CleanTestState Odebere veškerý stav testu z clusteru v případě chybného vypnutí testovacího ovladače. CleanTestStateAsync Remove-ServiceFabricTestState Neuvedeno
InvokeDataLoss Indukuje ztrátu dat do oddílu služby. InvokeDataLossAsync Invoke-ServiceFabricPartitionDataLoss Elegantní
InvokeQuorumLoss Převede daný oddíl stavové služby do ztráty kvora. InvokeQuorumLossAsync Invoke-ServiceFabricQuorumLoss Elegantní
Přesunoutprimární Přesune zadanou primární repliku stavové služby do zadaného uzlu clusteru. MovePrimaryAsync Move-ServiceFabricPrimaryReplica Elegantní
Přesunsecondary Přesune aktuální sekundární repliku stavové služby do jiného uzlu clusteru. MoveSecondaryAsync Move-ServiceFabricSecondaryReplica Elegantní
MoveInstance Přesune aktuální instanci bezstavové služby do jiného uzlu clusteru. MoveInstanceAsync Move-ServiceFabricInstance Elegantní
OdebratReplica Simuluje selhání repliky odebráním repliky z clusteru. Tím se replika zavře a převede se na roli Žádná, čímž se odebere veškerý její stav z clusteru. RemoveReplicaAsync Remove-ServiceFabricReplica Elegantní
RestartDeployedCodePackage Simuluje selhání procesu balíčku kódu restartováním balíčku kódu nasazeného na uzlu v clusteru. Tím se přeruší proces balíčku kódu, který restartuje všechny repliky uživatelských služeb hostované v tomto procesu. RestartDeployedCodePackageAsync Restart-ServiceFabricDeployedCodePackage Nevděčná
RestartNode Simuluje selhání uzlu clusteru Service Fabric restartováním uzlu. RestartNodeAsync Restart-ServiceFabricNode Nevděčná
RestartPartition Simuluje scénář výpadku datacentra nebo výpadku clusteru restartováním některých nebo všech replik oddílu. RestartPartitionAsync Restart-ServiceFabricPartition Elegantní
RestartReplica Simuluje selhání repliky restartováním trvalé repliky v clusteru, zavřením repliky a jejím opětovným otevřením. RestartReplicaAsync Restart-ServiceFabricReplica Elegantní
StartNode Spustí uzel v clusteru, který je již zastaven. StartNodeAsync Start-ServiceFabricNode Neuvedeno
StopNode Simuluje selhání uzlu zastavením uzlu v clusteru. Uzel zůstane mimo provoz, dokud se nezavolá StartNode. StopNodeAsync Stop-ServiceFabricNode Nevděčná
ValidateApplication Ověří dostupnost a stav všech služeb Service Fabric v rámci aplikace, obvykle po spuštění nějaké chyby v systému. ValidateApplicationAsync Test-ServiceFabricApplication Neuvedeno
ValidateService Ověří dostupnost a stav služby Service Fabric, obvykle po spuštění nějaké chyby v systému. ValidateServiceAsync Test-ServiceFabricService Neuvedeno

Spuštění akce testovatelnosti pomocí PowerShellu

V tomto kurzu se dozvíte, jak spustit akci testovatelnosti pomocí PowerShellu. Dozvíte se, jak spustit akci testovatelnosti v místním clusteru (jednom rámečku) nebo clusteru Azure. Microsoft.Fabric.Powershell.dll – modul Service Fabric PowerShell – se nainstaluje automaticky při instalaci msi Microsoft Service Fabric. Modul se načte automaticky při otevření příkazového řádku PowerShellu.

Segmenty kurzu:

Spuštění akce proti clusteru s jedním polem

Pokud chcete spustit akci testovatelnosti pro místní cluster, nejprve se připojte ke clusteru a otevřete příkazový řádek PowerShellu v režimu správce. Podívejme se na akci Restart-ServiceFabricNode .

Restart-ServiceFabricNode -NodeName Node1 -CompletionMode DoNotVerify

Tady se na uzlu s názvem "Node1" spouští akce Restart-ServiceFabricNode . Režim dokončení určuje, že by neměl ověřovat, jestli akce restart-node skutečně proběhla úspěšně. Určení režimu dokončení jako "Ověřit" způsobí, že se ověří, jestli akce restartování skutečně proběhla úspěšně. Místo přímého zadání uzlu podle jeho názvu ho můžete zadat prostřednictvím klíče oddílu a typu repliky, a to následujícím způsobem:

Restart-ServiceFabricNode -ReplicaKindPrimary  -PartitionKindNamed -PartitionKey Partition3 -CompletionMode Verify
$connection = "localhost:19000"
$nodeName = "Node1"

Connect-ServiceFabricCluster $connection
Restart-ServiceFabricNode -NodeName $nodeName -CompletionMode DoNotVerify

K restartování uzlu Service Fabric v clusteru by se měl použít restart ServiceFabricNode. Tím se zastaví proces Fabric.exe, který restartuje všechny repliky systémových a uživatelských služeb hostované na tomto uzlu. Použití tohoto rozhraní API k otestování služby pomáhá odhalit chyby v cestě obnovení převzetí služeb při selhání. Pomáhá simulovat selhání uzlů v clusteru.

Následující snímek obrazovky ukazuje příkaz Testability Restart-ServiceFabricNode v akci.

Snímek obrazovky se spuštěním příkazu Restart-ServiceFabricNode v PowerShellu

Výstup prvního modulu Get-ServiceFabricNode (rutina z modulu Service Fabric PowerShell) ukazuje, že místní cluster má pět uzlů: Node.1 až Node.5. Po spuštění akce testovatelnosti (rutina) Restart-ServiceFabricNode na uzlu s názvem Node.4 vidíme, že se resetovala doba provozu uzlu.

Spuštění akce proti clusteru Azure

Spuštění akce testovatelnosti (pomocí PowerShellu) v clusteru Azure se podobá spuštění akce v místním clusteru. Jediným rozdílem je, že před spuštěním akce se místo připojení k místnímu clusteru musíte nejprve připojit ke clusteru Azure.

Spuštění akce testovatelnosti pomocí jazyka C #

Pokud chcete spustit akci testovatelnosti pomocí jazyka C#, musíte se nejprve připojit ke clusteru pomocí FabricClient. Pak získejte parametry potřebné ke spuštění akce. Ke spuštění stejné akce je možné použít různé parametry. Při pohledu na akci RestartServiceFabricNode je jedním ze způsobů, jak ji spustit, použití informací o uzlu (název uzlu a ID instance uzlu) v clusteru.

RestartNodeAsync(nodeName, nodeInstanceId, completeMode, operationTimeout, CancellationToken.None)

Vysvětlení parametrů:

  • CompleteMode určuje, že by režim neměl ověřovat, jestli akce restartování skutečně proběhla úspěšně. Určení režimu dokončení jako "Ověřit" způsobí, že se ověří, jestli akce restartování skutečně proběhla úspěšně.
  • OperationTimeout nastaví dobu, po kterou se operace dokončí, než se vyvolá výjimka TimeoutException.
  • CancellationToken umožňuje zrušení čekajícího volání.

Místo toho, abyste uzel zadali přímo podle názvu, můžete ho zadat prostřednictvím klíče oddílu a typu repliky.

Další informace najdete v tématu PartitionSelector a ReplicaSelector.

// Add a reference to System.Fabric.Testability.dll and System.Fabric.dll
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Fabric.Testability;
using System.Fabric;
using System.Threading;
using System.Numerics;

class Test
{
    public static int Main(string[] args)
    {
        string clusterConnection = "localhost:19000";
        Uri serviceName = new Uri("fabric:/samples/PersistentToDoListApp/PersistentToDoListService");
        string nodeName = "N0040";
        BigInteger nodeInstanceId = 130743013389060139;

        Console.WriteLine("Starting RestartNode test");
        try
        {
            //Restart the node by using ReplicaSelector
            RestartNodeAsync(clusterConnection, serviceName).Wait();

            //Another way to restart node is by using nodeName and nodeInstanceId
            RestartNodeAsync(clusterConnection, nodeName, nodeInstanceId).Wait();
        }
        catch (AggregateException exAgg)
        {
            Console.WriteLine("RestartNode did not complete: ");
            foreach (Exception ex in exAgg.InnerExceptions)
            {
                if (ex is FabricException)
                {
                    Console.WriteLine("HResult: {0} Message: {1}", ex.HResult, ex.Message);
                }
            }
            return -1;
        }

        Console.WriteLine("RestartNode completed.");
        return 0;
    }

    static async Task RestartNodeAsync(string clusterConnection, Uri serviceName)
    {
        PartitionSelector randomPartitionSelector = PartitionSelector.RandomOf(serviceName);
        ReplicaSelector primaryofReplicaSelector = ReplicaSelector.PrimaryOf(randomPartitionSelector);

        // Create FabricClient with connection and security information here
        FabricClient fabricclient = new FabricClient(clusterConnection);
        await fabricclient.FaultManager.RestartNodeAsync(primaryofReplicaSelector, CompletionMode.Verify);
    }

    static async Task RestartNodeAsync(string clusterConnection, string nodeName, BigInteger nodeInstanceId)
    {
        // Create FabricClient with connection and security information here
        FabricClient fabricclient = new FabricClient(clusterConnection);
        await fabricclient.FaultManager.RestartNodeAsync(nodeName, nodeInstanceId, CompletionMode.Verify);
    }
}

PartitionSelector a ReplicaSelector

PartitionSelector

PartitionSelector je pomocná rutina vystavená při testování a slouží k výběru konkrétního oddílu, na kterém se mají provést některé z akcí testovatelnosti. Můžete ho použít k výběru konkrétního oddílu, pokud je ID oddílu předem známé. Nebo můžete zadat klíč oddílu a operace interně přeloží ID oddílu. Máte také možnost vybrat náhodný oddíl.

Chcete-li použít tuto pomocnou rutinu, vytvořte objekt PartitionSelector a vyberte oddíl pomocí jedné z metod Select*. Pak předejte objekt PartitionSelector rozhraní API, které ho vyžaduje. Pokud není vybraná žádná možnost, nastaví se jako výchozí náhodný oddíl.

Uri serviceName = new Uri("fabric:/samples/InMemoryToDoListApp/InMemoryToDoListService");
Guid partitionIdGuid = new Guid("8fb7ebcc-56ee-4862-9cc0-7c6421e68829");
string partitionName = "Partition1";
Int64 partitionKeyUniformInt64 = 1;

// Select a random partition
PartitionSelector randomPartitionSelector = PartitionSelector.RandomOf(serviceName);

// Select a partition based on ID
PartitionSelector partitionSelectorById = PartitionSelector.PartitionIdOf(serviceName, partitionIdGuid);

// Select a partition based on name
PartitionSelector namedPartitionSelector = PartitionSelector.PartitionKeyOf(serviceName, partitionName);

// Select a partition based on partition key
PartitionSelector uniformIntPartitionSelector = PartitionSelector.PartitionKeyOf(serviceName, partitionKeyUniformInt64);

ReplicaSelector

ReplicaSelector je pomocná rutina vystavená v testovatelnosti a slouží k výběru repliky, na které se má provést jakákoli z akcí testovatelnosti. Dá se použít k výběru konkrétní repliky, pokud je ID repliky předem známé. Kromě toho máte možnost vybrat primární repliku nebo náhodnou sekundární repliku. ReplicaSelector je odvozený z PartitionSelector, takže musíte vybrat repliku i oddíl, na kterém chcete provést operaci testovatelnosti.

Pokud chcete tuto pomocnou rutinu použít, vytvořte objekt ReplicaSelector a nastavte požadovaný způsob výběru repliky a oddílu. Pak ho můžete předat do rozhraní API, které ho vyžaduje. Pokud není vybraná žádná možnost, nastaví se jako výchozí náhodná replika a náhodný oddíl.

Guid partitionIdGuid = new Guid("8fb7ebcc-56ee-4862-9cc0-7c6421e68829");
PartitionSelector partitionSelector = PartitionSelector.PartitionIdOf(serviceName, partitionIdGuid);
long replicaId = 130559876481875498;

// Select a random replica
ReplicaSelector randomReplicaSelector = ReplicaSelector.RandomOf(partitionSelector);

// Select the primary replica
ReplicaSelector primaryReplicaSelector = ReplicaSelector.PrimaryOf(partitionSelector);

// Select the replica by ID
ReplicaSelector replicaByIdSelector = ReplicaSelector.ReplicaIdOf(partitionSelector, replicaId);

// Select a random secondary replica
ReplicaSelector secondaryReplicaSelector = ReplicaSelector.RandomSecondaryOf(partitionSelector);

Další kroky