0%
21-dars

Automation Strategiyasi

POM, Pytest, loyiha strukturasi β€” testlaringizni tartibga solish. Senior'lar foydalanayotgan yondashuv, sodda tushuntirilgan.

75 daqiqa
Python kod
6 ta interaktiv

Muammo: tartibsiz testlar

19 va 20-darslarda Selenium va Playwright o'rgandik. Bitta skript yozish oson. Lekin 50 ta test bo'lganda nima bo'ladi?

Tasavvur qiling: Login tugmasi IDsi o'zgardi. Sizda 50 ta test fayl bor, hammasida find_element(By.ID, "old-login") yozilgan. 50 ta joyda o'zgartirish kerak! Bu β€” tartibsiz testlarning muammosi.

πŸ’‘ Uy analogi
Tartibli uy vs tartibsiz uy
Tartibsiz uyda kiyimlar hamma joyda. Bir kiyim izlash β€” 10 daqiqa. Tartibli uyda β€” har narsa o'z joyida, 10 sekund. Automation ham xuddi shunday: kod tartibli bo'lsa β€” o'zgartirish oson, topish oson.

Yechim: Strategiya

Bu darsda 3 ta asosiy tushuncha o'rganamiz:

1

Page Object Model (POM)

Har sahifa uchun alohida "papka". Login tugmasi o'zgarsΠ° β€” faqat 1 joyda o'zgartirasiz.

2

Pytest Framework

Testlarni tartibli yozish va ishga tushirish uchun asbob. Terminal'dan barcha testlar bir buyruqda.

3

Loyiha Strukturasi

Fayllarni qayerda saqlash β€” pages/, tests/, conftest.py. Har narsa o'z joyida.

Page Object Model (POM)

POM β€” eng mashhur automation pattern. Google'dan tortib barcha katta kompaniyalar foydalanadi.

POM nima?

Page Object Model β€” har bir sahifa uchun alohida Python class. Sayt elementlari (locatorlar) va ular bilan ishlash metodlari shu classdΠ° yig'iladi.

Oddiy qilib: LoginPage degan class β€” login sahifasining hamma narsasini biladi. Test fayllar bu classni ishlatadi, lekin locatorlarni bilmaydi.

POM'siz (muammo)

❌ Yomon # test_login.py driver.find_element(By.ID, "email").send_keys("test@test.com") driver.find_element(By.ID, "password").send_keys("123") driver.find_element(By.ID, "login-btn").click() # test_checkout.py β€” xuddi shu locatorlar qayta! driver.find_element(By.ID, "email").send_keys("buyer@test.com") driver.find_element(By.ID, "password").send_keys("456") driver.find_element(By.ID, "login-btn").click() # "login-btn" β†’ "btn-login" o'zgarse: 20 ta faylda o'zgartiramiz!

POM bilan (yechim)

βœ… Yaxshi # pages/login_page.py β€” LoginPage class class LoginPage: def __init__(self, page): self.page = page def login(self, email, password): self.page.fill("#email", email) self.page.fill("#password", password) self.page.click("#login-btn") # test_login.py β€” faqat 1 qator! LoginPage(page).login("test@test.com", "123") # "login-btn" o'zgarse: FAQAT login_page.py da o'zgartiramiz!

POM afzalliklari

Asosiy qoida

1 sahifa = 1 class. LoginPage, ProductPage, CartPage, CheckoutPage. Test fayllar faqat bu classlarni chaqiradi, locatorlarni bilmaydi.

πŸ”„ Before / After

POM'siz vs POM bilan β€” farqni ko'ring

Bir xil vazifa β€” 2 xil yondashuv. Qaysi biri yaxshiroq ekanini o'zingiz baholang:

❌ POM'siz (10 ta test faylda)
driver.find_element( By.ID, "login-btn" ).click()
10 ta faylda xuddi shu kod takrorlanmoqda. "login-btn" o'zgarse β€” 10 ta faylda qidirasan!
βœ… POM bilan (1 joyda)
LoginPage(page).login( email, password )
"login-btn" o'zgarse β€” faqat LoginPage classida 1 qator o'zgartirish. Hammasi tayyor!

Pytest β€” testlarni ishlatish

Testlarni qo'lda ishlatish β€” python test_login.py. Lekin 50 ta test bo'lsa? Pytest β€” hammasini bir buyruqda ishlatadi.

Pytest nima?

Pytest β€” Python'da eng mashhur test framework. Testlarni topadi, ishlatadi, natijani chiroyli ko'rsatadi.

O'rnatish: pip install pytest pytest-playwright

Pytest qoidalari (3 ta)

test_rules.py # Qoida 1: Fayl nomi test_ bilan boshlanishi kerak # test_login.py βœ… β€” login.py ❌ # Qoida 2: Funksiya nomi test_ bilan boshlanishi kerak def test_login_success(): # βœ… ... def check_login(): # ❌ pytest topa olmaydi ... # Qoida 3: assert bilan tekshirish assert page.title() == "TestShop" # βœ… assert page.is_visible("text=Welcome") # βœ…

Birinchi Pytest testi

test_login.py from playwright.sync_api import Page def test_login_success(page: Page): page.goto("https://testshop.uz/login") page.fill("#email", "test@uzum.uz") page.fill("#password", "Pass123!") page.click("#login-btn") assert page.is_visible("text=Welcome") def test_login_wrong_password(page: Page): page.goto("https://testshop.uz/login") page.fill("#email", "test@uzum.uz") page.fill("#password", "XATO123") page.click("#login-btn") assert page.is_visible("text=Noto'g'ri parol")

Ishlatish β€” terminal

terminal # Barcha testlarni ishlatish pytest # Bitta faylni pytest test_login.py # Natijani batafsil ko'rish pytest -v # Playwright bilan (brauzer ko'rinadigan) pytest --headed

Fixture β€” brauzer setup

Fixture β€” har test oldidan bajariladigan tayyorgarlik. Masalan: brauzer ochish, login qilish.

conftest.py import pytest from playwright.sync_api import sync_playwright # Bu fixture har testdan oldin brauzer ochadi @pytest.fixture def page(): with sync_playwright() as p: browser = p.chromium.launch(headless=False) page = browser.new_page() yield page # Test shu yerda ishlaydi browser.close() # Test tugagach yopiladi
Sodda qoida

test_ bilan boshla (fayl va funksiya). assert bilan tekshir. pytest bilan ishga tushir. Shu 3 ta narsa yetarli!

Loyiha Strukturasi

Fayllarni qayerga saqlash? Professional automation loyihasi qanday ko'rinadi?

testshop-automation/ # Loyiha papkasi β”‚ β”œβ”€β”€ pages/ # Page Object'lar β”‚ β”œβ”€β”€ login_page.py # LoginPage class β”‚ β”œβ”€β”€ product_page.py # ProductPage class β”‚ └── cart_page.py # CartPage class β”‚ β”œβ”€β”€ tests/ # Test fayllar β”‚ β”œβ”€β”€ test_login.py # Login testlari β”‚ β”œβ”€β”€ test_products.py # Mahsulot testlari β”‚ └── test_cart.py # Savat testlari β”‚ β”œβ”€β”€ conftest.py # Fixture'lar (brauzer setup) β”œβ”€β”€ pytest.ini # Pytest sozlamalari └── requirements.txt # pip install -r requirements.txt

Har fayl nima qiladi?

🎯 Bog'lang

Tushuncha va ta'rifni bog'lang

Tushuncha

πŸ“„ Page Object Model
πŸ§ͺ Pytest
πŸ”§ Fixture
βš™οΈ conftest.py
βœ… assert

Ta'rif

Har testdan oldin bajariladigan tayyorgarlik (brauzer ochish)
Har sahifa uchun alohida class β€” locatorlar shu yerda
Natijani tekshirish β€” to'g'ri bo'lmasa test muvaffaqiyatsiz
Fixture'lar saqlanadigan maxsus fayl
Test fayllarni topib, ishga tushiradigan Python framework
0 / 5 juft
πŸ›  Code Builder

POM + Pytest kod yarating

Sahifani tanlang β€” tayyor Page Object class va test ko'ring:

🎬 Haqiqiy stsenariy
Uzum loyihasida testlar buzildi

Juma kuni, 16:00. Uzum saytida dizayn yangilandi. Barcha tugmalar ID'si o'zgardi: login-btn β†’ btn-login-v2. Sizda 80 ta automation test bor.

POM'siz yozilgan testlar: har faylda By.ID, "login-btn" bor.
POM bilan yozilgan testlar: faqat LoginPage classida.

Hozir soat 16:00 β€” release 18:00 da. Qancha vaqt ketadi?

To'g'ri tahlil qaysi?
⚑ Tezkor tekshiruv
Pytest ishga tushirildi β€” test_search.py fayl ichidagi check_results() funksiyasi topilmadi. Sababi?

POM loyiha yarating

3 ta qadam β€” professionallar kabi tartibli automation loyiha.

1

Papka strukturasini yarating

testshop-automation/ papkasi. Ichida pages/ va tests/ papkalar. conftest.py va requirements.txt fayllar.

2

LoginPage class yozing

pages/login_page.py β€” LoginPage class. login(email, password) metodi. 19 va 20-darsda yozgan locatorlarni shu yerga ko'chiring.

3

Pytest testlar yozing

tests/test_login.py β€” 3 ta test: muvaffaqiyatli login, xato parol, bo'sh maydon. pytest -v bilan ishga tushiring.

πŸ’‘ Portfolio uchun OLTIN

GitHub'da POM strukturali Pytest loyiha β€” bu Junior'larning 95%ida yo'q! Intervyu'da: "Mana pages/, tests/, conftest.py β€” POM pattern bilan yozganman" β€” bu Middle darajasidagi ko'nikmani ko'rsatadi.

Intervyu savollari

πŸ’‘ Har savol ustiga bosing β€” professional javobni ko'rasiz.

Q1Page Object Model nima va nima uchun kerak?+

Javob: "POM β€” har sahifa uchun alohida Python class. Sahifaning locatorlari va metodlari shu classda to'planadi."

Nima uchun kerak:

  • O'zgartirish oson β€” locator 1 joyda, 50 ta testda emas
  • Qayta ishlatish β€” LoginPage.login() har yerda
  • O'qish oson β€” test kodi toza

Pro javob: "Amalda ishlatganman. Testshop loyihasida LoginPage, ProductPage, CartPage class yaratdim. Locator o'zganda β€” faqat 1 faylda o'zgartirdim."

Q2Pytest nima va qanday ishlatiladi?+

Javob: "Pytest β€” Python'da eng mashhur test framework. Test fayllarni topadi, ishlatadi, natijani ko'rsatadi."

Qoidalar:

  • Fayl: test_*.py yoki *_test.py
  • Funksiya: test_ bilan boshlanadi
  • Tekshirish: assert bilan

Buyruqlar: pytest β€” hammasi, pytest -v β€” batafsil, pytest --headed β€” Playwright bilan brauzer ko'rinadigan.

Q3Fixture nima?+

Javob: "Fixture β€” har testdan oldin bajariladigan tayyorgarlik. Masalan, brauzer ochish, test bazasiga ulanish, login qilish."

Misol: conftest.py'da @pytest.fixture def page(): β€” har test funksiyasi page parametrini oladi, brauzer tayyor holda keladi.

Afzalligi: Har test faylida brauzer ochish kodi yozilmaydi β€” 1 joyda yoziladi, hammaga ishlaydi.

Q4Automation loyiha strukturasi qanday bo'lishi kerak?+

Javob:

  • pages/ β€” Page Object classlar (login_page.py, product_page.py)
  • tests/ β€” test fayllar (test_login.py, test_checkout.py)
  • conftest.py β€” fixture'lar (brauzer setup)
  • requirements.txt β€” kutubxonalar ro'yxati
  • pytest.ini β€” Pytest sozlamalari

Pro javob: "Men shu strukturani ishlataman. Yangi developer loyihaga kirsa β€” 5 daqiqada tushunadi."

Q5Test muvaffaqiyatsiz bo'lganda nima qilasiz?+

Javob: "Test xato berganda ketma-ket tekshiraman:"

  • Screenshot β€” Playwright'da page.screenshot() β€” test paytida nima ko'ringanini tekshiraman
  • Xato matni β€” AssertionError qaysi qatorda ekani
  • Locator β€” element hali ham sahifada bormi? ID o'zgarganmi?
  • Wait β€” element yuklanishini kutish yetarlimikin?
  • Playwright Trace β€” qadam-baqadam videoni ko'rish
Q6Automation tajribangizni aytib bering+

Pro javob (to'liq):

"Men Python + Playwright + Pytest bilan ishlashni o'rgandim. TestShop loyihasida automation framework yaratdim:"

  • Framework: Playwright (Python), Pytest
  • Pattern: Page Object Model β€” LoginPage, ProductPage, CartPage
  • Struktura: pages/, tests/, conftest.py
  • Testlar: Login, mahsulot ko'rish, savatga qo'shish
  • GitHub: Loyiha GitHub'da, README bilan

Bu β€” mening birinchi POM loyiham. Hozir Selenium bilan ham ishlashni bilaman, yangi loyihada Playwright tavsiya qilaman.

Q7POM'siz testlar bilan POM'li testlar farqi?+

Javob: "Amaliy farq β€” locator o'zganda:"

  • POM'siz: #login-btn 50 ta faylda bor. O'zgansa β€” 50 ta faylda qidirish. 1-2 soat ish.
  • POM bilan: #login-btn faqat LoginPage classida. O'zgansa β€” 1 qator. 1 daqiqa.

Ko'rinadigan farq (test fayl):

  • POM'siz: driver.find_element(By.ID, "login-btn").click()
  • POM bilan: LoginPage(page).login(email, password)

POM bilan test kodi nima qilayotganini ko'rsatadi, qanday qilayotganini emas.

3 ta asosiy fikr

Bu darsdan eslab qolishingiz kerak bo'lgan eng muhim g'oyalar

01
POM = 1 joyda
Locator o'zgansa β€” 1 faylda o'zgartirish. 50 ta faylda emas. Bu β€” POM'ning asosiy qiymati.
02
Pytest = test_ prefix
Fayl va funksiya test_ bilan boshlanadi. assert bilan tekshiradi. pytest buyrug'i hammani ishlatadi.
03
Tartib = Professionalizm
pages/, tests/, conftest.py. Har narsa o'z joyida. Bu β€” Junior va Middle'ni farqlovchi belgi.
πŸ† Darsni muvaffaqiyatli tugatdingiz!