Jei esate paleidę
Aš dirbau su Python bandymų automatizavimo projektais pakankamai ilgai, kad žinotumėte keletą patarimų ir gudrybių, kad gautumėte geriausių rezultatų.
Aš pasidalinsiu septyniais patarimais ir praktika, kuriais galite pasikliauti efektyviam Python bandymų automatizavimui.
1. Pasirinkite tinkamą bandymų automatizavimo sistemą pagal savo projekto specifikacijas.
Pasirinkite tinkamą bandymų automatizavimo sistemą, atsižvelgiant į jūsų projekto specifikacijas.Python ateina su savo įmontuota bandymų automatizavimo sistema, Unittest. bet tai geriausia mažiems projektams.Jei norite bandymų automatizavimo sistemos, leidžiančios dirbti su mažais – didelio masto projektais, Pytest yra geresnis pasirinkimas.
Pytest suteikia struktūrizuotą ir efektyvų būdą rašyti bandymų atvejus, kad būtų galima valdyti ir išplėsti bandymų automatizavimą. Jis taip pat turi paprasčiausią sintaksę ir išsamiausią įskiepių ekosistemą. Pavyzdžiui, galite naudoti pytest-xdist lygiagrečiam bandymų vykdymui. Be to, galite paleisti bandymų atvejus, kuriuos parašėte Unittest arba Nose 2 ant Pytest.
Jei darote daugiau robotų procesų automatizavimo (
Jei dirbate komandoje, kuri praktikuoja elgsenos sukurtą plėtrą (BDD), elgesys yra geriausia sistema.
Aš patariu jums pasirinkti sistemą, kuri atitiktų jūsų komandos naudojamą technologijų rinkinį, kad būtų išvengta jokių komunikacijos kliūčių. bet jei dirbate solo, Pytest yra labiausiai universali ir dažniausiai naudojama sistema.
Naudokite „WebDriverWait“ „Selenum“, kad įveiktumėte laiko problemas.Paminėjau, kad galite integruoti „Pytest“ su „Selenium“ žiniatinklio testavimui. „Pytest“ puikiai tinka funkciniam testavimui, tačiau „Selenium“ žiniatinklio automatizavimui suteikia visiškai naują lygį. „Selenium“ turi galingas naršyklės automatizavimo galimybes, ypač su „WebDriver“ biblioteka.
Kai paleidžiate bandymus ant Selenium, turite laukti tam tikro apibrėžto laiko, nes sistema veikia dėl elementų lokalizavimo. Kai tas laikas praeina, tarkim, 10 sekundžių, vairuotojas nustoja veikti.
Todėl, užuot pasikliaujęs numanomais laukimais, naudokite „WebDriverWait“ kartu su „expected_conditions“, kad sukurtumėte tam tikras sąlygas, kurios turi būti įvykdytos, kol elementai taps interaktyvūs.
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() # Padarykite veiksmą po to, kai elementas yra paruoštas driver.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() # Padarykite veiksmą po to, kai elementas yra paruoštas driver.()
Jei jūsų testai nuolat nepavyksta, tai nebūtinai reiškia, kad žiniatinklio programa turi problemų.Tai gali būti tiesiog dėl kai kurių programos kodo ar naudotojo sąsajos pokyčių.Norėdami išvengti pernelyg didelio bandymų gedimų, įsitikinkite, kad naudojate unikalius ID, kad tiksliai identifikuotumėte žiniatinklio elementus.
3. naudokite Pytest parametrinį bandymą, kad išvengtumėte dvigubų bandymų funkcijų.
Negaliu pakankamai pabrėžti, kaip laiko taupo „Pytest“ parametrizuotos testavimo funkcijos.Testų automatizavimas kartais reikalauja išbandyti tą pačią funkciją programoje su skirtingais duomenų rinkiniais.Užuot dubliuojant bandymo funkcijas, galite tiesiog paleisti vieną bandymo funkciją naudodami pytest.mark.parametrize
, ir ji bus dubliuojama kelis kartus su skirtingais parametrais.Štai kaip tai atrodo:
pytest.mark.parametrize
importuoti įprastą
importuoti įprastą
@pytest.mark.parametrize("input, expected", [(2, 4), (3, 9), (4, 16)])
@pytest.mark.parametrize("input, expected", [(2, 4), (3, 9), (4, 16)])
def test_square(įvesti, tikėtina):
def test_square(įvadas, tikimasi):
Atsakyti įvesties ** 2 == tikėtina
Atsakyti įvesties ** 2 == tikėtis
Jei įdomu, ar galite paleisti parametrizuotą testavimą naudojant „Python“ įmontuotą bandymų automatizavimo sistemą, atsakymas yra taip – tam tikromis sąlygomis. „Unittest“ natūraliai nepalaiko parametrizuoto testavimo, tačiau šiuo tikslu galite pridėti modulį.
importuoti vienetą
importuoti vienetą
iš parametrizuoto importo parametrizuotas
from parametrinis importas parametrinis
Klasės Žmogiškųjų išteklių tyrimai(unittest.TestCase):
klase TestMathOperations(unittest.TestCase):
„Br“ @parameterized.expand([
@parameterized.expand([
) („2 kvadratas“, 2, 4),
(„2 kvadratas“, 2, 4),
("kvadratinis 3", 3, 9),
("kvadratinis 3", 3, 9),
(„4 kvadratas“, 4, 16),
(„4 kvadratas“, 4, 16),
]
] ir def test_square(pats, vardas, pavardė, įvestis, tikimasi):
def test_square(pats, vardas, pavardė, įvestis, numatoma):
savarankiškai.assertEqual(input ** 2, expected)
savarankiškai.assertEqual(input ** 2, expected)
4. pagreitinti bandymų vykdymą naudojant lygiagrečius bandymus.
Kuo daugiau API, bandymų atvejų, duomenų bazių ir trečiųjų šalių sistemų jūsų bandymų rinkinyje, tuo daugiau vykdymo vėlavimų, o tai gali sulėtinti plėtrą.Laimei, yra būdas su tuo susidoroti nepakeičiant jūsų bandymų rinkinio. „Python“ leidžia lygiagrečiai bandyti naudojant sistemas, tokias kaip „Pytest“.
Štai kaip atlikti lygiagrečius bandymus su Pytest:
pip instaliuokite klaviatūrą
pip install pyptest-xdist
pytest -n 4 # Vykdyti bandymus 4 CPU
pytest -n 4 # Vykdyti bandymus 4 CPU
Jūs taip pat galite padidinti procesorių, kurie tvarko apkrovą, skaičių, tačiau yra tik tiek daug vietinės infrastruktūros , kad gali tai tvarkyti.Įrašai Automatizuokite savo bandymų automatizavimą į CI/CD vamzdynus.Patikėkite manimi; jūs neturėsite pertraukos, jei dirbate su greitaeigiais kūrimo ciklais, ir jūs turite rankiniu būdu koreguoti kodą kiekvieną kartą, kai kažkas keičiasi programinėje įrangoje.
Galite automatizuoti „Python“ testus į savo CI/CD vamzdyną, kad jie būtų automatiškai vykdomi kiekvieną kartą, kai keičiasi kodas.
Norėdami integruoti Python testavimo automatizavimą į savo CI / CD vamzdynus. Pridėkite pytest-cov
į savo projektą ir naudokite Pytest komandą, kad automatiškai atliktumėte savo testus ir pažymėtumėte bet kokias problemas.
pytest-cov
Įrašų kodas
Priežastys
- pavadinimas: Įdiegti priklausomybę
- pavadinimas: Įdiegti priklausomybę
run: pip install pytest pytest-cov
run: pip install pytest pytest-cov
- vardas ir pavardė: Vykdyti bandymus
- pavadinimas: Išbandykite
run: įprastai --cov=my_project
run: įdomiausias --cov=my_project
Jei dirbate su didesniais bandymų rinkiniais, į CI įrankius, tokius kaip „Jenkins“, turėtumėte pridėti robotų sistemą. „Unittest“ atveju aprėptis leidžia integruoti testą į tokį vamzdyną;
Išbandymas
Skriptas:
Skriptas:
- Python -m coverage run -m unittest discover
- Python -m coverage run -m unittest discover
- Python -m aprėpties ataskaita
- Python -m aprėpties ataskaita
6. atlikti bandymus izoliacijoje.
Viena iš dažniausiai pasitaikančių problemų, su kuriomis galite susidurti naudojant „Python“ bandymų automatizavimą, yra bandymų pažeidimas dėl tarpusavio priklausomybės. Iš esmės jūsų testas nepavyksta, nes jūsų vienas testas priklauso nuo kitų testų duomenų ar aplinkos būklės. Taigi, jei vienas testas yra modifikuotas, kiti testai nepavyksta dėl grandininės reakcijos, kurią sukelia pokyčiai. Norėdami tai išspręsti, izoliuokite visus testus, kad kiekvienas pradėtų nesusijęs su kitais.
Štai kaip užtikrinti bandymų izoliaciją naudojant "Pytest" nustatymų ir nusileidimo logiką;
importuoti įprastą
importuoti įprastą
@pytest.fixture
@pytest.fixture def clean_environment():
def švarus_aplinkos():
# Nustatymas: Paruoškite švarią būseną
# Setup: Paruoškite švarią būseną
print("Nustatyti švarią aplinką.")
print("Nustatyti švarią aplinką.")
ield
ield
# Teardown: Atkurti aplinką
# Teardown: Atkurti aplinką
print("Išvalyti po bandymo.")
print("Išvalyti po bandymo.")
def test_example(clean_environment):
„Br“def test_example(clean_environment):
asert 2 + 2 == 4
Atsakyti 2 + 2 == 4
Atkreipkite dėmesį, kad Pytest įtaisas užtikrina, kad po kiekvieno bandymo naudojami ištekliai būtų išvalyti.
Tai leidžia atkurti aplinką į pradinę būseną po bandymo.
7. laikykitės geriausios bandymų automatizavimo praktikos.
Aš atkreipsiu dėmesį į keletą geriausios praktikos, kad taptų efektyvesnis Python bandymų automatizavimo;
- Prieš pradedant bandymų automatizavimą, nustatykite savo bandymų rinkinio bandymų rodiklius. Bandymų rodikliai, pvz., kodo aprėptis, atliktų bandymų atvejų skaičius, praėjo ar nepavyko, ir bandymų vykdymo laikas padės jums sekti bandymus ir nustatyti spragas.
- Labai plačiu mastu kiekvienas jūsų komandoje turėtų žinoti, kaip parašyti galutinį (E2E) testą. Tokiu būdu kokybė nėra tik po apmąstymo, bet įsišaknijusi į vystymosi procesą nuo pat pradžių.
- Nepatikrinkite trečiųjų šalių priklausomybių, pvz., nuorodų į išorines svetaines ar serverius, kurių negalite kontroliuoti. Tai gali potencialiai sulPrieš pradedant bandymų automatizavimą, nustatykite savo bandymų rinkinio bandymų rodiklius.Testų rodikliai, pvz., kodo aprėptis, atliktų, išlaikytų ar nesėkmingų bandymų atvejų skaičius ir bandymų vykdymo laikas padės jums sekti bandymus ir nustatyti kliūtis.
- Dideliu mastu kiekvienas jūsų komandoje turėtų žinoti, kaip parašyti E2E testą.Tokiu būdu kokybė yra ne tik apgalvota, bet įsišaknijęs į plėtros procesą nuo pat pradžių.
- Nekontroliuokite trečiųjų šalių priklausomybių, pvz., nuorodų į išorines svetaines ar serverius, kurių negalite kontroliuoti.Tai gali sulėtinti jūsų testą ir gali būti slapukų baneriai ar kai kurie kiti elementai, dėl kurių jūsų testas gali žlugti.
- Naudokite
teiginius patikrinti, ar jūsų testo rezultatai atitinka laukiamus rezultatus. teiginiai teiginiai- Laikykite savo bandymų automatizavimo įrankius atnaujintus, kad galėtumėte išbandyti savo programą naujausiose naršyklės versijose ir sugauti klaidas, kol ji bus paskelbta visuomenei.
Išvados
Automatizavimo testavimas gali būti sudėtingas, ypač kai susiduriama su iš pažiūros neišsprendžiamų klaidų serija.Aš atradau, kad bandymų automatizavimas yra mažiau klaidingas, kai naudojama bandymų piramidė.Čia jūs sutelkiate dėmesį į vieneto ir integracijos bandymus prieš E2E bandymus.Naudodami patarimus ir praktiką, kurią pabrėžiau, galite efektyviai atlikti nuolatinį regresijos bandymą CI / CD aplinkoje ir gauti nedelsiant atsiliepimus prieš diegiant kodą.