اختبار E2E لـ C#: دليل لمن سئم من الأخطاء في بيئة الإنتاج

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

لماذا لا تنقذك اختبارات الوحدة، ومتى تحتاج اختبارات E2E

\n\n

تخيل: لقد كتبت كودًا مثاليًا بلغة C#. اختبارات الوحدة خضراء، التغطية 95%، مراجعة الكود تمت. تطلق الإصدار، والمستخدمون يكتبون: "زر 'إتمام الطلب' لا يعمل إذا كان في السلة أكثر من 3 منتجات". هل هذا مألوف؟

\n\n

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

\n\n

في هذه المقالة، لن نقدم النظرية فقط. بل سنعرض كيفية كتابة اختبارات E2E بلغة C# باستخدام Selenium و Playwright، وكيفية تنظيم الكود عبر نموذج Page Object، وكيفية دمج الاختبارات الآلية في CI/CD. هيا بنا.

\n\n

ما هو اختبار E2E لـ C# عمليًا

\n\n

اختبار E2E هو سيناريو يمر عبر مسار المستخدم بالكامل: من فتح الصفحة إلى إكمال الإجراء المستهدف (شراء، تسجيل، إرسال نموذج). بالنسبة لمطور C#، يعني هذا عادةً:

\n\n
    \n
  • تشغيل المتصفح (Chrome, Firefox, Edge) عبر WebDriver
  • \n
  • البحث عن العناصر في الصفحة (أزرار، حقول إدخال، روابط)
  • \n
  • تنفيذ الإجراءات (نقر، إدخال نص، اختيار من قائمة)
  • \n
  • التحقق من النتيجة المتوقعة (ظهور رسالة، تغيير URL، تحديث البيانات)
  • \n
  • إغلاق المتصفح وتنظيف بيانات الاختبار
  • \n
\n\n

الفرق الرئيسي عن اختبارات الوحدة: اختبارات E2E تعمل مع واجهة المستخدم الحقيقية. إنها بطيئة، وهشة (تعتمد على محددات CSS)، لكنها لا تقدر بثمن للتحقق من سيناريوهات الأعمال الحرجة.

\n\n

أدوات اختبار E2E لـ C#: Selenium مقابل Playwright

\n\n

اختيار الأداة هو السؤال الأول الذي يواجه الفريق. دعنا ننظر إلى الخيارين الأكثر شيوعًا.

\n\n

Selenium WebDriver

\n

معيار الصناعة. يعمل عبر WebDriver - عملية منفصلة تتحكم في المتصفح. يدعم جميع المتصفحات، مجتمع ضخم، آلاف الحلول الجاهزة. العيب: الإعداد يتطلب برامج تشغيل (ChromeDriver, GeckoDriver)، وقد تكون الاختبارات بطيئة بسبب الانتظار.

\n\n

Playwright لـ .NET

\n

أداة أحدث، ولكنها بالفعل شائعة جدًا من Microsoft. تعمل مباشرة عبر بروتوكول DevTools، بدون طبقات وسيطة إضافية. أسرع، أكثر استقرارًا، تنتظر تلقائيًا تحميل العناصر (بدون Thread.Sleep صريح). تدعم ليس فقط المتصفحات، ولكن أيضًا المحاكيات المحمولة.

\n\n

في هذه المقالة، سنعرض أمثلة على كلا الإطارين حتى تتمكن من المقارنة.

\n\n

كتابة أول اختبار E2E بلغة C#: Selenium

\n\n

لنبدأ بالكلاسيكيات. قم بتثبيت الحزمة عبر NuGet:

\n\n
dotnet add package Selenium.WebDriver\ndotnet add package Selenium.Support\ndotnet add package Selenium.WebDriver.ChromeDriver
\n\n

الآن لنكتب اختبارًا لموقع مثال (لنفترض أنه متجر إلكتروني). نريد التحقق من أنه بعد إضافة منتج إلى السلة، يظهر رمز بعدد المنتجات في الصفحة.

\n\n
using OpenQA.Selenium;\nusing OpenQA.Selenium.Chrome;\nusing OpenQA.Selenium.Support.UI;\n\npublic class CartE2ETests\n{\n    [Fact]\n    public void AddItemToCart_ShouldUpdateCartBadge()\n    {\n        using var driver = new ChromeDriver();\n        \n        // Arrange\n        driver.Navigate().GoToUrl("https://demo-store.com");\n        driver.Manage().Window.Maximize();\n        \n        // Act\n        var addToCartButton = driver.FindElement(By.CssSelector(".product-card .add-to-cart"));\n        addToCartButton.Click();\n        \n        // Wait for badge to appear\n        var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(5));\n        var cartBadge = wait.Until(drv => \n            drv.FindElement(By.CssSelector(".cart-badge")));\n        \n        // Assert\n        Assert.Equal("1", cartBadge.Text);\n        \n        driver.Quit();\n    }\n}
\n\n

المدونات

توصيات الكتب