Akcje testowania

Aby zasymulować niewiarygodną infrastrukturę, usługa Azure Service Fabric udostępnia deweloperowi sposoby symulowania różnych rzeczywistych awarii i przejść stanu. Są one widoczne jako akcje testowania. Akcje to interfejsy API niskiego poziomu, które powodują określone wstrzyknięcie błędów, przejście stanu lub walidację. Łącząc te akcje, możesz napisać kompleksowe scenariusze testowe dla usług.

Usługa Service Fabric udostępnia kilka typowych scenariuszy testowych składających się z tych akcji. Zdecydowanie zalecamy korzystanie z tych wbudowanych scenariuszy, które są starannie wybierane do testowania typowych przejść stanu i przypadków awarii. Jednak akcje mogą służyć do tworzenia niestandardowych scenariuszy testowych, gdy chcesz dodać pokrycie dla scenariuszy, które nie są jeszcze objęte wbudowanymi scenariuszami lub które są niestandardowe dostosowane do aplikacji.

Implementacje akcji w języku C# znajdują się w zestawie System.Fabric.dll. Moduł Programu PowerShell usługi System Fabric znajduje się w zestawie Microsoft.ServiceFabric.Powershell.dll. W ramach instalacji środowiska uruchomieniowego moduł ServiceFabric programu PowerShell jest instalowany w celu ułatwienia użycia.

Łaskawe a niegraceful akcji błędów

Akcje testowania są klasyfikowane na dwa główne zasobniki:

  • Niegrabne błędy: te błędy symulują awarie, takie jak ponowne uruchamianie maszyny i awarie procesów. W takich przypadkach awarii kontekst wykonywania procesu nagle przestaje działać. Oznacza to, że nie można uruchomić oczyszczania stanu przed ponownym uruchomieniem aplikacji.
  • Bezproblemowe błędy: Te błędy symulują bezproblemowe akcje, takie jak ruchy repliki i spadki wyzwalane przez równoważenie obciążenia. W takich przypadkach usługa otrzymuje powiadomienie o zamknięciu i może wyczyścić stan przed zamknięciem.

Aby uzyskać lepszą jakość weryfikacji, uruchom obciążenie usługi i firmy, jednocześnie inducing różnych dziękujących i niegrawernych błędów. Niegracyjne błędy ćwiczenia scenariusze, w których proces usługi nagle kończy się w środku pewnego przepływu pracy. Spowoduje to przetestowanie ścieżki odzyskiwania po przywróceniu repliki usługi przez usługę Service Fabric. Pomoże to przetestować spójność danych i sprawdzić, czy stan usługi jest prawidłowo utrzymywany po awariach. Drugi zestaw niepowodzeń (dziękujących awarii) sprawdza, czy usługa prawidłowo reaguje na repliki przenoszone przez usługę Service Fabric. Ta obsługa testów anulowania w metodzie RunAsync. Usługa musi sprawdzić ustawiony token anulowania, poprawnie zapisać stan i zamknąć metodę RunAsync.

Lista akcji testowania

Akcja Opis Zarządzany interfejs API Polecenie cmdlet programu PowerShell Łaskawe/niegrawerne błędy
CleanTestState Usuwa cały stan testu z klastra w przypadku nieprawidłowego zamknięcia sterownika testowego. CleanTestStateAsync Remove-ServiceFabricTestState Nie dotyczy
InvokeDataLoss Indukuje utratę danych do partycji usługi. InvokeDataLossAsync Invoke-ServiceFabricPartitionDataLoss Wdzięku
InvokeQuorumLoss Umieszcza daną partycję usługi stanowej na utratę kworum. InvokeQuorumLossAsync Invoke-ServiceFabricQuorumLoss Wdzięku
MovePrimary Przenosi określoną replikę podstawową usługi stanowej do określonego węzła klastra. MovePrimaryAsync Move-ServiceFabricPrimaryReplica Wdzięku
MoveSecondary Przenosi bieżącą replikę pomocniczą usługi stanowej do innego węzła klastra. MoveSecondaryAsync Move-ServiceFabricSecondaryReplica Wdzięku
MoveInstance Przenosi bieżące wystąpienie usługi bezstanowej do innego węzła klastra. MoveInstanceAsync Move-ServiceFabricInstance Wdzięku
RemoveReplica Symuluje błąd repliki przez usunięcie repliki z klastra. Spowoduje to zamknięcie repliki i przejście jej do roli "Brak", co spowoduje usunięcie całego stanu z klastra. RemoveReplicaAsync Remove-ServiceFabricReplica Wdzięku
RestartDeployedCodePackage Symuluje niepowodzenie procesu pakietu kodu przez ponowne uruchomienie pakietu kodu wdrożonego w węźle w klastrze. Spowoduje to przerwanie procesu pakietu kodu, który spowoduje ponowne uruchomienie wszystkich replik usługi użytkownika hostowanych w tym procesie. RestartDeployedCodePackageAsync Restart-ServiceFabricDeployedCodePackage Niegrzeczne
RestartNode Symuluje awarię węzła klastra usługi Service Fabric przez ponowne uruchomienie węzła. RestartNodeAsync Restart-ServiceFabricNode Niegrzeczne
RestartPartition Symuluje zaciemnienie centrum danych lub scenariusz zaciemnienia klastra przez ponowne uruchomienie niektórych lub wszystkich replik partycji. RestartPartitionAsync Restart-ServiceFabricPartition Wdzięku
RestartReplica Symuluje błąd repliki przez ponowne uruchomienie utrwalonej repliki w klastrze, zamknięcie repliki, a następnie ponowne otwarcie jej. RestartReplicaAsync Restart-ServiceFabricReplica Wdzięku
StartNode Uruchamia węzeł w klastrze, który został już zatrzymany. StartNodeAsync Start-ServiceFabricNode Nie dotyczy
StopNode Symuluje awarię węzła przez zatrzymanie węzła w klastrze. Węzeł pozostanie w dół do momentu wywołania węzła StartNode. StopNodeAsync Stop-ServiceFabricNode Niegrzeczne
ValidateApplication Weryfikuje dostępność i kondycję wszystkich usług Service Fabric w aplikacji, zwykle po wystąpieniu błędu w systemie. ValidateApplicationAsync Test-ServiceFabricApplication Nie dotyczy
ValidateService Weryfikuje dostępność i kondycję usługi Service Fabric, zwykle po wystąpieniu błędu w systemie. ValidateServiceAsync Test-ServiceFabricService Nie dotyczy

Uruchamianie akcji testowania przy użyciu programu PowerShell

W tym samouczku pokazano, jak uruchomić akcję testowania przy użyciu programu PowerShell. Dowiesz się, jak uruchomić akcję testowania względem klastra lokalnego (jedno box) lub klastra platformy Azure. Microsoft.Fabric.Powershell.dll — moduł programu PowerShell usługi Service Fabric jest instalowany automatycznie podczas instalowania pliku MSI usługi Microsoft Service Fabric. Moduł jest ładowany automatycznie po otwarciu wiersza polecenia programu PowerShell.

Segmenty samouczków:

Uruchamianie akcji względem klastra jedno box

Aby uruchomić akcję testowania względem klastra lokalnego, najpierw połącz się z klastrem i otwórz wiersz polecenia programu PowerShell w trybie administratora. Przyjrzyjmy się akcji Restart-ServiceFabricNode .

Restart-ServiceFabricNode -NodeName Node1 -CompletionMode DoNotVerify

W tym miejscu akcja Restart-ServiceFabricNode jest uruchamiana w węźle o nazwie "Node1". Tryb ukończenia określa, że nie powinien sprawdzić, czy akcja ponownego uruchomienia węzła rzeczywiście powiodła się. Określenie trybu ukończenia jako "Weryfikuj" spowoduje sprawdzenie, czy akcja ponownego uruchomienia rzeczywiście zakończyła się pomyślnie. Zamiast bezpośrednio określać węzeł według jego nazwy, można określić go za pomocą klucza partycji i rodzaju repliki w następujący sposób:

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

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

Element Restart-ServiceFabricNode powinien służyć do ponownego uruchomienia węzła usługi Service Fabric w klastrze. Spowoduje to zatrzymanie procesu Fabric.exe, który spowoduje ponowne uruchomienie wszystkich replik usługi systemowej i usługi użytkownika hostowanych w tym węźle. Testowanie usługi przy użyciu tego interfejsu API pomaga wykrywać błędy wzdłuż ścieżek odzyskiwania w trybie failover. Pomaga symulować błędy węzłów w klastrze.

Poniższy zrzut ekranu przedstawia polecenie Restart-ServiceFabricNode testability w akcji.

Zrzut ekranu przedstawiający uruchamianie polecenia Restart-ServiceFabricNode w programie PowerShell.

Dane wyjściowe pierwszego węzła Get-ServiceFabricNode (polecenie cmdlet z modułu programu PowerShell usługi Service Fabric) pokazują, że klaster lokalny ma pięć węzłów: Node.1 do Node.5. Po wykonaniu akcji testowania (cmdlet) Restart-ServiceFabricNode w węźle o nazwie Node.4 widzimy, że czas działania węzła został zresetowany.

Uruchamianie akcji względem klastra platformy Azure

Uruchamianie akcji testowania (przy użyciu programu PowerShell) względem klastra platformy Azure jest podobne do uruchamiania akcji względem klastra lokalnego. Jedyną różnicą jest to, że zanim będzie można uruchomić akcję, zamiast łączyć się z klastrem lokalnym, musisz najpierw nawiązać połączenie z klastrem platformy Azure.

Uruchamianie akcji testowania przy użyciu języka C #

Aby uruchomić akcję testowania przy użyciu języka C#, najpierw musisz nawiązać połączenie z klastrem przy użyciu elementu FabricClient. Następnie uzyskaj parametry potrzebne do uruchomienia akcji. Do uruchomienia tej samej akcji można użyć różnych parametrów. Patrząc na akcję RestartServiceFabricNode, jednym ze sposobów jego uruchomienia jest użycie informacji o węźle (nazwa węzła i identyfikator wystąpienia węzła) w klastrze.

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

Wyjaśnienie parametru:

  • CompleteMode określa, że tryb nie powinien weryfikować, czy akcja ponownego uruchomienia rzeczywiście powiodła się. Określenie trybu ukończenia jako "Weryfikuj" spowoduje sprawdzenie, czy akcja ponownego uruchomienia rzeczywiście zakończyła się pomyślnie.
  • Parametr OperationTimeout określa czas zakończenia operacji przed zgłoszeniem wyjątku TimeoutException.
  • CancellationToken umożliwia anulowanie oczekującego wywołania.

Zamiast bezpośrednio określać węzeł według jego nazwy, można określić go za pomocą klucza partycji i rodzaju repliki.

Aby uzyskać więcej informacji, zobacz PartitionSelector i 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 i ReplicaSelector

PartitionSelector

PartitionSelector to pomocnik uwidoczniony w możliwości testowania i służy do wybierania określonej partycji, na której ma być wykonywana dowolna z akcji testowania. Można go użyć do wybrania określonej partycji, jeśli identyfikator partycji jest wcześniej znany. Możesz też podać klucz partycji, a operacja rozwiąże identyfikator partycji wewnętrznie. Możesz również wybrać partycję losową.

Aby użyć tego pomocnika, utwórz obiekt PartitionSelector i wybierz partycję przy użyciu jednej z metod Select*. Następnie przekaż obiekt PartitionSelector do interfejsu API, który go wymaga. Jeśli nie wybrano żadnej opcji, domyślnie jest to partycja losowa.

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 jest pomocnikiem uwidoczniony w możliwości testowania i służy do wybierania repliki, na której mają być wykonywane dowolne akcje testowania. Można go użyć do wybrania określonej repliki, jeśli identyfikator repliki jest wcześniej znany. Ponadto można wybrać replikę podstawową lub losową pomocniczą. Funkcja ReplicaSelector pochodzi z klasy PartitionSelector, dlatego należy wybrać zarówno replikę, jak i partycję, na której chcesz wykonać operację testowania.

Aby użyć tego pomocnika, utwórz obiekt ReplicaSelector i ustaw sposób wybierania repliki i partycji. Następnie możesz przekazać go do interfejsu API, który go wymaga. Jeśli nie wybrano żadnej opcji, domyślnie jest to losowa replika i partycja losowa.

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);

Następne kroki