Mivel napo óta ezzel szórakoztatom magam, gondoltam íratok erről pár sort az AI-val, mint emlékeztető, ha újra elő kell vennem a témát. Röviden: vannak esetek, amikor százalékos arányban kell hívásokat eszközölni a performancia mérésben. Ebben tud segíteni a Throughput Controller.
Nézzük, mint mond erről az AI:
A Throughput Controller az Apache JMeter egyik legfontosabb eleme, amikor a valós felhasználói viselkedést szeretnénk szimulálni. Neve ellenére nem a másodpercenkénti kérések számát (RPS) korlátozza (arra a Constant Throughput Timer való), hanem azt határozza meg, hogy a teszt lépései milyen arányban vagy rögzített alkalommal fussanak le.
Mire jó a Throughput Controller?
Egy webáruháznál a látogatók nem egyforma arányban böngésznek és vásárolnak:
80% csak böngészi a termékeket.
15% kosárba tesz valamit.
5% eljut a fizetésig.
A Throughput Controller segítségével pontosan ezt a megoszlást képezhetjük le egyetlen Thread Group-on belül.
A két fő működési mód (Based On)
Mód
Leírás
Mikor használd?
Percent Executions
A beállított százalékos arányban engedi lefutni a gyermek kéréseket a teszt során.
Valós felhasználói eloszlás szimulálásához (pl. 80-15-5% szabály).
Total Executions
Legfeljebb egy megadott fix alkalommal engedi lefutni a kérést, utána kihagyja.
Egyszeri beállításokhoz vagy korlátozott műveletekhez (pl. adatbázis-feltöltés).
Fontos beállítás (Per User): Ha be van pipálva, a számítás nem a teljes tesztre, hanem szálanként (felhasználónként) érvényesül.
Gyakorlati példa: Webáruház forgalomszimuláció
Tételezzük fel, hogy 100 szálat (felhasználót) indítunk egy hurokban (Loop Count: 100). A célunk a fent említett 80%-15%-5%-os megoszlás.
A 1000 összes lefutásból nagyjából 800 alkalommal a termékoldal kérés fog lefutni.
150 alkalommal a kosárba helyezés.
50 alkalommal pedig a fizetés lép fel.
Gyakori hibák és tippek
Ne keverd a Constant Throughput Timer-rel: Ha az a célod, hogy a szervert pontosan 100 req/sec terhelés alatt tartsd, használj Timert. A Throughput Controller az arányokról szól, nem a sebességről.
Keresztülfutás (Overhead): Ha a szabályok összege nem 100%, vagy egy szál egyik controllernek sem felel meg az adott iterációban, a szál kihagyja az adott részt és lép a következő hurokra.
Egymásba ágyazás: Összetettebb scenárióknál Simple Controller-rel vagy Transaction Controller-rel kombinálva egész folyamatokat is elhelyezhetsz egy-egy Throughput Controller alá.
Mire jó az AI? Hát például arra, hogy ha írni szeretnék egy témáról, de lusta vagyok, az egyébként is Google segítsével összeszedett információkat rendszerbe szedni, akkor relatív gyorsan kézhez kapok egy bejegyzést.
A Page Object Model (POM) a szoftvertesztelés-automatizálás egyik legnépszerűbb és leghatékonyabb tervezési mintája (Design Pattern). A lényege, hogy az alkalmazás egyes weboldalait (vagy oldalrészeit) különálló objektumokként képezi le a kód szintjén.
Miért érdemes használni?
Karbantarthatóság: Ha megváltozik egy gomb ID-ja vagy egy mező elhelyezkedése, elegendő azt egyetlen helyen (a Page Object osztályban) átírni, a teszteseteket nem kell bántani.
Kód újrafelhasználhatósága: A gyakori műveletek (pl. bejelentkezés, keresés) egyszer vannak megírva, és bármelyik tesztből meghívhatók.
Olvashatóság: A tesztkód tiszta, átlátható és üzleti logikát követő lesz, rejtve a techniai megvalósítást (pl. DOM-lekérdezéseket).
Minta megvalósítás (Python + Selenium)
Az alábbiakban egy klasszikus bejelentkezési folyamat példáján keresztül látható a POM működése.
A Page Object osztály (login_page.py)
Ez az osztály tartalmazza az oldal elemeinek azonosítóit (lokátorait) és a végezhető műveleteket.
Python
from selenium.webdriver.common.by import By
class LoginPage:
def __init__(self, driver):
self.driver = driver
# Lokátorok (különválasztva a logikától)
self._username_input = (By.ID, "username")
self._password_input = (By.ID, "password")
self._login_button = (By.CSS_SELECTOR, "button[type='submit']")
self._error_message = (By.CLASS_NAME, "flash-error")
# Akciók / Műveletek
def enter_username(self, username: str):
self.driver.find_element(*self._username_input).send_keys(username)
def enter_password(self, password: str):
self.driver.find_element(*self._password_input).send_keys(password)
def click_login(self):
self.driver.find_element(*self._login_button).click()
# Összetett folyamat (Láncolt / Magasabb szintű akció)
def login(self, username: str, password: str):
self.enter_username(username)
self.enter_password(password)
self.click_login()
def get_error_message(self) -> str:
return self.driver.find_element(*self._error_message).text
A Teszteset (test_login.py)
A tesztkód csak a Page Object által nyújtott metódusokat használja, így végtelenül egyszerű és olvasható.
Ne tegyél assertion-öket a Page Object-be: A assert kifejezések a tesztfájlban maradjanak, a Page Object csak adatot adjon vissza vagy állapotot módosítson.
Page Factory használata: Bizonyos keretrendszerekben (pl. Java + Selenium) a @FindBy annotációkkal még tisztább szerkezet érhető el.
Lazy loading: Az elemeket csak akkor kérd le a DOM-ból, amikor ténylegesen szükség van rájuk (például dinamikus felületek esetén).
A Page Object Model (POM) megvalósítása a modernebb eszközökkel (mint a Playwright vagy a Selenium Java-alapú változata) még letisztultabbá válik, mivel ezek a keretrendszerek beépített architektúrával támogatják a megbízhatóbb elemkezelést.
Az alábbiakban mindkét megközelítésre találsz egy-egy komplett kódmintát.
Playwright + TypeScript (Ajánlott / Modern megközelítés)
A Playwright eleve magában foglalja az automatikus várakozást (Auto-waiting), így nincs szükség explicit wait-ek kézi kezelésére.
A Tesztosztály (JUnit 5 használatával) (LoginTest.java)
Java
package tests;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import pages.LoginPage;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
public class LoginTest {
private WebDriver driver;
private LoginPage loginPage;
@BeforeEach
public void setUp() {
driver = new ChromeDriver();
driver.manage().window().maximize();
driver.get("https://example.com/login");
loginPage = new LoginPage(driver);
}
@Test
public void testSuccessfulLogin() {
loginPage.login("valid_user", "correct_password");
assertEquals("https://example.com/dashboard", driver.getCurrentUrl());
}
@Test
public void testFailedLogin() {
loginPage.login("invalid_user", "wrong_password");
assertTrue(loginPage.getErrorMessageText().contains("Érvénytelen adatok"));
}
@AfterEach
public void tearDown() {
if (driver != null) {
driver.quit();
}
}
}
Főbb különbségek a két megközelítés között
Szempont
Playwright (TypeScript)
Selenium (Java)
Lokátorok
A Locator objektumok deklaratívak (auto-wait)
A @FindBy elemek lekezeléséhez várakozás (WebDriverWait) kellhet
Párhuzamosítás
Alapból támogatott a tesztfutztatóban
TestNG vagy JUnit szálkezelést igényel
Inicializálás
Egyszerű objektumkonstruktor
PageFactory.initElements() hívás szükséges
A Playwright Custom Fixture funkciója segítségével a Page Object osztályok példányosítását teljesen kiszervezheted a tesztekből. Ezzel elkerülhető, hogy minden egyes tesztfájlban manuálisan kelljen megadni a const loginPage = new LoginPage(page) sorokat.
A tesztek így közvetlenül paraméterként kérhetik el a szükséges oldalobjektumokat, az infrastruktúra pedig automatikusan példányosítja és előkészíti azokat.
A Page Object osztályok (pages/)
A megszokott módon hozzuk létre az oldalklasszokat.
A Custom Fixture létrehozása (fixtures/baseTest.ts)
Itt terjesztjük ki a Playwright alapértelmezett test objektumát, megadva a saját Page Object fixture-jeinket.
TypeScript
import { test as base } from '@playwright/test';
import { LoginPage } from '../pages/LoginPage';
import { DashboardPage } from '../pages/DashboardPage';
// 1. Típusdefiníció a fixture-ökhöz
type MyFixtures = {
loginPage: LoginPage;
dashboardPage: DashboardPage;
};
// 2. A 'base.extend' használatával regisztráljuk a saját fixture-jeinket
export const test = base.extend<MyFixtures>({
// Automatikusan példányosítja a LoginPage-t és igény esetén megnyitja az oldalt
loginPage: async ({ page }, use) => {
const loginPage = new LoginPage(page);
await loginPage.goto(); // Akár előkészítő lépéseket is tehetünk ide
await use(loginPage); // Átadja az objektumot a tesztnek
},
// Példányosítja a DashboardPage-t
dashboardPage: async ({ page }, use) => {
const dashboardPage = new DashboardPage(page);
await use(dashboardPage);
},
});
// Az 'expect'-et is exportáljuk a kényelmes importálásért
export { expect } from '@playwright/test';
A Fixture-ök használata a tesztekben (tests/login.spec.ts)
A @playwright/test helyett a saját fixtures/baseTest fájlunkból importáljuk a test objektumot. A tesztfüggvény paramétereként megadott nevek alapján a Playwright automatikusan beadagolja a megfelelő példányokat.
TypeScript
// Figyelem: A saját kiterjesztett test objektumunkat importáljuk!
import { test, expect } from '../fixtures/baseTest';
test('Sikeres bejelentkezés custom fixture-rel', async ({ loginPage, dashboardPage }) => {
// A loginPage.goto() már lefutott a fixture-ben!
await loginPage.usernameInput.fill('standard_user');
// A dashboardPage is azonnal használható, nem kellett 'new'-val példányosítani
await expect(dashboardPage.userMenu).toBeVisible();
});
Miért ez a legnépszerűbb Playwright architektúra?
Nulla boilerplate kód: Nem kell beforeEach blokkokban példányosítani az osztályokat.
Lazy loading (Lusta betöltés): Csak azok a Page Object-ek példányosulnak, amiket a teszt fejlécében ({ loginPage, dashboardPage }) kifejezetten elkérsz.
Beépített tear-down: A fixture-ben a use() hívás utáni kódrészlet automatikusan lefut a teszt végén (takarításra, kijelentkezésre ideális).
Sosem voltam egy nagy karakter húszár, így előnybe részesítettem a grafikus ezközöket. Mostanában viszont egyre gyakrabban kényszerűlők rá, hogy parancssorosan oldjak meg dolgok, mint pl a GIT-elést. Gondoltam AI-val összegyűjtetem a legáltalánosabb parancsokat.
A leggyakrabban használt Git parancsok kategóriák szerint csoportosítva:
Alapvető beállítások & Inicializálás
git config --global user.name "Neved" – Beállítja a felhasználóneved a commitokhoz.
git config --global user.email "email@cimed.hu" – Beállítja az e-mail-címedet.
git init – Új, üres Git repót hoz létre az aktuális mappában.
git clone <URL> – Letölt egy meglévő távoli tárolót (repository-t) a gépedre.
Változások nyomon követése & Commit
git status – Megmutatja a munkamenet állapotát (módosított, követetlen fájlok).
git add <fájlnév> – Hozzáadja a megadott fájlt a Staging Area-hoz.
git add . – Az összes módosított és új fájlt hozzáadja a Staging Area-hoz.
git commit -m "Üzenet" – Elmenti a Staging Area-ban lévő változtatásokat a megadott üzenettel.
git diff – Megmutatja a még el nem mentett (unstaged) módosításokat.
Nézet & Történet
git log – Megjeleníti a korábbi commitok történetét.
git log --oneline – Tömör, egysoros formátumban listázza a commitokat.
Ágak kezelése (Branching)
git branch – Listázza a helyi ágakat.
git branch <ág-név> – Létrehoz egy új ágat.
git checkout <ág-név> – Átvált a megadott ágra.
git checkout -b <ág-név> – Létrehoz egy új ágat és egyből át is vált rá.
git merge <ág-név> – A megadott ág tartalmát összefésüli az aktuális ággal.
Távoli tároló (Remote)
git fetch – Letölti az új információkat a távoli tárolóból, de nem egyesíti őket.
git pull – Letölti és azonnal összefésüli a távoli ág változásait.
git push origin <ág-név> – Feltölti a helyi commitokat a távoli tárolóba.
Módosítások visszavonása
git restore <fájlnév> – Visszaállítja a fájlt a legutóbbi commit állapotára (eldobja a nem elmentett módosításokat).
git reset HEAD~1 – Visszavonja a legutóbbi commitot, de a fájlokban lévő módosításokat megőrzi.
Ma ilyen AI-s napom van. Egyre jobban tör be a mindennapi munkámba, és úgy tűnik, hogy a hétvégeimet is ez teszi ki. Miért? Kérdezheted joggal. Megmondom. Az IT-ban, de gyanítom a többi szakmában is jobb, ha értünk hozzá, és megtanuljuk rutinosan használni, mintsem lemaradjunk róla, és nézzük bambán, ahogy az élet felsuhan előttünk.
Nézzük, mire is mentem elsőre.
Az alábbi PowerShell-script végigpásztázza a megadott mappát (és annak almappáit), a fájlok SHA256 hash értéke alapján azonosítja a duplikációkat, majd az eredményt kiírja a képernyőre és elmenti egy CSV-fájlba.
PowerShell duplikáció-kereső script
Hozz létre egy find-duplicates.ps1 fájlt, és másold bele az alábbi kódot:
PowerShell
# --- BEÁLLÍTÁSOK ---
$TargetFolder = "C:\Elérési\Út\A\Mappához" # Cseréld ki a vizsgálandó mappa útvonalára
$OutputFile = "C:\Elérési\Út\duplikatumok.csv" # Ide menti az eredményt
Write-Host "Fájlok indexelése és hash értékek számítása..." -ForegroundColor Cyan
# 1. Összes fájl lekérése és méret szerinti csoportosítása (gyorsítási lépés)
$fileGroups = Get-ChildItem -Path $TargetFolder -Recurse -File -ErrorAction SilentlyContinue |
Group-Group-Object -Property Length |
Where-Object { $_.Count -gt 1 }
$duplicates = @()
$totalGroups = $fileGroups.Count
$counter = 0
# 2. Csak az azonos méretű fájlok SHA256 hash-ének ellenőrzése
foreach ($group in $fileGroups) {
$counter++
Write-Progress -Activity "Duplikátumok keresése" -Status "Fájlcsoportok feldolgozása: $counter / $totalGroups" -PercentComplete (($counter / $totalGroups) * 100)
$hashTable = $group.Group | Get-FileHash -Algorithm SHA256 | Group-Object -Property Hash | Where-Object { $_.Count -gt 1 }
foreach ($hashGroup in $hashTable) {
foreach ($file in $hashGroup.Group) {
$duplicates += [PSCustomObject]@{
Hash = $hashGroup.Name
Path = $file.Path
SizeMB = [math]::Round((Get-Item $file.Path).Length / 1MB, 2)
}
}
}
}
# 3. Eredmények megjelenítése és mentése
if ($duplicates.Count -gt 0) {
Write-Host "`nTalált duplikátumok:" -ForegroundColor Green
$duplicates | Format-Table -AutoSize -Property Hash, SizeMB, Path
$duplicates | Export-Csv -Path $OutputFile -NoTypeInformation -Encoding UTF8
Write-Host "Az eredmények elmentve ide: $OutputFile" -ForegroundColor Yellow
} else {
Write-Host "`nNem találhatók duplikált fájlok." -ForegroundColor Green
}
Így használd:
Nyisd meg a PowerShell-t (akár Rendszergazdaként, ha védett mappákat is vizsgálsz).
Írd át a $TargetFolder változót a keresni kívánt mappára.
Futtasd a scriptet:PowerShell.\find-duplicates.ps1
Megjegyzés: Ha a PowerShell letiltja a scriptek futtatását, futtasd ezt a parancsot a munkamenetben:
Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process
Majd második próbálkozásra
Módosítottam a scriptet, hogy a célmappát (és opcióként a kimeneti CSV-fájl helyét is) paraméterként fogadja el.
A módosított script kódja:
PowerShell
<#
.SYNOPSIS
Fájl duplikációkat kereső és gyűjtő PowerShell script.
.DESCRIPTION
A script végigpásztázza a paraméterként megadott mappát (és annak almappáit),
és az SHA256 hash értékek alapján azonosítja a duplikátumokat.
Az eredményt megjeleníti a konzolon és CSV-fájlba menti.
.PARAMETER TargetFolder
A vizsgálandó mappa útvonala (kötelező paraméter).
.PARAMETER OutputFile
A kimeneti CSV fájl útvonala (opcionális, alapértelmezett: .\duplikatumok.csv).
#>
[CmdletBinding()]
param(
[Parameter(Mandatory = $true, Position = 0, HelpMessage = "Kérjük, adja meg a vizsgálandó mappa útvonalát!")]
[ValidateScript({ Test-Path $_ -PathType Container })]
[string]$TargetFolder,
[Parameter(Mandatory = $false, Position = 1)]
[string]$OutputFile = ".\duplikatumok.csv"
)
# Abszolút útvonalak feloldása
$TargetFolder = (Resolve-Path $TargetFolder).Path
$OutputFile = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($OutputFile)
Write-Host "Mappa elemzése: $TargetFolder" -ForegroundColor Cyan
Write-Host "Fájlok indexelése és méret szerinti csoportosítása..." -ForegroundColor Cyan
# 1. Összes fájl lekérése és méret szerinti csoportosítása (gyorsítási lépés)
$fileGroups = Get-ChildItem -Path $TargetFolder -Recurse -File -ErrorAction SilentlyContinue |
Group-Object -Property Length |
Where-Object { $_.Count -gt 1 }
$duplicates = @()
$totalGroups = $fileGroups.Count
$counter = 0
if ($totalGroups -eq 0) {
Write-Host "`nNem találhatók azonos méretű fájlok, nincsenek duplikátumok." -ForegroundColor Green
exit
}
# 2. Csak az azonos méretű fájlok SHA256 hash-ének ellenőrzése
foreach ($group in $fileGroups) {
$counter++
Write-Progress -Activity "Duplikátumok keresése" -Status "Fájlcsoportok feldolgozása: $counter / $totalGroups" -PercentComplete (($counter / $totalGroups) * 100)
$hashTable = $group.Group | Get-FileHash -Algorithm SHA256 | Group-Object -Property Hash | Where-Object { $_.Count -gt 1 }
foreach ($hashGroup in $hashTable) {
foreach ($file in $hashGroup.Group) {
$duplicates += [PSCustomObject]@{
Hash = $hashGroup.Name
Path = $file.Path
SizeMB = [math]::Round((Get-Item $file.Path).Length / 1MB, 2)
}
}
}
}
# 3. Eredmények megjelenítése és mentése
if ($duplicates.Count -gt 0) {
Write-Host "`nTalált duplikátumok:" -ForegroundColor Green
$duplicates | Format-Table -AutoSize -Property Hash, SizeMB, Path
$duplicates | Export-Csv -Path $OutputFile -NoTypeInformation -Encoding UTF8
Write-Host "Az eredmények elmentve ide: $OutputFile" -ForegroundColor Yellow
} else {
Write-Host "`nNem találhatók duplikált fájlok." -ForegroundColor Green
}
Használati példák:
Alapértelmezett használat (a mappa elérést megadva, az eredmény a beállítások szerint a duplikatumok.csv-be kerül):PowerShell.\find-duplicates.ps1 -TargetFolder "C:\Users\Public\Documents"
Pozicionális paraméterként (nem kell kiírni a névadó kapcsolót):PowerShell.\find-duplicates.ps1 "D:\Képek"
Egyedi CSV kimeneti fájlnév megadásával:PowerShell.\find-duplicates.ps1 -TargetFolder "D:\Dokumentumok" -OutputFile "C:\Riportok\doksi_duplikatumok.csv"
Újdonságok a scriptben:
Automatikus mappa-ellenőrzés (ValidateScript): Ha nem létező vagy hibás mappa-útvonalat adsz meg, a script még a futás előtt jelez és leáll.
Mappa-kötelezőség (Mandatory = $true): Ha paraméter nélkül indítod el a scriptet, a PowerShell automatikusan megkérdezi tőled a célmappa útvonalát.
Nem vagyok teljes mértékben elragadtatva az eredménytől, de mára ez bőven elég volt, majd folytatjuk…
A Playwright 1.63 frissítése megérkezett, és számtalan olyan funkciót hoz, amelyek lényegesen egyszerűbbé teszik a komplex tesztelési munkafolyamatokat, a párhuzamosítást és a hibakeresést.
Az alábbiakban összefoglaltuk a kiadás legfontosabb újdonságait és fejlesztéseit.
Key Features & Újdonságok
1. Test Locks (Tesztreteszek)
Megoldást nyújt a közös erőforrások (pl. központi adatbázis, globális fiókbeállítások vagy külső API-k) használata miatti ütközésekre.
Lehetővé teszi zárolások (locks) megadását, így a tesztek automatikusan sorba állnak a kritikus erőforrások eléréséhez, elkerülve a párhuzamos futtatásból eredő hibákat.
2. Step paraméterek és feliratok (test.step)
A test.step() mostantól elfogad egy params opciót, amellyel saját metaadatokat és paramétereket adhatsz át a lépésekhez.
A riportokban és a Trace Viewerben tisztábban nyomon követhetők az egyedi lépésekhez tartozó változók és hívási argumentumok.
3. Aria Traces & Bővített Tracing
A Trace Viewer új aria pillanatképeket (snapshots) támogat.
Megkönnyíti a hozzáférhetőségi (accessibility) elemek és az ARIA fa állapotának elemzését hibakeresés közben.
4. Új Scroll Opciók az akcióknál
A legtöbb akciónál (pl. .click()) megjelent egy új scroll opció ("auto" | "none").
Lehetőséget biztosít arra, hogy kikapcsold a Playwright automatikus „scroll-into-view” viselkedését, ha egy elem pozícióját manuálisan szeretnéd kezelni.
5. Új teszt opciók és CLI parancsok
Nagyobb hozzáférhetőség tesztelése: Új reducedMotion, forcedColors és contrast opciók a testOptions alatt.
--add-reporter parancssori opció: Bővítheted a meglévő riporterek listáját ahelyett, hogy felülírnád a playwright.config.ts-ben megadottakat.
omitTags opció: Letisztultabb tesztcímek a riportokban (suppress-eli az automatikusan hozzáfűzött tegeket a list, line, dot, github és junit riportereknél).
Eltávolított (Deprecated) API-k
A 1.63-as verzió végleg kivezeti a régen elavultnak jelölt funkciókat:
Locator.ariaRef() (használd helyette a locator.ariaSnapshot() funkciót).
handle opció a BrowserContext.exposeBinding és Page.exposeBinding esetében.
logger opció a BrowserType.connect és connectOverCDP metódusoknál.
videosPath és videoSize konfig opciók (használd a recordVideo-t).
Frissítés
A legújabb verzióra való átálláshoz futtasd a projekt gyökerében az alábbi parancsot:
A Playwright 1.63-ban megjelent Test Locks (Tesztreteszek) opció segítségével megakadályozhatod, hogy bizonyos tesztek egyszerre futjanak és ütközzenek a közös erőforrásokon (pl. ugyanazon tesztfiók beállításai, adatbázis vagy külső API-k), miközben a többi független teszt továbbra is párhuzamosan fut.
Az alábbiakban bemutatjuk a legfontosabb használati módokat kódpéldákkal.
1. Egyedi teszt zárolása egy megnevezett retesszel (lock)
Ha van két vagy több teszted, amelyek ugyanazt a megosztott erőforrást módosítják, megadhatsz nekik egy azonos lock nevet az opciók között:
TypeScript
import { test, expect } from '@playwright/test';
// Ez a teszt lefoglalja az 'admin-account' reteszt
test('Adminisztrátor frissíti a cég nevét', { lock: 'admin-account' }, async ({ page }) => {
await page.goto('https://example.com/admin/settings');
await page.getByLabel('Cégnév').fill('Új Cégnév Kft.');
await page.getByRole('button', { name: 'Mentés' }).click();
await expect(page.getByText('Sikeres mentés')).toBeVisible();
});
// Ez a teszt megvárja, amíg az előző teszt elengedi az 'admin-account' reteszt
test('Adminisztrátor módosítja az időzónát', { lock: 'admin-account' }, async ({ page }) => {
await page.goto('https://example.com/admin/settings');
await page.getByLabel('Időzóna').selectOption('Europe/Budapest');
await page.getByRole('button', { name: 'Mentés' }).click();
await expect(page.getByText('Sikeres mentés')).toBeVisible();
});
Hogyan működik? Amíg a Worker 1 az első tesztet futtatja az admin-account retesszel, addig a Worker 2 nem kezdi el a második tesztet. A két teszt egymás után fog lefutni, de a csomag többi, független tesztje (pl. termékkeresés, kosárkezelés) továbbra is teljesen párhuzamosan fut a többi workeren.
2. Egész tesztcsoport zárolása (test.describe)
Ha egy egész blokknyi teszt egyetlen közös erőforráson dolgozik, a lock opciót közvetlenül a test.describe() csoportra is ráteheted:
Egy teszt akár több megosztott erőforrás zárolását is kérheti egyszerre. Ehhez adj meg egy tömböt a lock paraméterben:
TypeScript
import { test, expect } from '@playwright/test';
test(
'Fizetési átjáró és szállítási beállítások egyidejű frissítése',
{ lock: ['payment-sandbox', 'shipping-api'] },
async ({ page }) => {
// Ez a teszt csak akkor indul el, ha mindkét retesz szabad
await page.goto('https://example.com/admin/integrations');
// ... teszt kód
}
);