Agar siz yugurgan bo'lsangiz
Men eng yaxshi natijalarga erishish uchun ba'zi maslahatlar va tavsiyalarni bilish uchun Python sinovlarini avtomatlashtirish loyihalarida etarlicha uzoq vaqt ishladim. Python testini samarali avtomatlashtirish uchun sizga ishonishingiz mumkin bo'lgan ettita maslahat va amaliyotni baham ko'raman.
1. Loyihangiz spetsifikatsiyalari asosida to'g'ri test avtomatizatsiya tizimini tanlang.
Python o'zining o'rnatilgan test avtomatlashtirish tizimi, Unittest bilan birga keladi. Ammo bu kichik loyihalar uchun eng yaxshisidir. Agar siz kichik va yirik loyihalarda ishlashga imkon beruvchi sinovni avtomatlashtirish tizimini istasangiz, Pytest eng yaxshi variant.
Pytest ko'proq boshqariladigan va kengaytiriladigan test avtomatizatsiyasi uchun test holatlarini yozishning tuzilgan va samarali usulini taqdim etadi. Shuningdek, u eng oddiy sintaksis va eng keng qamrovli plagin ekotizimiga ega. Masalan, parallel testni bajarish uchun pytest-xdist dan foydalanishingiz mumkin. Bundan tashqari, siz Pytest-da Unittest yoki Nose 2-da yozgan test holatlarini ishga tushirishingiz mumkin.
Agar siz ko'proq robot jarayonini avtomatlashtirsangiz (
Agar siz xulq-atvorga asoslangan rivojlanish (BDD) bilan shug'ullanadigan jamoada ishlasangiz, Behave eng yaxshi ramka hisoblanadi. Texnik bo'lmagan manfaatdor tomonlar tushuna oladigan Behave-da test holatlarini yozish juda oson.
Men sizga har qanday aloqa to'siqlarini oldini olish uchun jamoangiz foydalanadigan texnologik stekga mos keladigan ramka tanlashni maslahat beraman. Ammo agar siz yakkaxon ishlayotgan bo'lsangiz, Pytest eng ko'p qirrali va tez-tez ishlatiladigan ramka hisoblanadi.
2. Vaqt bilan bog'liq muammolarni hal qilish uchun Selenium'da WebDriverWait-dan foydalaning.
Men Pytestni veb-sinov uchun Selenium bilan integratsiya qilishingiz mumkinligini aytdim. Pytest funktsional sinov uchun ajoyib bo'lsa-da, Selenium veb-avtomatlashtirishni butunlay yangi darajaga olib chiqadi. Selenium brauzerni avtomatlashtirishning kuchli imkoniyatlariga ega, ayniqsa WebDriver kutubxonasi bilan.
Selenium-da testlarni o'tkazganingizda, tizim elementlarning joylashuvini aniqlashda ishlayotgani uchun ma'lum vaqtni kutishingiz kerak. Bu vaqt o'tgandan keyin, aytaylik, 10 soniya, haydovchi ishdan chiqadi. Yashirin kutish muammosi, deyilganidek, turli elementlar uchun har xil kutish vaqtlari kerak.
Shunday qilib, yashirin kutishlarga tayanmaslik o'rniga, elementlar interaktiv bo'lishidan oldin bajarilishi kerak bo'lgan muayyan shartlarni yaratish uchun WebDriverWait-dan expect_conditions bilan birgalikda foydalaning.
from selenium import webdriver from Selenium.webdriver.common.by import By from Selenium.webdriver.support.ui import WebDriverWait from Selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome() driver.get("https://example.com") # Wait for the element to be clickable wait = WebDriverWait(driver, 10) element = wait.until(EC.element_to_be_clickable((By.ID, "clickableElementId"))) element.click() # Perform action after the element is ready driver.quit()
Agar sizning testlaringiz doimo muvaffaqiyatsiz bo'lsa, bu veb-ilovada muammo borligini anglatmasligi mumkin. Bu shunchaki ilova kodi yoki foydalanuvchi interfeysidagi ba'zi o'zgarishlar tufayli bo'lishi mumkin. Sinovdagi nosozliklar tufayli ortiqcha nosozliklarni tuzatishning oldini olish uchun veb-elementlarni aniq aniqlash uchun noyob identifikatorlardan foydalanganingizga ishonch hosil qiling.
3. Tekshiruv funksiyalarini takrorlamaslik uchun Pytest parametrlangan testdan foydalaning.
Pytest parametrlangan test xususiyatlarining vaqtni tejaydiganligini ta'kidlay olmayman. Sinovni avtomatlashtirish ba'zan turli xil ma'lumotlar to'plamiga ega ilovada bir xil funksionallikni sinab ko'rishni talab qiladi. Sinov funktsiyalarini takrorlash o'rniga, pytest.mark.parametrize
dan foydalanib, bitta test funksiyasini ishga tushirishingiz mumkin va u turli parametrlar bilan bir necha marta takrorlanadi. Bu nimaga o'xshaydi:
import pytest
@pytest.mark.parametrize("input, expected", [(2, 4), (3, 9), (4, 16)])
def test_square(input, expected):
assert input ** 2 == expected
Agar siz Python-ning o'rnatilgan test avtomatlashtirish tizimi yordamida parametrlangan testlarni o'tkazishingiz mumkinmi deb qiziqsangiz, javob ha - ma'lum sharoitlarda. Unittest parametrlashtirilgan testni qo'llab-quvvatlamaydi, ammo buning uchun modul qo'shishingiz mumkin. Buni qanday qilish kerak:
import unittest
from parameterized import parameterized
class TestMathOperations(unittest.TestCase):
@parameterized.expand([
("square of 2", 2, 4),
("square of 3", 3, 9),
("square of 4", 4, 16),
])
def test_square(self, name, input, expected):
self.assertEqual(input ** 2, expected)
4. Parallel test bilan test bajarilishini tezlashtirish.
Sinov to'plamingizda qancha ko'p API, test holatlari, ma'lumotlar bazalari va uchinchi tomon tizimlari bo'lsa, bajarilish shunchalik kechikadi, bu esa rivojlanishni sekinlashtirishi mumkin. Yaxshiyamki, test to'plamini buzmasdan buni hal qilishning bir yo'li bor. Python Pytest kabi ramkalar bilan parallel test o'tkazish imkonini beradi. Bir nechta protsessorlar yordamida bir nechta testlarni parallel ravishda bajarishingiz mumkin.
Pytest bilan parallel testni qanday bajarish mumkin:
pip install pytest-xdist
pytest -n 4 # Run tests on 4 CPUs
Bundan tashqari, yukni ko'taradigan protsessorlar sonini ko'paytirishingiz mumkin, ammo mahalliy infratuzilma juda ko'p.
5. Sinovni avtomatlashtirishni CI/CD quvurlariga avtomatlashtiring.
Menga ishoning; Agar siz tez sur'atda ishlab chiqish sikllari bilan ishlayotgan bo'lsangiz, tanaffusga erisha olmaysiz va har safar dasturiy ta'minotda biror narsa o'zgarganda kodni qo'lda sozlashingiz kerak bo'ladi.
Kod o'zgarganda ularni avtomatik ravishda bajarish uchun Python testlarini CI/CD quvur liniyasiga avtomatlashtirishingiz mumkin. Bu sizga xatolarni tezda aniqlash va ilovaning takomillashtirilgan versiyasini ishlatish uchun qaytarish imkonini beradi.
Python sinovlarini avtomatlashtirishni CI/CD quvurlaringizga integratsiya qilish uchun. Loyihangizga pytest-cov
qo'shing va sinovlaringizni avtomatik ravishda bajarish va har qanday muammolarni belgilash uchun Pytest buyrug'idan foydalaning.
Qadamlar:
- name: Install dependencies
run: pip install pytest pytest-cov
- name: Run tests
run: pytest --cov=my_project
Agar siz kattaroq test to'plamlarida ishlasangiz, Jenkins kabi CI vositalariga robot ramkasini qo'shishingiz kerak bo'ladi. Unittest uchun qamrov sizning testingizni shunday quvur liniyasiga qo'shish imkonini beradi;
Sinov:
script:
- Python -m coverage run -m unittest discover
- Python -m coverage report
6. Sinovlarni alohida-alohida o'tkazing.
Python sinovlarini avtomatlashtirish bilan duch kelishi mumkin bo'lgan umumiy muammolardan biri bu o'zaro bog'liqlik tufayli sinov buzilishidir. Asosan, sizning testingiz muvaffaqiyatsiz tugadi, chunki sizning bitta testingiz boshqa testlarning ma'lumotlariga yoki atrof-muhit holatiga tayanadi. Shunday qilib, agar bitta test o'zgartirilsa, boshqa testlar o'zgarish keltirib chiqaradigan zanjir reaktsiyasi natijasida muvaffaqiyatsizlikka uchraydi. Buni hal qilish uchun barcha testlarni ajrating, shunda har biri boshqalarga ulanmagan holda boshlanadi. Shunday qilib, siz boshqa testlarda uning to'lqinli ta'siri bilan shug'ullanmasdan disk raskadrovka qilishingiz mumkin.
Pytest-da sozlash va yirtib tashlash mantig'idan foydalangan holda test izolyatsiyasini qanday ta'minlash mumkin;
import pytest
@pytest.fixture
def clean_environment():
# Setup: Prepare a clean state
print("Setting up a clean environment.")
yield
# Teardown: Reset environment
print("Cleaning up after the test.")
def test_example(clean_environment):
assert 2 + 2 == 4
E'tibor bering, Pytest moslamasi siz foydalanadigan resurslar har bir sinovdan keyin tozalanishini ta'minlaydi. Bu sinovni o'tkazgandan so'ng muhitni asl holatiga qaytarish imkonini beradi.
7. Sinovlarni avtomatlashtirishning eng yaxshi usullariga sodiq qoling.
Python testlarini avtomatlashtirishda samaraliroq bo'lish uchun bir nechta eng yaxshi amaliyotlarni ta'kidlayman;
- Sinovni avtomatlashtirishni boshlashdan oldin test to'plami uchun test ko'rsatkichlarini o'rnating. Kod qamrovi, bajarilgan, o'tgan yoki muvaffaqiyatsiz bo'lgan sinov holatlari soni va sinovni bajarish vaqti kabi test ko'rsatkichlari testni kuzatish va hal qilish uchun qiyinchiliklarni aniqlashga yordam beradi.
- Ko'p jihatdan, sizning jamoangizdagi har bir kishi oxirigacha (E2E) testini qanday yozishni bilishi kerak. Shunday qilib, sifat shunchaki o'ylangan narsa emas, balki rivojlanish jarayonining boshidanoq singib ketgan.
- Siz boshqara olmaydigan tashqi saytlar yoki serverlarga havolalar kabi uchinchi tomon bog'liqliklarini sinab ko'rmang. Bu sizning testingizni sekinlashtirishi mumkin va testingiz muvaffaqiyatsiz tugashiga olib kelishi mumkin bo'lgan cookie bannerlari yoki boshqa element bo'lishi mumkin.
- Foydalanish
da'volar test natijalari kutilgan natijalarga mos kelishini tekshirish uchun. - Ilovangizni brauzerning soʻnggi versiyalarida sinab koʻrish va uni ommaga koʻrsatishdan oldin xatolarni aniqlash uchun sinovni avtomatlashtirish vositalarini yangilab turing.
Xulosa
Avtomatlashtirishni sinovdan o'tkazish qiyin bo'lishi mumkin, ayniqsa hal qilib bo'lmaydigan ko'rinadigan xatolar bilan shug'ullanganda. Sinov piramidasidan foydalanganda test avtomatizatsiyasi kamroq xato ekanligini aniqladim. Bu erda siz E2E testlaridan oldin birlik va integratsiya testlariga e'tibor qaratasiz. Men ta'kidlagan maslahatlar va amaliyotlar bilan siz CI/CD muhitida uzluksiz regressiya testini samarali o'tkazishingiz va kodni o'rnatishdan oldin darhol fikr-mulohaza olishingiz mumkin.