Udostępnij za pośrednictwem


Działania związane z testowalnością

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 są API niskiego poziomu, które powodują specyficzne wstrzykiwanie błędów, przejścia stanów 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ć obsługę scenariuszy, które nie są jeszcze zawarte we wbudowanych scenariuszach lub które są niestandardowo dostosowane do aplikacji.

Implementacje akcji w języku C# znajdują się w zestawie System.Fabric.dll. Moduł PowerShell 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 niegrzeczne działania w przypadku błędów

Działania testowe są klasyfikowane w dwóch głównych kategoriach:

  • 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.
  • Łagodne błędy: Te błędy symulują płynne akcje, takie jak przemieszczanie i usuwanie replik 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ługowe i biznesowe, wywołując jednocześnie różne łagodne i niełagodne błędy. Nieeleganckie błędy realizują scenariusze, w których proces usługi nagle kończy się w środku przepływu pracy. To testuje ścieżkę odzyskiwania po przywróceniu repliki usługi przez Service Fabric. Pomoże to przetestować spójność danych i sprawdzić, czy stan usługi jest prawidłowo utrzymywany po awariach. Drugi zestaw niepowodzeń (łagodnych niepowodzeń) sprawdza, czy usługa prawidłowo reaguje na przenoszenie replik przez Service Fabric. Ten test sprawdza obsługę anulowania w metodzie RunAsync. Usługa musi sprawdzić ustawiony token anulowania, poprawnie zapisać jego stan i zamknąć metodę RunAsync.

Lista akcji testowalności

Akcja Opis Zarządzany interfejs API Cmdlet programu PowerShell Łagodne/niełagodne błędy
CleanTestState Usuwa cały stan testu z klastra w przypadku nieprawidłowego zamknięcia sterownika testowego. CleanTestStateAsync Remove-ServiceFabricTestState Nie dotyczy
WywołajUtratęDanych Powoduje utratę danych w partycji usługi. InvokeDataLossAsync Wywołaj-UtratęDanychPartycjiServiceFabric Pełen wdzięku
InvokeQuorumLoss Umieszcza daną partycję usługi stanowej w stan utraty kworum. InvokeQuorumLossAsync Invoke-ServiceFabricQuorumLoss Pełen wdzięku
PrzenieśGłówne Przenosi określoną replikę podstawową usługi stanowej do określonego węzła klastra. MovePrimaryAsync Move-ServiceFabricPrimaryReplica Pełen wdzięku
Przesuń drugorzędny Przenosi obecną replikę pomocniczą usługi stanowej do innego węzła klastra. MoveSecondaryAsync Move-ServiceFabricSecondaryReplica Pełen wdzięku
PrzenieśInstancję Przenosi bieżące wystąpienie usługi bezstanowej do innego węzła klastra. MoveInstanceAsync Move-ServiceFabricInstance Pełen wdzięku
UsuńReplikę 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
Uruchom ponownie wdrożony pakiet kodu 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
PonowneUruchomieniePartycji 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 jest 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 StartNode. StopNodeAsync Stop-ServiceFabricNode Niegrzeczny
ZatwierdźAplikację 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ę testowalności przy użyciu programu PowerShell. Dowiesz się, jak uruchomić akcję testowalności względem lokalnego klastera (jednoskrzynkowego) lub klastera na platformie 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 lekcji:

Uruchom akcję wobec klastra jednoboxowego

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 na ścieżkach odzyskiwania po awarii. 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

Selektor partycji

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. Masz również możliwość wybrania przypadkowej partycji.

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 zapewniany w ramach testowalności i służy do wyboru repliki, na której mają być wykonywane dowolne działania testowalności. 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