Akce testovatelnosti
Aby bylo možné simulovat nespolehlivou infrastrukturu, azure Service Fabric poskytuje vývojářům způsoby simulace různých skutečných selhání a přechodů stavu. Tyto akce jsou vystaveny jako akce testovatelnosti. Akce jsou rozhraní API nízké úrovně, která způsobují konkrétní injektáž selhání, přechod stavu nebo ověření. Kombinací těchto akcí můžete pro své služby psát komplexní testovací scénáře.
Service Fabric poskytuje 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ě vybrány k testování běžných přechodů stavu a případů selhání. Akce se ale dají použít k vytvoření vlastních testovacích scénářů, pokud chcete přidat pokrytí pro scénáře, které ještě nejsou pokryté integrovanými scénáři nebo které jsou přizpůsobené pro vaši aplikaci.
Implementace akcí jazyka C# se nacházejí v System.Fabric.dll sestavení. Modul System Fabric PowerShell se nachází v Microsoft.ServiceFabric.Powershell.dll sestavení. V rámci instalace modulu runtime se nainstaluje modul ServiceFabric PowerShell, který umožňuje snadné použití.
Elegantní vs. nesrácené chybné akce
Akce testovatelnosti jsou klasifikovány do dvou hlavních kontejnerů:
- Neřešivé chyby: Tyto chyby simulují selhání, jako jsou restartování počítače a chybové ukončení procesů. V takovýchpřípadechch To znamená, že před opětovným spuštěním aplikace nelze spustit žádné vyčištění stavu.
- Elegantní chyby: Tyto chyby simulují řádné akce, jako jsou přesuny a poklesy repliky aktivované vyrovnáváním zatížení. V takových případech služba obdrží oznámení o uzavření a může před ukončením vyčistit stav.
Kvůli lepšímu ověření kvality spusťte službu a obchodní úlohu a současně vynucujte různé elegantní a nedržující chyby. Nevrácené chyby se vypracují ve scénářích, kdy se proces služby náhle ukončí uprostřed určitého pracovního postupu. Tato operace otestuje cestu obnovení, jakmile service Fabric obnoví repliku služby. To vám pomůže otestovat konzistenci dat a to, jestli je stav služby po selhání správně zachován. Druhá sada selhání (graceful failures) testuje, že služba správně reaguje na repliky, které se přesouvají službou Service Fabric. Tento test zpracovává 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í/neschválné chyby |
---|---|---|---|---|
CleanTestState | Odebere z clusteru veškerý stav testu v případě chybného vypnutí testovacího ovladače. | CleanTestStateAsync | Remove-ServiceFabricTestState | Nelze použít |
InvokeDataLoss | Indukuje ztrátu dat do oddílu služby. | InvokeDataLossAsync | Invoke-ServiceFabricPartitionDataLoss | Elegantní |
InvokeQuorumLoss | Umístí daný oddíl stavové služby do ztráty kvora. | InvokeQuorumLossAsync | Invoke-ServiceFabricQuorumLoss | Elegantní |
MovePrimary | Přesune zadanou primární repliku stavové služby do zadaného uzlu clusteru. | MovePrimaryAsync | Move-ServiceFabricPrimaryReplica | Elegantní |
MoveSecondary | 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í |
RemoveReplica | Simuluje selhání repliky odebráním repliky z clusteru. Tím se replika zavře a převedou se na roli None (Žádná), čímž se odebere veškerý stav clusteru. | RemoveReplicaAsync | Remove-ServiceFabricReplica | Elegantní |
RestartDeployedCodePackage | Simuluje selhání procesu balíčku kódu restartováním balíčku kódu nasazeného v uzlu v clusteru. Tím se přeruší proces balíčku kódu, který restartuje všechny repliky služby uživatele hostované v tomto procesu. | RestartDeployedCodePackageAsync | Restart-ServiceFabricDeployedCodePackage | Ohavný |
RestartNode | Simuluje selhání uzlu clusteru Service Fabric restartováním uzlu. | RestartNodeAsync | Restart-ServiceFabricNode | Ohavný |
RestartPartition | Simuluje scénář výpadku datového centra 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 | Nelze použít |
StopNode | Simuluje selhání uzlu zastavením uzlu v clusteru. Uzel zůstane v výpadku, dokud se nevolá StartNode. | StopNodeAsync | Stop-ServiceFabricNode | Ohavný |
ValidateApplication | Ověří dostupnost a stav všech služeb Service Fabric v rámci aplikace, obvykle po vynucení určité chyby v systému. | ValidateApplicationAsync | Test-ServiceFabricApplication | Nelze použít |
ValidateService | Ověří dostupnost a stav služby Service Fabric, obvykle po vynucení určité chyby v systému. | ValidateServiceAsync | Test-ServiceFabricService | Nelze použít |
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 s místním clusterem (jedním rámečkem) nebo clusterem Azure. Microsoft.Fabric.Powershell.dll – modul Service Fabric PowerShellu – 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 rámečkem
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
Zde se akce Restart-ServiceFabricNode spouští na uzlu s názvem Node1. Režim dokončení určuje, že by neměl ověřit, zda akce restart-node skutečně proběhla úspěšně. Zadání režimu dokončení jako Ověření způsobí, že ověří, jestli akce restartování skutečně proběhla úspěšně. Místo přímého zadání uzlu podle názvu ho můžete zadat prostřednictvím klíče oddílu a typu repliky 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
Uzel Restart-ServiceFabricNode by se měl použít k restartování uzlu Service Fabric v clusteru. Tím se zastaví proces Fabric.exe, který restartuje všechny repliky systémové služby a uživatelské služby hostované na tomto uzlu. Použití tohoto rozhraní API k otestování služby pomáhá odhalit chyby v cestách zotavení po 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 Restartovat-ServiceFabricNode testability 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 provedení akce testability (rutina) Restart-ServiceFabricNode na uzlu s názvem Node.4 vidíme, že doba provozu uzlu byla resetována.
Spuštění akce s clusterem 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 místo připojení k místnímu clusteru se 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. Potom získejte parametry potřebné ke spuštění akce. Ke spuštění stejné akce je možné použít různé parametry. Když se podíváte na akci RestartServiceFabricNode, jedním ze způsobů, jak ji spustit, je použít informace 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 režim by neměl ověřit, zda akce restartování byla skutečně úspěšná. Zadání režimu dokončení jako Ověření způsobí, že ověří, jestli akce restartování skutečně proběhla úspěšně.
- OperationTimeout nastaví dobu dokončení operace před vyvoláním výjimky TimeoutException.
- CancellationToken umožňuje zrušení čekajícího volání.
Místo přímého zadání uzlu podle názvu ho můžete 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á testovatelností a slouží k výběru konkrétního oddílu, na kterém se má provést některý z akcí testovatelnosti. Pokud je ID oddílu předem známé, můžete ho použít k výběru konkrétního oddílu. 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, výchozí hodnota je 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 akce testovatelnosti. Můžete ho 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í. ReplikaSelector je odvozena z PartitionSelector, takže musíte vybrat repliku i oddíl, na kterém chcete provést operaci testovatelnosti.
Chcete-li použít tohoto pomocníka, vytvořte objekt ReplicaSelector a nastavte způsob, jakým chcete vybrat repliku a oddíl. Pak ho můžete předat do rozhraní API, které ho vyžaduje. Pokud není vybrána žádná možnost, výchozí hodnota je 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 testování
- Jak otestovat službu