Əgər qaçmısınızsa
Ən yaxşı nəticələr üçün bəzi məsləhətlər və fəndləri bilmək üçün Python test avtomatlaşdırma layihələri üzərində kifayət qədər uzun müddət işləmişəm. Səmərəli Python test avtomatlaşdırılması üçün etibar edə biləcəyiniz yeddi məsləhət və təcrübəni paylaşacağam.
1. Layihənizin spesifikasiyasına əsasən düzgün sınaq avtomatlaşdırma çərçivəsini seçin.
Python özünün daxili sınaq avtomatlaşdırma çərçivəsi olan Unittest ilə gəlir. Ancaq kiçik layihələr üçün ən yaxşısıdır. Kiçikdən irimiqyaslı layihələrdə işləməyə imkan verən sınaq avtomatlaşdırma çərçivəsi istəyirsinizsə, Pytest daha yaxşı seçimdir.
Pytest, daha idarə edilə bilən və genişlənə bilən test avtomatlaşdırılması üçün test işlərinin yazılması üçün strukturlaşdırılmış və səmərəli bir yol təqdim edir. O, həmçinin ən sadə sintaksisə və ən əhatəli plagin ekosisteminə malikdir. Məsələn, paralel testin icrası üçün pytest-xdist istifadə edə bilərsiniz. Bundan əlavə, siz Unittest və ya Nose 2-də yazdığınız test işlərini Pytest-də işlədə bilərsiniz.
Əgər daha çox robot prosesinin avtomatlaşdırılması ilə məşğul olsanız (
Davranışa əsaslanan İnkişaf (BDD) tətbiq edən komandada işləyirsinizsə, Davranış ən yaxşı çərçivədir. Qeyri-texniki maraqlı tərəflərin başa düşə biləcəyi Davranış proqramında test nümunələri yazmaq çox asandır.
Hər hansı bir ünsiyyət maneəsinin qarşısını almaq üçün komandanızın istifadə etdiyi texnoloji yığına uyğun bir çərçivə seçməyi məsləhət görərdim. Ancaq solo işləyirsinizsə, Pytest ən çox yönlü və çox istifadə olunan çərçivədir.
2. Vaxt problemlərini aradan qaldırmaq üçün Selenium-da WebDriverWait istifadə edin.
Qeyd etdim ki, veb testi üçün Pytest-i Selenium ilə birləşdirə bilərsiniz. Pytest funksional sınaq üçün əla olsa da, Selenium veb avtomatlaşdırmanı tamamilə yeni səviyyəyə qaldırır. Selenium, xüsusən də WebDriver kitabxanası ilə güclü brauzer avtomatlaşdırma imkanlarına malikdir.
Selenium-da testlər keçirdiyiniz zaman, sistem elementlərin yerləşdirilməsi üzərində işlədiyi üçün müəyyən edilmiş bir müddət gözləməli olacaqsınız. Bu müddət keçdikdən sonra, deyək ki, 10 saniyə, sürücü maşını tərk edir. Gizli gözləmə ilə bağlı məsələ, deyildiyi kimi, fərqli elementlərin fərqli gözləmə müddətlərinə ehtiyacı olmasıdır.
Beləliklə, gizli gözləmələrə etibar etmək əvəzinə, elementlərin interaktiv olmasından əvvəl yerinə yetirilməli olan müəyyən şərtləri yaratmaq üçün gözlənilən_şərtlər ilə birlikdə WebDriverWait-dən istifadə edin.
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()
Testləriniz daim uğursuz olarsa, bu, mütləq veb tətbiqində hər hansı problemin olması demək olmaya bilər. Bu, sadəcə olaraq proqram kodunda və ya UI-də bəzi dəyişikliklərə görə ola bilər. Test uğursuzluqlarından həddindən artıq sazlamanın qarşısını almaq üçün veb elementlərini dəqiq müəyyən etmək üçün unikal ID-lərdən istifadə etdiyinizə əmin olun.
3. Test funksiyalarının təkrarlanmasının qarşısını almaq üçün Pytest parametrli testindən istifadə edin.
Pytest parametrli test xüsusiyyətlərinin nə qədər vaxta qənaət etdiyini vurğulaya bilmirəm. Sınaq avtomatlaşdırılması bəzən müxtəlif məlumat dəstləri olan bir tətbiqdə eyni funksionallığın sınaqdan keçirilməsini tələb edir. Test funksiyalarını təkrarlamaq əvəzinə, sadəcə olaraq pytest.mark.parametrize
istifadə edərək bir test funksiyasını işlədə bilərsiniz və o, müxtəlif parametrlərlə bir neçə dəfə təkrarlanacaq. Bunun necə göründüyü budur:
import pytest
@pytest.mark.parametrize("input, expected", [(2, 4), (3, 9), (4, 16)])
def test_square(input, expected):
assert input ** 2 == expected
Python-un daxili test avtomatlaşdırma çərçivəsi ilə parametrləşdirilmiş testi keçirə biləcəyinizlə maraqlanırsınızsa, cavab bəli - müəyyən şərtlər altında. Unittest yerli olaraq parametrləşdirilmiş testi dəstəkləmir, lakin siz bu məqsəd üçün modul əlavə edə bilərsiniz. Bunu necə etmək olar:
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. Paralel sınaq ilə testin icrasını sürətləndirin.
Test dəstinizdə nə qədər çox API, test nümunələri, verilənlər bazası və üçüncü tərəf sistemləri varsa, bir o qədər çox icra gecikmələri inkişafı ləngidə bilər. Şükürlər olsun ki, sınaq dəstinizə müdaxilə etmədən bununla məşğul olmağın bir yolu var. Python, Pytest kimi çərçivələrlə paralel test etməyə imkan verir. Birdən çox CPU istifadə edərək paralel olaraq bir neçə test keçirə bilərsiniz.
Pytest ilə paralel testi necə yerinə yetirmək olar:
pip install pytest-xdist
pytest -n 4 # Run tests on 4 CPUs
Siz həmçinin yükü idarə edən CPU-ların sayını artıra bilərsiniz, lakin bu qədər yerli infrastruktur var.
5. Test avtomatlaşdırmanızı CI/CD boru kəmərlərinə avtomatlaşdırın.
Mənə inanın; sürətli inkişaf dövrləri ilə işləyirsinizsə, fasilə əldə etməyəcəksiniz və proqram təminatında hər hansı bir dəyişiklik olduqda kodu əl ilə tənzimləməli olacaqsınız.
Siz kod dəyişdikdə onları avtomatik yerinə yetirmək üçün Python testlərini CI/CD boru kəmərinizdə avtomatlaşdıra bilərsiniz. Bu, səhvləri tez bir zamanda müəyyən etməyə və tətbiqin təkmilləşdirilmiş versiyasını istifadə üçün geri buraxmağa imkan verir.
Python sınaq avtomatlaşdırmasını CI/CD boru kəmərlərinizə inteqrasiya etmək. Layihənizə pytest-cov
əlavə edin və testlərinizi avtomatik yerinə yetirmək və hər hansı problemi qeyd etmək üçün Pytest əmrindən istifadə edin.
Addımlar:
- name: Install dependencies
run: pip install pytest pytest-cov
- name: Run tests
run: pytest --cov=my_project
Daha böyük test paketləri üzərində işləyirsinizsə, Jenkins kimi CI alətlərinə robot çərçivəsi əlavə etməli olacaqsınız. Unittest üçün əhatə dairəsi testinizi bu kimi bir boru kəmərinə inteqrasiya etməyə imkan verir;
Test:
script:
- Python -m coverage run -m unittest discover
- Python -m coverage report
6. Testləri təcrid olunmuş şəkildə həyata keçirin.
Python test avtomatlaşdırılması ilə qarşılaşa biləcəyiniz ümumi problemlərdən biri qarşılıqlı asılılıqlar səbəbindən testin pozulmasıdır. Əsasən, testiniz uğursuz olur, çünki bir testiniz digər testlərin məlumatlarına və ya mühit vəziyyətinə əsaslanır. Beləliklə, bir test dəyişdirilərsə, digər testlər dəyişikliyin səbəb olduğu zəncirvari reaksiya nəticəsində uğursuz olur. Bunu həll etmək üçün bütün testləri təcrid edin ki, hər biri digərləri ilə əlaqəsiz başlasın. Bu yolla, digər testlərdə dalğalanma effekti ilə məşğul olmadan debug edə bilərsiniz.
Pytest-də quraşdırma və sökmə məntiqindən istifadə edərək test izolyasiyasını necə təmin etmək olar;
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
Qeyd edək ki, Pytest qurğusu hər sınaqdan sonra istifadə etdiyiniz resursların təmizlənməsini təmin edir. Bu, sınaq yerinə yetirildikdən sonra mühiti ilkin vəziyyətinə qaytarmağa imkan verir.
7. Ən yaxşı sınaq avtomatlaşdırma təcrübələrinə sadiq qalın.
Python test avtomatlaşdırmasında daha səmərəli olmaq üçün bir neçə ən yaxşı təcrübəni vurğulayacağam;
- Test avtomatlaşdırmasına başlamazdan əvvəl test dəstiniz üçün test ölçülərini təyin edin. Kod əhatə dairəsi, yerinə yetirilən, keçilən və ya uğursuz sınaq hallarının sayı və testin icra müddəti kimi test göstəriciləri testi izləməyə və həll edilməli olan çətinlikləri müəyyən etməyə kömək edəcək.
- Çox böyük ölçüdə komandanızdakı hər kəs başdan sona (E2E) testini necə yazmağı bilməlidir. Beləliklə, keyfiyyət yalnız sonradan düşünülən bir şey deyil, həm də başlanğıcdan inkişaf prosesinə köklənmişdir.
- Xarici saytlara və ya idarə edə bilməyəcəyiniz serverlərə keçidlər kimi üçüncü tərəf asılılıqlarını sınaqdan keçirməyin. Bu, testinizi potensial olaraq yavaşlata bilər və testinizin uğursuz olmasına səbəb ola biləcək kuki bannerləri və ya başqa elementlər ola bilər.
- istifadə edin
iddialar test nəticələrinizin gözlənilən nəticələrə uyğun olduğunu yoxlamaq üçün. - Tətbiqinizi ən son brauzer versiyalarında sınamaq və onu ictimaiyyətə təqdim etməzdən əvvəl səhvləri aşkar etmək üçün test avtomatlaşdırma alətlərinizi güncəl saxlayın.
Nəticə
Avtomatlaşdırma testi çətin ola bilər, xüsusən də həll olunmayan bir sıra səhvlərlə məşğul olarkən. Test piramidasından istifadə edərkən test avtomatlaşdırmasının daha az səhv olduğunu aşkar etdim. Burada siz E2E testlərindən əvvəl vahid və inteqrasiya testlərinə diqqət yetirirsiniz. Vurğuladığım məsləhətlər və təcrübələrlə siz CI/CD mühitində davamlı reqressiya testini səmərəli şəkildə həyata keçirə və kodu yerləşdirməzdən əvvəl dərhal rəy ala bilərsiniz.