Udostępnij za pośrednictwem


Akcje testowania

Aby zasymulować zawodną 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łędu, przejście stanu lub walidację. Łącząc te akcje, możesz napisać kompleksowe scenariusze testowe dla usług.

Usługa Service Fabric udostępnia niektóre typowe scenariusze testowe składające 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ł Programu PowerShell ServiceFabric jest instalowany w celu ułatwienia użycia.

Łaskawe a niegraceful działania błędów

Akcje testowania są klasyfikowane w dwóch głównych zasobnikach:

  • Nieprawidłowe błędy: te błędy symulują błędy, takie jak ponowne uruchamianie maszyny i awarie procesów. W takich przypadkach awarii kontekst wykonywania procesu nagle zatrzymuje się. Oznacza to, że nie można uruchomić oczyszczania stanu przed ponownym uruchomieniem aplikacji.
  • Bezproblemowe błędy: Te błędy symulują łagodne 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 wyjściem.

Aby uzyskać lepszą jakość weryfikacji, uruchom obciążenie usługi i firmy, jednocześnie inducing różnych bezproblemowych i niegrawernych błędów. Niegrabne błędy ćwiczą scenariusze, w których proces usługi nagle kończy się w środku niektórych przepływów 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ń (niepowodzeń wdzięku) 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ć jego stan i zamknąć metodę RunAsync.

Lista akcji testowania

Akcja opis Zarządzany interfejs API Polecenie cmdlet programu PowerShell Łaskawe/niegraceful błędy
CleanTestState Usuwa cały stan testu z klastra w przypadku nieprawidłowego zamknięcia sterownika testowego. CleanTestStateAsync Remove-ServiceFabricTestState Nie dotyczy
InvokeDataLoss Powoduje utratę danych w partycji usługi. InvokeDataLossAsync Invoke-ServiceFabricPartitionDataLoss Pełen wdzięku
InvokeQuorumLoss Umieszcza daną partycję usługi stanowej na utratę kworum. InvokeQuorumLossAsync Invoke-ServiceFabricQuorumLoss Pełen wdzięku
MovePrimary Przenosi określoną replikę podstawową usługi stanowej do określonego węzła klastra. MovePrimaryAsync Move-ServiceFabricPrimaryReplica Pełen wdzięku
MoveSecondary Przenosi bieżącą replikę pomocniczą usługi stanowej do innego węzła klastra. MoveSecondaryAsync Move-ServiceFabricSecondaryReplica Pełen wdzięku
MoveInstance Przenosi bieżące wystąpienie usługi bezstanowej do innego węzła klastra. MoveInstanceAsync Move-ServiceFabricInstance Pełen wdzięku
RemoveReplica Symuluje błąd repliki przez usunięcie repliki z klastra. Spowoduje to zamknięcie repliki i przeniesienie jej do roli "Brak", co spowoduje usunięcie całego stanu z klastra. RemoveReplicaAsync Remove-ServiceFabricReplica Pełen 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 Niegrzeczny
RestartNode Symuluje awarię węzła klastra usługi Service Fabric przez ponowne uruchomienie węzła. RestartNodeAsync Restart-ServiceFabricNode Niegrzeczny
RestartPartition Symuluje zaciemnienie centrum danych lub scenariusz zaciemnienia klastra przez ponowne uruchomienie niektórych lub wszystkich replik partycji. RestartPartitionAsync Restart-ServiceFabricPartition Pełen 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 Pełen 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 wyłączony do momentu wywołania węzła StartNode. StopNodeAsync Stop-ServiceFabricNode Niegrzeczny
ValidateApplication Weryfikuje dostępność i kondycję wszystkich usług Service Fabric w aplikacji, zwykle po utworzeniu błędu w systemie. ValidateApplicationAsync Test-ServiceFabricApplication Nie dotyczy
ValidateService Weryfikuje dostępność i kondycję usługi Service Fabric, zwykle po utworzeniu 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 lokalnego klastra (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 monitu 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 uzupełniania określa, że nie powinien sprawdzić, czy akcja ponownego uruchomienia węzła rzeczywiście powiodła się. Określenie trybu ukończenia jako "Weryfikacja" 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

Restart-ServiceFabricNode należy 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. Korzystanie z tego interfejsu API do testowania usługi pomaga wykrywać błędy wzdłuż ścieżek odzyskiwania trybu 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 zobaczymy, że czas działania węzła został zresetowany.

Uruchamianie akcji względem klastra platformy Azure

Uruchomienie 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 przed uruchomieniem akcji zamiast nawiązywania połączenia z klastrem lokalnym należy 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)

Objaś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 "Weryfikacja" 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 testach i służy do wybierania określonej partycji, na której ma być wykonywana dowolna akcja 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 to pomocnik 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ą. ReplicaSelector pochodzi z PartitionSelector, więc należy wybrać replikę 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