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.
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
- Scénáře testovatelnosti
- Jak otestovat službu