Class-lar və OOP əsasları
Class — data (sahələr) və davranışı (metodlar) bir yerdə saxlayan şablondur. Test avtomatlaşdırmasında class-ların əsas istifadə yeri Page Object Model-dir: hər səhifə bir class, locator-lar sahələr, istifadəçi əməliyyatları isə metodlar kimi.
Əsas elementlər:
class LoginPage { ... }— elanconstructor(page)— obyekt yaradılanda bir dəfə işləyən quraşdırma;new LoginPage(page)çağırışında icra olunur- Metodlar —
async login(user, pass) { ... } - Sahələr —
this.email = ... - Private sahə —
#token(JavaScript-in özündə) və yaprivate token(TypeScript-də): xaricdən müraciət qadağandır staticüzvlər — instansiya olmadan class üzərindən çağırılır:TestData.defaultUser()
| Konstruksiya | Nə edir | POM-da nümunə |
|---|---|---|
| constructor(page) | obyekt yaradılanda locator-ları hazırlayır | this.submit = page.getByRole('button') |
| extends / super() | başqa class-dan miras alır; super() valideyn constructor-u çağırır | class LoginPage extends BasePage |
| #privateField | yalnız class daxilində görünür | #baseUrl — testlər ona toxuna bilmir |
| static metod | instansiya olmadan çağırılır | TestUser.random() |
| arrow class field | this-i həmişəlik instansiyaya bağlayır | get = (path) => fetch(...) |
Miras (inheritance) və ya kompozisiya?
Miras — "X bir növ Y-dir" münasibəti: LoginPage extends BasePage. Faydası açıqdır (ümumi open(), waitForLoad() metodları bir yerdə), amma dərin iyerarxiya (3+ səviyyə) POM-u ağırlaşdırır: metodun harada təyin olunduğunu tapmaq çətinləşir, valideyndəki dəyişiklik gözlənilmədən bütün səhifələri sındırır.
Kompozisiya — "X-in içində Y var" münasibəti: LoginPage daxilində this.header = new HeaderComponent(page). Təkrar istifadə olunan UI komponentləri (header, modal, cədvəl, filtr paneli) üçün məhz kompozisiya düzgün seçimdir.
Praktik qayda: bir səviyyə BasePage mirası + qalan hər şey kompozisiya. Bu, əksər komandalarda işləyən balansdır.
`this` tələsi — interview-də çox verilən mövzu. Metodu obyektindən ayırıb callback kimi ötürəndə (items.map(api.get)) this itir və undefined olur. Üç həll: arrow ilə bürümək (p => api.get(p)), api.get.bind(api) və ya class field-i arrow kimi yazmaq (get = (p) => ...).
POM üçün ikinci vacib qayda: page object metodları assertion yox, əməliyyat qaytarmalıdır. Assertion-lar test faylında qalsın — belə olanda test nə yoxladığını oxuyanda görünür.
📚 Mənbələr və sənədlər
- Class-larrəsmideveloper.mozilla.org
- Prototip zənciri və mirasrəsmideveloper.mozilla.org