ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ email-Π°Π΄ΡΠ΅ΡΠ° β ΡΡΠΎ Π²Π°ΠΆΠ½Π°Ρ Π·Π°Π΄Π°ΡΠ° Π² ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΉ Π²Π²ΠΎΠ΄ email ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΊ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°ΠΌ Ρ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠ΅ΠΉ, Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠ΅ΠΉ ΠΈΠ»ΠΈ ΠΎΡΠΏΡΠ°Π²ΠΊΠΎΠΉ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ.
Π― Π±Ρ ΠΏΡΠΎΠ²Π΅Π» Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
1οΈβ£ ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΈ ΠΏΡΠ°Π²ΠΈΠ» Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ
ΠΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ ΠΏΠΈΡΠ°ΡΡ ΡΠ΅ΡΡΡ, Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠ½ΡΡΡ, ΠΊΠ°ΠΊΠΈΠ΅ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠ΅Π΄ΡΡΠ²Π»ΡΡΡΡΡ ΠΊ email. ΠΠ±ΡΡΠ½ΠΎ email Π΄ΠΎΠ»ΠΆΠ΅Π½:
π£ Π‘ΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ "@" ΠΈ "."
π£ ΠΠΌΠ΅ΡΡ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΡΡ ΡΡΡΡΠΊΡΡΡΡ (
username@domain.com) π£ ΠΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ Π·Π°ΠΏΡΠ΅ΡΠ΅Π½Π½ΡΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»Ρ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΎΠ±Π΅Π»Ρ, ΠΊΠΈΡΠΈΠ»Π»ΠΈΡΡ)
π£ ΠΠ΅ Π±ΡΡΡ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΠΊΠΎΡΠΎΡΠΊΠΈΠΌ (
a@b.c β Π½Π΅Π²Π°Π»ΠΈΠ΄Π½ΠΎ) ΠΠ΅ Π±ΡΡΡ ΡΠ»ΠΈΡΠΊΠΎΠΌ Π΄Π»ΠΈΠ½Π½ΡΠΌ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, > 320 ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ²)
π£ Π‘ΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΎΠ²Π°ΡΡ ΡΠΎΡΠΌΠ°ΡΡ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΠΎΠ³ΠΎ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ (RFC 5322)
ΠΡΠΈΠΌΠ΅Ρ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΠΎΠ³ΠΎ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ Π΄Π»Ρ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ email:
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$2οΈβ£ ΠΠ°ΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡ ΡΠ΅ΡΡΠΎΠ²
Π― Π±Ρ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π» ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Selenium + Pytest ΠΈΠ»ΠΈ JUnit/TestNG Π² Java.
import pytest
from selenium import webdriver
from selenium.webdriver.common.by import By
@pytest.fixture
def driver():
driver = webdriver.Chrome()
driver.get("https://example.com/signup") # ΠΡΠΊΡΡΠ²Π°Π΅ΠΌ ΡΡΡΠ°Π½ΠΈΡΡ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ
yield driver
driver.quit()
@pytest.mark.parametrize("email, expected", [
("valid.email@example.com", True), # ΠΠ°Π»ΠΈΠ΄Π½ΡΠΉ email
("invalid-email.com", False), # ΠΠ΅Ρ "@"
("@nodomain.com", False), # ΠΠ΅Ρ ΠΈΠΌΠ΅Π½ΠΈ
("user@.com", False), # ΠΠ΅Ρ Π΄ΠΎΠΌΠ΅Π½Π°
("user@domain..com", False), # ΠΠ²ΠΎΠΉΠ½Π°Ρ ΡΠΎΡΠΊΠ°
("user@domain.c", False), # Π‘Π»ΠΈΡΠΊΠΎΠΌ ΠΊΠΎΡΠΎΡΠΊΠΎΠ΅ Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠ΅ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅
])
def test_email_validation(driver, email, expected):
email_input = driver.find_element(By.NAME, "email")
submit_button = driver.find_element(By.NAME, "submit")
email_input.clear()
email_input.send_keys(email)
submit_button.click()
error_message = driver.find_element(By.ID, "email-error")
if expected:
assert error_message.is_displayed() is False, f"ΠΡΠΈΠ±ΠΊΠ° Π΄Π»Ρ Π²Π°Π»ΠΈΠ΄Π½ΠΎΠ³ΠΎ email: {email}"
else:
assert error_message.is_displayed() is True, f"ΠΠ΅Ρ ΠΎΡΠΈΠ±ΠΊΠΈ Π΄Π»Ρ Π½Π΅Π²Π°Π»ΠΈΠ΄Π½ΠΎΠ³ΠΎ email: {email}"
3οΈβ£ ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅ (API-ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅)
ΠΠΎΠΌΠΈΠΌΠΎ UI, Π½ΡΠΆΠ½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΡ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅ ΡΠ΅ΡΠ΅Π· API-Π·Π°ΠΏΡΠΎΡΡ.
ΠΡΠΈΠΌΠ΅Ρ API-ΡΠ΅ΡΡΠ° Ρ Postman + Newman ΠΈΠ»ΠΈ RestAssured Π² Java:
import pytest
import requests
BASE_URL = "https://example.com/api/register"
@pytest.mark.parametrize("email, expected_status", [
("valid.email@example.com", 200),
("invalid-email.com", 400),
("user@.com", 400),
])
def test_email_validation_api(email, expected_status):
response = requests.post(BASE_URL, json={"email": email})
assert response.status_code == expected_status
4οΈβ£ ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ ΡΠ΅ΡΡΠΎΠ² Π² CI/CD
Π§ΡΠΎΠ±Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠ΅ΡΡΡ Π·Π°ΠΏΡΡΠΊΠ°Π»ΠΈΡΡ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΠΎ, ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠΎΠ²Π°ΡΡ Π² Jenkins, GitHub Actions, GitLab CI.
name: Run Email Validation Tests
on:
push:
branches:
- main
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v3
with:
python-version: '3.9'
- name: Install dependencies
run: pip install -r requirements.txt
- name: Run tests
run: pytest tests/