گیرنده ها در مقابل توابع در سرو: بهترین عملی که باید بدانید

اخیراً مشاهده کرده ام که برخی از ما ، مهندسان اتوماسیون QA ، هنوز از آن استفاده می کنیم گیرنده در چارچوب اتوماسیون تست خود با سرو.
هنگام کار با مدل Object Object در Cypress (بله ، اگر برنامه وب شما بزرگ باشد ، می توانید از POM ها استفاده کنید ، دارای خدمات میکرو ، جبهه های میکرو و تنظیمات و تنظیمات زیادی است) ، ممکن است برای تعریف عنصر به دو روش روبرو شوید انتخاب کنندگان:
- گیرنده ها (
get
) ؛ - توابع (
method()
).
سرو متفاوت از سلنیوم و نمایشنامه نویس کار می کند
Cypress دستورات ناهمزمان را اجرا می کند ، به این معنی که .get () یک عنصر را بلافاصله مانند سلنیوم یا نمایشنامهنویس بازگرداند. در عوض ، دستورات سرو به یک صف داخلی اضافه می شوند و هنگامی که Cypress آنها را اجرا می کند ، به طور خودکار حل می شوند.
این بدان معنی است که گیرنده همانطور که انتظار می رفت هنگام تلاش برای تعامل با عناصر کار نمی کند.
نمونه ای از یک گیرنده (رویکرد نادرست در سرو)
class LoginPage {
get usernameField() {
//Cypress does NOT return an element immediately:
return cy.get('#username');
}
}
این کار شکست می خورد زیرا سرو یک مرجع فوری عنصر را بر نمی گرداند. در عوض ، یک شیء زنجیره ای سرو را برمی گرداند ، که نیاز به زنجیره ای بیشتر برای تعامل مانند دارد .type()
با .click()
، یا .should()
بشر در عوض ، آنها زنجیره ای از سرو را برمی گردانند که باید در صف فرمان Cypress حل شود.
چرا گیرنده عدم موفقیت در سرو
استفاده از گیرنده ها در Cypress مشکل ساز است زیرا:
- دستورات سرو بلافاصله حل نمی شوند
- Cypress Chains دستور می دهد و آنها را به صورت متوالی اجرا می کند. گیرنده سعی کنید بلافاصله یک عنصر را برگردانید ، که مدل اجرای Cypress را می شکند.
- گیرنده رفتار غیر منتظره ای ایجاد کنید
- از آنجا که دستورات سرو مقادیر واقعی را برمی گردانند ، مانند نوشتن
LoginPage.usernameField.type('testuser')
شکست خواهد خورد زیرا usernameField
یک عنصر فوری را بر نمی گرداند.
- عدم اجرای صریح
- سرو از یک رویکرد اعلانی پیروی می کند ، جایی که شما توصیف می کنید چه اتفاقی می افتد ، و Cypress اجرای آن را انجام می دهد. گیرنده دستورات Cypress را در داخل خصوصیات مخفی کنید و اشکال زدایی را سخت تر کنید.
رویکرد صحیح: به جای آن از توابع استفاده کنید
به جای گیرنده، انتخاب کننده های عنصر را به عنوان تعریف کنید توابعبشر این تضمین می کند که سرو قبل از تعامل با آنها به درستی منتظر عناصر است.
مدل شیء صفحه صحیح با رویکرد عملکرد
گزینه 1 – بازگشت دستور Cypress برای زنجیر
class LoginPage {
usernameField() {
return cy.get('#username');
}
passwordField() {
return cy.get('#password');
}
loginButton() {
return cy.get('#login');
}
}
اکنون می توانید از آن به درستی در تست های خود استفاده کنید:
const loginPage = new LoginPage();
loginPage.usernameField().type('testuser');
loginPage.passwordField().type('password');
loginPage.loginButton().click();
این رویکرد تضمین می کند که Cypress منتظر است تا عناصر قبل از انجام اقدامات در دسترس باشند.
بگذارید اینجا چیزی اضافه کنم و 1 مورد دیگر را توضیح دهم …
گزینه 2 – پاک کننده و بهتر – انجام یک عمل در داخل عملکرد
class LoginPage {
usernameField() {
//Works without return:
cy.get('#username').type("123");
}
}
بنابراین ، آیا شما استفاده می کنید return
یا نه؟
از بازگشت استفاده کنید وقتی:
- شما باید در یک آزمون چندین عمل انجام دهید (
.type()
با.clear()
با.should()
، و غیره). - بعداً می خواهید دستورات را زنجیر کنید.
از بازگشت استفاده نکنید:
عملکرد مستقیماً عملی را در داخل آن انجام می دهد (مانند .type("123")
).
فقط دو ردیف بعدی را مقایسه کنید و نگاه کنید که برای اسکریپت های تست شما بهتر و تمیزتر است.
// Option 1:
loginPage.usernameField().clear().type("testuser")
// Option 2:
loginPage.enterUsername("testuser")
مقایسه: گیرنده در مقابل توابع در سرو
چه موقع می تواند گیرنده در سرو کار می کنید؟
اگر از سلنیوم یا (به دلایلی) از نمایشنامه نویس مهاجرت می کنید ، هنوز هم ممکن است بخواهید از آن استفاده کنید گیرندهبشر سپس شما باید یک تابع را در داخل برگردانید گیرندهبشر با این حال ، این باعث پیچیدگی غیر ضروری می شود.
POM شما:
class LoginPage {
get usernameField() {
//This will work but unnecessary complexity:
return () => cy.get('#username');
}
}
آزمون شما:
loginPage.usernameField().type('testuser');
در حالی که این از نظر فنی کار می کند ، با استفاده از توابع مستقیماً یک راه حل تمیزتر است.
پایان
- اجتناب کردن گیرنده در Cypress Poms زیرا دستورات سرو عناصر فوری را برنمی گرداند.
- از توابع برای اطمینان از اجرای صحیح Cypress دستورات استفاده کرده و انتظار اتوماتیک را انجام می دهد.
- با جابجایی از گیرنده ها به توابع ، تست های Cypress پاک کننده و قابل حفظ تر را که از مدل اجرای آن پیروی می کنند ، می نویسید.
آیا تا به حال با گیرنده ها در Cypress با مشکلات روبرو شده اید یا فکر می کنید هنوز بهتر از استفاده از توابع است؟ افکار خود را در نظرات زیر رها کنید!
اطلاعات بیشتر در مورد زنجیره ای در پورتال رسمی Cypress را بررسی کنید