Агар шумо давида бошед
Ман дар лоиҳаҳои автоматикунонии санҷиши Python кор кардам, ки барои донистани баъзе маслиҳатҳо ва ҳилаҳо барои натиҷаҳои беҳтарин. Ман ҳафт маслиҳат ва амалияеро мубодила мекунам, ки шумо метавонед барои автоматикунонии самараноки санҷиши Python вобаста бошед.
1. Дар асоси мушаххасоти лоиҳаи худ чаҳорчӯбаи автоматикунонии санҷиши дурустро интихоб кунед.
Python бо чаҳорчӯбаи автоматикунонии санҷишии худ, Unittest меояд. Аммо он барои лоиҳаҳои хурд беҳтарин аст. Агар шумо хоҳед, ки чаҳорчӯбаи автоматизатсияи санҷишӣ дошта бошед, ки ба шумо имкон медиҳад дар лоиҳаҳои хурд-миқёс кор кунед, Pytest як варианти беҳтар аст.
Pytest як роҳи сохторӣ ва самараноки навиштани ҳолатҳои санҷиширо барои автоматизатсияи идорашаванда ва миқёспазири санҷиш пешниҳод мекунад. Он инчунин соддатарин синтаксис ва экосистемаи ҳамаҷонибаи плагинҳоро дорад. Масалан, шумо метавонед pytest-xdist-ро барои иҷрои параллелии санҷиш истифода баред. Илова бар ин, шумо метавонед ҳолатҳои санҷиширо, ки дар Unittest ё Nose 2 дар Pytest навиштаед, иҷро кунед.
Агар шумо бештар автоматизатсияи равандҳои роботиро иҷро кунед (
Агар шумо дар гурӯҳе кор кунед, ки Рушди рафторро (BDD) амалӣ мекунад, рафтор беҳтарин чаҳорчӯба аст. Навиштани ҳолатҳои санҷишӣ дар рафторе, ки ҷонибҳои манфиатдори ғайри техникӣ фаҳманд, хеле осон аст.
Ман ба шумо маслиҳат медиҳам, ки чаҳорчӯбаеро интихоб кунед, ки ба стеки технологӣ мувофиқат кунад, то аз ҳама монеаҳои иртиботӣ канорагирӣ кунад. Аммо агар шумо танҳо кор карда истода бошед, Pytest чаҳорчӯбаи ҳамаҷониба ва маъмултарин аст.
2. WebDriverWait-ро дар Selenium барои бартараф кардани мушкилоти вақт истифода баред.
Ман зикр кардам, ки шумо метавонед Pytest-ро бо Selenium барои санҷиши веб ҳамҷоя кунед. Гарчанде ки Pytest барои санҷиши функсионалӣ олӣ аст, Selenium автоматизатсияи вебро ба сатҳи нав мебарорад. Selenium дорои қобилиятҳои пурқуввати автоматикунонии браузер мебошад, махсусан бо китобхонаи WebDriver.
Вақте ки шумо санҷишҳоро дар Selenium иҷро мекунед, шумо бояд миқдори муайяни вақтро интизор шавед, зеро система дар ҷустуҷӯи элементҳо кор мекунад. Пас аз гузаштани ин вақт, бигӯед, ки 10 сония, ронанда аз кор мебарояд. Масъалаи интизории номуайян, тавре ки онро ном дорад, дар он аст, ки унсурҳои гуногун ба вақти интизории гуногун ниёз доранд.
Ҳамин тавр, ба ҷои такя кардан ба интизориҳои номуайян, WebDriverWait-ро дар якҷоягӣ бо expect_conditions истифода баред, то шароитҳои муайянеро эҷод кунед, ки бояд пеш аз интерактив шудани унсурҳо риоя карда шаванд.
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()
Агар санҷишҳои шумо ҳамеша ноком шаванд, ин маънои онро надорад, ки барномаи веб ягон мушкилот дорад. Ин метавонад танҳо аз сабаби баъзе тағйирот дар коди барнома ё UI бошад. Барои пешгирӣ кардани ислоҳи аз ҳад зиёд аз нокомиҳои санҷиш, боварӣ ҳосил кунед, ки шумо ID-ҳои беназирро барои дақиқ муайян кардани унсурҳои веб истифода мебаред.
3. Барои пешгирӣ кардани такрори функсияҳои санҷишӣ аз санҷиши параметри Pytest истифода баред.
Ман ба қадри кофӣ таъкид карда наметавонам, ки чӣ гуна хусусиятҳои санҷиши параметрии Pytest вақтро сарфа мекунанд. Автоматикунонии санҷиш баъзан санҷиши як функсияро дар барнома бо маҷмӯи гуногуни маълумот талаб мекунад. Ба ҷои такрор кардани функсияҳои санҷишӣ, шумо метавонед танҳо як функсияи санҷиширо бо истифода аз pytest.mark.parametrize
иҷро кунед ва он якчанд маротиба бо параметрҳои гуногун такрор карда мешавад. Ин аст он чизе ки ба назар мерасад:
import pytest
@pytest.mark.parametrize("input, expected", [(2, 4), (3, 9), (4, 16)])
def test_square(input, expected):
assert input ** 2 == expected
Агар шумо дар ҳайрат бошед, ки оё шумо метавонед бо чаҳорчӯбаи автоматикунонии санҷиши Python санҷиши параметрҳоро иҷро кунед, ҷавоб ҳа аст - дар шароити муайян. Unittest аслан санҷиши параметриро дастгирӣ намекунад, аммо шумо метавонед барои ин мақсад модул илова кунед. Инро чӣ тавр кардан мумкин аст:
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. Суръати иҷрои санҷиш бо санҷиши параллелӣ.
Чӣ қадаре ки API-ҳо, ҳолатҳои санҷишӣ, пойгоҳи додаҳо ва системаҳои тарафи сеюм дар пакети санҷишии шумо зиёдтар бошанд, иҷроиши онҳо ҳамон қадар ақиб мемонад, ки ин метавонад рушдро суст кунад. Хушбахтона, як роҳи ҳалли он бидуни дахолат ба маҷмӯи санҷишии шумо вуҷуд дорад. Python имкон медиҳад, ки санҷиши мувозӣ бо чаҳорчӯба ба монанди Pytest. Шумо метавонед якчанд санҷишҳоро дар як вақт бо истифода аз CPU-ҳои сершумор иҷро кунед.
Ин аст, ки чӣ гуна санҷиши мувозиро бо Pytest иҷро кунед:
pip install pytest-xdist
pytest -n 4 # Run tests on 4 CPUs
Шумо инчунин метавонед шумораи CPU-ҳои коркарди сарборро зиёд кунед, аммо инфрасохтори маҳаллӣ танҳо ин қадар зиёд аст.
5. Автоматикунонии санҷиши худро ба қубурҳои CI/CD автоматӣ кунед.
Ба ман бовар кунед; агар шумо бо давраҳои рушди босуръат кор карда истода бошед, танаффус намеёбед ва ҳар дафъае, ки чизе дар нармафзор тағир меёбад, шумо бояд кодро дастӣ танзим кунед.
Шумо метавонед санҷишҳои Python-ро дар лӯлаи CI/CD худ автоматӣ кунед, то ҳар вақте ки код тағир меёбад, онҳоро ба таври худкор иҷро кунед. Ин ба шумо имкон медиҳад, ки хатогиҳоро зуд муайян кунед ва версияи мукаммали барномаро барои истифода баргардонед.
Барои ворид кардани автоматизатсияи санҷиши Python ба қубурҳои CI/CD. Ба лоиҳаи худ pytest-cov
илова кунед ва фармони Pytest-ро истифода баред, то санҷишҳои худро ба таври худкор иҷро кунед ва ҳама гуна мушкилотро қайд кунед.
Қадамҳо:
- name: Install dependencies
run: pip install pytest pytest-cov
- name: Run tests
run: pytest --cov=my_project
Агар шумо дар люксҳои санҷишии калонтар кор кунед, шумо бояд чаҳорчӯбаи роботро ба абзорҳои CI ба монанди Ҷенкинс илова кунед. Барои Unittest, фарогирӣ ба шумо имкон медиҳад, ки санҷиши худро ба қубуре ба ин монанд ворид кунед;
Санҷиш:
script:
- Python -m coverage run -m unittest discover
- Python -m coverage report
6. Санҷишҳоро дар алоҳидагӣ иҷро кунед.
Яке аз масъалаҳои маъмулие, ки шумо бо автоматизатсияи санҷиши Python дучор мешавед, шикастани санҷиш аз сабаби вобастагии мутақобила мебошад. Асосан, санҷиши шумо ноком мешавад, зеро як санҷиши шумо ба маълумот ё ҳолати муҳити санҷишҳои дигар такя мекунад. Ҳамин тавр, агар як санҷиш тағир дода шавад, дигар санҷишҳо дар натиҷаи реаксияи занҷираи тағирот ноком мешаванд. Барои ҳалли ин, ҳама санҷишҳоро ҷудо кунед, то ҳар кадоми онҳо ба дигарон пайваст нашаванд. Бо ин роҳ, шумо метавонед бе сарукордошта бо таъсири мавҷи он дар озмоишҳои дигар ислоҳ кунед.
Ин аст, ки чӣ гуна бояд ҷудокунии санҷишро бо истифода аз мантиқи насбкунӣ ва шикаста дар Pytest таъмин кард;
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
Аҳамият диҳед, ки дастгоҳи Pytest кафолат медиҳад, ки захираҳои истифодашуда пас аз ҳар як санҷиш тоза карда мешаванд. Ин ба шумо имкон медиҳад, ки муҳитро пас аз анҷоми санҷиш ба ҳолати аввалааш барқарор кунед.
7. Таҷрибаҳои беҳтарини автоматикунонии санҷишро риоя кунед.
Ман якчанд таҷрибаҳои беҳтаринро барои самараноктар шудан дар автоматизатсияи санҷиши Python таъкид хоҳам кард;
- Пеш аз оғози автоматикунонии санҷиш, ченакҳои санҷиширо барои маҷмӯи санҷиши худ муқаррар кунед. Метрикҳои санҷишӣ ба монанди фарогирии код, шумораи парвандаҳои санҷишӣ иҷрошуда, гузашта ё ноком ва вақти иҷрои санҷиш ба шумо кӯмак мекунанд, ки санҷишро пайгирӣ кунед ва монеаҳои ҳалшударо муайян кунед.
- Ба андозаи хеле зиёд, ҳама дар дастаи шумо бояд донанд, ки чӣ гуна санҷиши ниҳоӣ (E2E) нависед. Бо ин роҳ, сифат на танҳо як фикру мулоҳиза аст, балки аз ибтидо ба раванди рушд дохил мешавад.
- Вобастагии тарафи сеюмро ба монанди истинодҳо ба сайтҳои беруна ё серверҳое, ки шумо онҳоро идора карда наметавонед, озмоиш накунед. Он метавонад эҳтимолан санҷиши шуморо суст кунад ва метавонад баннерҳои кукиҳо ё ягон унсури дигаре бошад, ки боиси нокомии санҷиши шумо гардад.
- Истифода баред
тасдикхо санҷед, ки натиҷаҳои санҷиши шумо ба натиҷаҳои интизоршуда мувофиқат мекунанд. - Асбобҳои автоматикунонии санҷиши худро то ба имрӯз нигоҳ доред, то барномаи худро дар версияҳои охирини браузер санҷед ва хатогиҳоро пеш аз он ки онро ба омма пешкаш кунад, дарёфт кунед.
Хулоса
Санҷиши автоматизатсия метавонад душвор бошад, махсусан ҳангоми мубориза бо як қатор хатогиҳои ба назар ҳалнашаванда. Ман фаҳмидам, ки автоматизатсияи санҷиш ҳангоми истифодаи пирамидаи санҷишӣ камтар мушкил аст. Дар ин ҷо шумо пеш аз санҷишҳои E2E ба санҷишҳои воҳид ва ҳамгироӣ диққат медиҳед. Бо маслиҳатҳо ва амалияҳое, ки ман таъкид кардам, шумо метавонед дар муҳити CI/CD санҷиши доимии регрессияро ба таври муассир иҷро кунед ва пеш аз ҷойгиркунии код фикру мулоҳизаҳои фаврӣ гиред.