لماذا لا تنقذك اختبارات الوحدة، ومتى تحتاج اختبارات 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
الفرق الرئيسي عن اختبارات الوحدة: اختبارات E2E تعمل مع واجهة المستخدم الحقيقية. إنها بطيئة، وهشة (تعتمد على محددات CSS)، لكنها لا تقدر بثمن للتحقق من سيناريوهات الأعمال الحرجة.
\n\nأدوات اختبار E2E لـ C#: Selenium مقابل Playwright
\n\nاختيار الأداة هو السؤال الأول الذي يواجه الفريق. دعنا ننظر إلى الخيارين الأكثر شيوعًا.
\n\nSelenium WebDriver
\nمعيار الصناعة. يعمل عبر WebDriver - عملية منفصلة تتحكم في المتصفح. يدعم جميع المتصفحات، مجتمع ضخم، آلاف الحلول الجاهزة. العيب: الإعداد يتطلب برامج تشغيل (ChromeDriver, GeckoDriver)، وقد تكون الاختبارات بطيئة بسبب الانتظار.
\n\nPlaywright لـ .NET
\nأداة أحدث، ولكنها بالفعل شائعة جدًا من Microsoft. تعمل مباشرة عبر بروتوكول DevTools، بدون طبقات وسيطة إضافية. أسرع، أكثر استقرارًا، تنتظر تلقائيًا تحميل العناصر (بدون Thread.Sleep صريح). تدعم ليس فقط المتصفحات، ولكن أيضًا المحاكيات المحمولة.
\n\nفي هذه المقالة، سنعرض أمثلة على كلا الإطارين حتى تتمكن من المقارنة.
\n\nكتابة أول اختبار E2E بلغة C#: Selenium
\n\nلنبدأ بالكلاسيكيات. قم بتثبيت الحزمة عبر NuGet:
\n\ndotnet add package Selenium.WebDriver\ndotnet add package Selenium.Support\ndotnet add package Selenium.WebDriver.ChromeDriver\n\nالآن لنكتب اختبارًا لموقع مثال (لنفترض أنه متجر إلكتروني). نريد التحقق من أنه بعد إضافة منتج إلى السلة، يظهر رمز بعدد المنتجات في الصفحة.
\n\nusing 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
المدونات
توصيات الكتب
اقرأ أيضًا