أنماط المختبرين. وكيل (بديل)

قبل ذلك


مرحبًا أنا ديما ولا أعرف الأنماط. أما المختبر فلا يعني أنه إشكالي. كيف لأتمتة ..؟ حسنًا ، لنكن صادقين ، يمكنك أن تعيش أيضًا.

من غرف الدردشة والمؤتمرات والتواصل مع الزملاء ، من الواضح: النمط الرئيسي - PageObject - يتم تعلمه ، ما هو المطلوب أيضًا؟

وهنا كانت فقرة كبيرة من الأفكار حول لماذا لا نستخدم أنماط التصميم حقًا: ألا نعرفها ، أم أنها جيدة بدونها؟ كان هناك أيضًا تعميق في التاريخ بأن الأنماط ليست لك ، ولكن لعقود من الزمن أثبتت المعرفة والتقنيات والحجج التي ذكرها ورفاقه من الرفاق المعروفين الذين يعارضون.

ولكن ، في نهاية المطاف ، فإن معرفة الأنماط لن يضر بالتأكيد.

لذلك ، لا أحثك ​​أبدًا على تحريف القوالب في كل مكان إلى رمز ، أبدأ في نشر سلسلة من المقالات حول الأنماط.

المزيد عن التنسيق ودعونا نذهب


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

مهمة هذه المقالة والمقالات اللاحقة هي التحدث عن الأنماط لأولئك الذين يعملون بالفعل مع التعليمات البرمجية ، ولكن ليس لديهم قاعدة نظرية جيدة. لذلك ربما تكون هذه المقالات بالنسبة لي في المقام الأول.

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

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

ونعم ، سأكون سعيدًا جدًا بالنقد البناء في التعليقات.

هنا.

  • لنفسي - قال
  • ما سيقال - قال
  • لماذا - قال
  • لمن وكيف - قال

يمكنك البدء.



وكيل - وكيل - نائب


النظرية (قليلا)


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

كيف تفعل ذلك:

1. أنشئ واجهة باستخدام الطرق العامة للكائن الذي نريد استبداله
2. إنشاء فئة ذلك
- ينفذ هذه الواجهة
- لديه حق الوصول إلى الكائن الأصلي لاستدعاء أساليبه
3. أضف المنطق الخاص بك إلى أساليب الفئة التي تم إنشاؤها

تدرب


في الممارسة العملية ، يجب أن تكون أكثر وضوحا.

دانو: لدينا WebDriver. ولديه طريقة findElements (بواسطة) ؛

المهمة: أحتاج حقًا إلى تسجيل عدد العناصر التي تم العثور عليها بواسطة المحدد.
في كل مرة أتصل بالطريقة

driver.findElements(By.cssSelector(".item")); 

أريد أن أرى سجلاً في السجلات - كم عدد العناصر التي تم العثور عليها

الحل 1. على الجبين. ما هو موجود: استخدمته.
نأخذها فقط ونكتب مع كل مكالمة العدد الذي تم العثور عليه:

 List<WebElement> items = driver.findElements(By.cssSelector(".item")); logger.info("Found {} items", items.size()); 

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

الحل 2. نستخدم وكيل.
WebDriver هو واجهة. أعلن الأساليب ، ولكن لا يوجد تنفيذ. تتضمن عمليات التنفيذ ChromeWebDriver و FirefoxWebDriver وغير ذلك.

في الاختبارات ، لا يتعين علينا العمل مع أي فئة معينة للكروم أو سفاري. من الضروري فقط أن يقوم الفصل بتنفيذ واجهة WebDriver. سنفعل ذلك:

  1. نقوم بإنشاء واجهة مع الأساليب العامة للكائن الذي نريد استبداله
    في مثالنا ، توجد مثل هذه الواجهة بالفعل - WebDriver.
  2. إنشاء فئة
    - ينفذ هذه الواجهة
    - لديه حق الوصول إلى الكائن الأصلي لاستدعاء أساليبه
     public class LoggerWebDriver implements WebDriver{ private WebDriver driver; public void get(String s) { } public List<WebElement> findElements(By by) { return null; } public WebElement findElement(By by) { return null; } //     } 
  3. أضف منطقك إلى أساليب الفصل الذي تم إنشاؤه
     public class LoggerWebDriver implements WebDriver { private WebDriver driver; private final Logger logger = LogManager.getLogger(LoggerWebDriver.class); LoggerWebDriver() { //    . // , ()     this.driver = new ChromeDriver(); } public void get(String var1) { driver.get(var1); } public List<WebElement> findElements(By var1) { List<WebElement> items = driver.findElements(var1); logger.info("Selector {}. Found {} elements", var1.toString(), items.size()); return items; } public WebElement findElement(By var1) { return driver.findElement(var1); } //     } 

ماذا حدث

تمت إضافته إلى الفصل الدراسي

 private WebDriver driver; 

هذا هو نفس الكائن الذي نريد استبداله. إنها أساليبه التي سوف نطلق عليها المزيد.

الآن ، يمكنك أن تنظر ، على سبيل المثال ، إلى الطريقة

 public void get(String var1) { driver.get(var1); } 

كل ما تفعله هذه الطريقة هو استدعاء get () على برنامج التشغيل الحقيقي.

وهذه هي الطريقة

 public List<WebElement> findElements(By var1) { List<WebElement> items = driver.findElements(var1); logger.info("Selector {}. Found {} elements", var1.toString(), items.size()); return items; } 

لقد توسعت حسب مهمتنا.

هذا كل ما يمكنك استخدامه في الاختبارات:

 WebDriver driver = new LoggerWebDriver(); driver.get("http://google.com"); List<WebElement> items = driver.findElements(By.cssSelector("a")); // => Selector By.cssSelector: a. Found 48 elements 



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

الآن بعد أن عرفنا نمطًا آخر ، دعني أذكرك أنه عندما تكون المطرقة في يدك ، يبدو أن كل شيء من حولنا هو أظافر. فقط ضع ذلك في الاعتبار.

Source: https://habr.com/ru/post/ar414253/


All Articles