إجراءات قابلية الاختبار

من أجل محاكاة بنية أساسية غير موثوقة، يوفر لك Azure Service Fabric طرقاً لمحاكاة العديد من حالات الفشل في العالم الحقيقي وانتقالات الحالة. يتم الكشف عن هذه الإجراءات كإجراءات قابلية اختبار. الإجراءات هي واجهات برمجة التطبيقات منخفضة المستوى التي تسبب حقن خطأ معين أو انتقال الحالة أو التحقق من الصحة. من خلال الجمع بين هذه الإجراءات، يمكنك كتابة سيناريوهات اختبار شاملة لخدماتك.

يوفر Service Fabric بعض سيناريوهات الاختبار الشائعة التي تتكون من هذه الإجراءات. نوصي بشدة باستخدام هذه السيناريوهات المضمنة، والتي تم اختيارها بعناية لاختبار انتقالات الحالة الشائعة وحالات الفشل. ومع ذلك، يمكن استخدام الإجراءات لإنشاء سيناريوهات اختبار مخصصة عندما تريد إضافة تغطية للسيناريوهات التي لم تغطيها السيناريوهات المضمنة حتى الآن أو المخصصة خصيصاً للتطبيق الخاص بك.

تم العثور على عمليات تنفيذ C# للإجراءات في التجميع System.Fabric.dll. تم العثور على وحدة System Fabric PowerShell في تجميع Microsoft.ServiceFabric.Powershell.dll. كجزء من تثبيت وقت التشغيل، يتم تثبيت وحدة ServiceFabric PowerShell للسماح بسهولة الاستخدام.

إجراءات الخطأ الآمنة مقابل غير الآمنة

يتم تصنيف إجراءات قابلية الاختبار إلى مستودعين رئيسيين:

  • الأخطاء غير الآمنة: تحاكي هذه الأخطاء حالات الفشل مثل إعادة تشغيل الجهاز وأعطال العملية. في مثل هذه الحالات من الفشل، يتوقف سياق تنفيذ العملية فجأة. هذا يعني أنه لا يمكن تشغيل أي تنظيف للحالة قبل بدء تشغيل التطبيق مرة أخرى.
  • أخطاء آمنة: تحاكي هذه الأخطاء الإجراءات الآمنة مثل حركات النسخ المتماثلة والإسقاطات الناتجة عن موازنة التحميل. في مثل هذه الحالات، تتلقى الخدمة إخطاراً بالإغلاق ويمكنها تنظيف الحالة قبل الخروج.

للتحقق من الجودة بشكل أفضل، قم بتشغيل حمل عمل الخدمة والأعمال مع التسبب في العديد من الأخطاء الآمنة وغير الآمنة. سيناريوهات ممارسة الأخطاء غير الآمنة حيث يتم إنهاء عملية الخدمة فجأة في منتصف بعض مهام سير العمل. هذا يختبر مسار الاسترداد بمجرد استعادة النسخة المتماثلة للخدمة بواسطة Service Fabric. سيساعد ذلك في اختبار اتساق البيانات وما إذا كان يتم الحفاظ على حالة الخدمة بشكل صحيح بعد الفشل. تختبر المجموعة الأخرى من حالات الفشل (حالات الفشل الآمنة) أن الخدمة تتفاعل بشكل صحيح مع النسخ المتماثلة التي يتم نقلها بواسطة Service Fabric. هذا يختبر معالجة الإلغاء في أسلوب RunAsync. تحتاج الخدمة إلى التحقق من تعيين الرمز المميز للإلغاء، وحفظ حالته بشكل صحيح، والخروج من أسلوب RunAsync.

قائمة إجراءات قابلية الاختبار

إجراء الوصف واجهة برمجة التطبيقات المدارة PowerShell cmdlet أخطاء آمنة/غير آمنة
CleanTestState يزيل كل حالة الاختبار من نظام المجموعة في حالة إيقاف تشغيل إصدار تجريبي بشكل سيء. CleanTestStateAsync Remove-ServiceFabricTestState غير قابل للتطبيق
InvokeDataLoss يؤدي إلى فقدان البيانات في قسم خدمة. InvokeDataLossAsync Invoke-ServiceFabricPartitionDataLoss آمن
InvokeQuorumLoss يؤدي إلى فقدان الحصة لقسم خدمة ذي حالة خاصة. InvokeQuorumLossAsync Invoke-ServiceFabricQuorumLoss آمن
MovePrimary ينقل النسخة المتماثلة الأساسية المحددة لخدمة ذات حالة خاصة إلى عقدة نظام المجموعة المحددة. MovePrimaryAsync Move-ServiceFabricPrimaryReplica آمن
MoveSecondary ينقل النسخة المتماثلة الثانوية الحالية لخدمة ذات حالة خاصة إلى عقدة نظام مجموعة مختلفة. MoveSecondaryAsync Move-ServiceFabricSecondaryReplica آمن
MoveInstance نقل المثيل الحالي لخدمة عديمة الحالة إلى عقدة نظام مجموعة مختلفة. MoveInstanceAsync Move-ServiceFabricInstance آمن
RemoveReplica يحاكي فشل نسخة متماثلة عن طريق إزالة نسخة متماثلة من نظام مجموعة. سيؤدي ذلك إلى إغلاق النسخة المتماثلة ونقلها إلى دور "لا شيء"، وإزالة كل حالتها من نظام المجموعة. RemoveReplicaAsync Remove-ServiceFabricReplica آمن
RestartDeployedCodePackage يحاكي فشل عملية حزمة تعليمات برمجية عن طريق إعادة تشغيل حزمة تعليمات برمجية تم توزيعها على عقدة في نظام مجموعة. يؤدي هذا إلى إحباط عملية حزمة التعليمات البرمجية، والتي ستقوم بإعادة تشغيل جميع النسخ المتماثلة لخدمة المستخدم المستضافة في تلك العملية. RestartDeployedCodePackageAsync Restart-ServiceFabricDeployedCodePackage غير آمن
RestartNode يحاكي فشل عقدة نظام مجموعة Service Fabric عن طريق إعادة تشغيل عقدة. RestartNodeAsync Restart-ServiceFabricNode غير آمن
RestartPartition يحاكي سيناريو عدم إتاحة مركز بيانات أو نظام المجموعة عن طريق إعادة تشغيل بعض أو كل النسخ المتماثلة لقسم. RestartPartitionAsync Restart-ServiceFabricPartition آمن
RestartReplica يحاكي فشل نسخة متماثلة عن طريق إعادة تشغيل نسخة متماثلة مستمرة في نظام مجموعة، وإغلاق النسخة المتماثلة ثم إعادة فتحها. RestartReplicaAsync Restart-ServiceFabricReplica آمن
StartNode بدء تشغيل عقدة في نظام مجموعة تم إيقافه بالفعل. StartNodeAsync Start-ServiceFabricNode غير قابل للتطبيق
StopNode يحاكي فشل عقدة عن طريق إيقاف عقدة في نظام مجموعة. ستبقى العقدة معطلة حتى يتم استدعاء StartNode. StopNodeAsync Stop-ServiceFabricNode غير آمن
ValidateApplication التحقق من توفر وسلامة جميع خدمات Service Fabric داخل التطبيق، عادة بعد إحداث بعض الأخطاء في النظام. ValidateApplicationAsync Test-ServiceFabricApplication غير قابل للتطبيق
ValidateService التحقق من توفر وسلامة جميع خدمات Service Fabric داخل التطبيق، عادة بعد إحداث بعض الأخطاء في النظام. ValidateServiceAsync Test-ServiceFabricService غير قابل للتطبيق

تشغيل إجراء قابلية اختبار باستخدام PowerShell

يوضح لك هذا البرنامج التعليمي كيفية تشغيل إجراء قابلية اختبار باستخدام PowerShell. ستتعلم كيفية تشغيل إجراء قابلية اختبار ضد نظام مجموعة محلي (مربع واحد) أو نظام مجموعة Azure. يتم تثبيت Microsoft.Fabric.Powershell.dll--the Service Fabric PowerShell module-- تلقائياً عند تثبيت Microsoft Service Fabric MSI. يتم تحميل الوحدة تلقائياً عند فتح مطالبة PowerShell.

مقاطع البرنامج التعليمي:

تشغيل إجراء ضد نظام مجموعة من مربع واحد

لتشغيل إجراء قابلية اختبار ضد نظام مجموعة محلي، اتصل أولاً بنظام المجموعة وافتح مطالبة PowerShell في وضع المسؤول. دعونا نلقي نظرة على الإجراء Restart-ServiceFabricNode.

Restart-ServiceFabricNode -NodeName Node1 -CompletionMode DoNotVerify

هنا يتم تشغيل الإجراء Restart-ServiceFabricNode على عقدة تسمى "Node1". يحدد وضع الإكمال أنه لا ينبغي التحقق مما إذا كان إجراء عقدة إعادة التشغيل قد نجح بالفعل أم لا. سيؤدي تحديد وضع الإكمال على أنه "تحقق" إلى قيامه بالتحقق مما إذا كان إجراء إعادة التشغيل قد نجح بالفعل أم لا. بدلاً من تحديد العقدة مباشرة باسمها، يمكنك تحديدها عبر مفتاح قسم ونوع النسخة المتماثلة، على النحو التالي:

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

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

يجب استخدام Restart-ServiceFabricNode لإعادة تشغيل عقدة Service Fabric في نظام مجموعة. سيؤدي ذلك إلى إيقاف عملية Fabric.exe، والتي ستقوم بإعادة تشغيل كافة النسخ المتماثلة لخدمة النظام وخدمة المستخدم المستضافة على تلك العقدة. يساعد استخدام واجهة برمجة التطبيقات هذه لاختبار خدمتك في الكشف عن الأخطاء على طول مسارات استرداد تجاوز الفشل. يساعد على محاكاة حالات فشل العقدة في نظام المجموعة.

تعرض لقطة الشاشة التالية أمر قابلية الاختبار إعادة تشغيل-ServiceFabricNode أثناء العمل.

لقطة شاشة لتشغيل الأمر Restart-ServiceFabricNode في PowerShell.

يوضح إخراج Get-ServiceFabricNode الأول (الأمر cmdlet من الوحدة Service Fabric PowerShell) أن نظام المجموعة المحلي يحتوي على خمس عقد: Node.1 إلى Node.5. بعد تنفيذ إجراء قابلية الاختبار (الأمر cmdlet) Restart-ServiceFabricNode على العقدة، المسماة Node.4، نرى أنه تمت إعادة تعيين وقت تشغيل العقدة.

تشغيل إجراء ضد نظام مجموعة Azure

يشبه تشغيل إجراء قابلية اختبار (باستخدام PowerShell) ضد نظام مجموعة Azure تشغيل الإجراء ضد مجموعة نظام مجموعة محلي. الفرق الوحيد هو أنه قبل أن تتمكن من تشغيل الإجراء، بدلاً من الاتصال بنظام المجموعة المحلي، تحتاج إلى الاتصال بنظام مجموعة Azure أولاً.

تشغيل إجراء قابلية اختبار باستخدام C#‎

لتشغيل إجراء قابلية اختبار باستخدام C#، تحتاج أولاً إلى الاتصال بنظام المجموعة باستخدام FabricClient. ثم احصل على المعلمات اللازمة لتشغيل الإجراء. يمكن استخدام معلمات مختلفة لتشغيل نفس الإجراء. بالنظر إلى الإجراء RestartServiceFabricNode، تتمثل إحدى طرق تشغيله في استخدام معلومات العقدة (اسم العقدة ومعرف مثيل العقدة) في نظام المجموعة.

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

شرح المعلمة:

  • CompleteMode يحدد أنه لا ينبغي التحقق مما إذا كان إجراء عقدة إعادة التشغيل قد نجح بالفعل أم لا. سيؤدي تحديد وضع الإكمال على أنه "تحقق" إلى قيامه بالتحقق مما إذا كان إجراء إعادة التشغيل قد نجح بالفعل أم لا.
  • OperationTimeout يقوم بتعيين مقدار الوقت اللازم لإنهاء العملية قبل طرح استثناء TimeoutException.
  • يتيح CancellationToken بتمكين إلغاء مكالمة معلقة.

بدلاً من تحديد العقدة مباشرة باسمها، يمكنك تحديدها عبر مفتاح قسم ونوع النسخة المتماثلة.

لمزيد من المعلومات، راجع PartitionSelector و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 وReplicaSelector

PartitionSelector

PartitionSelector هو مساعد مكشوف في قابلية الاختبار ويستخدم لتحديد قسم معين لتنفيذ أي من إجراءات قابلية الاختبار. يمكن استخدامه لتحديد قسم معين إذا كان معرف القسم معروفاً مسبقاً. أو يمكنك توفير مفتاح القسم وستقوم العملية بحل معرف القسم داخلياً. لديك أيضاً خيار تحديد قسم عشوائي.

لاستخدام هذا المساعد، قم بإنشاء عنصر PartitionSelector وحدد القسم باستخدام إحدى أساليب Select*. ثم قم بإدخال عنصر PartitionSelector إلى واجهة برمجة التطبيقات التي تتطلب ذلك. إذا لم يتم تحديد أي خيار، يتم تعيينه افتراضياً إلى قسم عشوائي.

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 هو مساعد مكشوف في قابلية الاختبار ويستخدم للمساعدة في تحديد نسخة متماثلة لأداء أي من إجراءات قابلية الاختبار. يمكن استخدامه لتحديد نسخة متماثلة معينة إذا كان معرف النسخة المتماثلة معروفاً مسبقاً. بالإضافة إلى ذلك، لديك خيار تحديد نسخة متماثلة أساسية أو ثانوية عشوائية. ReplicaSelector مشتق من PartitionSelector، لذلك تحتاج إلى تحديد كل من النسخة المتماثلة والقسم الذي ترغب في إجراء عملية قابلية الاختبار عليه.

لاستخدام هذا المساعد، قم بإنشاء عنصر ReplicaSelector وقم بتعيين الطريقة التي تريد بها تحديد النسخة المتماثلة والقسم. يمكنك بعد ذلك تمريره إلى واجهة برمجة التطبيقات التي تتطلب ذلك. إذا لم يتم تحديد أي خيار، يتم تعيينه افتراضياً إلى قسم عشوائي ونسخة متماثلة عشوائية.

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

الخطوات التالية