E2e bataryası Cluster ERP'nin tarayıcı test koşusudur. Tek bir Node betiği, web-client/_run_battery.mjs, her _e2e_*.mjs süitini sırayla tek bir test örneğine karşı çalıştırır ve bir günlük yazar. Dört ortak modül süitlere hedef adreslerini, test hesaplarını, fikstürlerini ve temiz bir ana ekran yerleşimini verir. Bu sayfa koşuyu ve yalıtım kurallarını açıklar; süitlerin kendileri e2e süit kataloğu sayfasında listelenir.
Kısaca¶
- Koşucu süitleri birbiri ardına çalıştırır, çünkü tek bir sunucuyu ve tek bir veritabanını paylaşırlar (
web-client/_run_battery.mjs:15-16). - Bir süit yalnız
N passed, M failedbiçiminde,Msıfır olan bir satır yazdığında geçer; bu satırı yazmadan çıkan süit başarısızlık sayılır (web-client/_run_battery.mjs:18-20,web-client/_run_battery.mjs:110-119). - Hedef adres ve test veritabanı adı tek bir ortak modülden gelir ve varsayılan hedef geliştirme sunucusu değil, yerel test örneğidir (
web-client/_shared_e2e_base.mjs:4-17,web-client/_shared_e2e_base.mjs:40-46). - Ana ekran yerleşimine dokunan süitler, test hesabının yerleşimini kaydedip geri yükleyen arayüz durumu bekçisini kullanmalıdır (
web-client/_ui_state_guard.mjs:1-11,tests/test_e2e_db_isolation.py:177-200). - CI bataryayı çalıştırmaz; batarya bir etiket kesilmeden önce staging düğümünde çalışır (
.github/workflows/ci.yml:21-22).
Nasıl çalışır¶
Koşu¶
Akış şeması bir batarya koşusunu gösterir.
flowchart TD
start["node _run_battery.mjs"] --> list["_e2e_*.mjs topla, --filter ve --exclude uygula, sırala"]
list --> h1{"GET /health 200 mü?"}
h1 -->|hayır| stop["çıkış 2: sunucu yanıt vermiyor"]
h1 -->|evet| loop["sonraki süiti node ile başlat"]
loop --> wait{"süre dolmadan sonuç satırı yazıldı mı?"}
wait -->|evet| add["geçen ve kalan sayıları toplama ekle"]
wait -->|hayır| broken["1 başarısızlık say, süiti adlandır"]
add --> more{"başka süit var mı?"}
broken --> more
more -->|evet| loop
more -->|hayır| h2{"GET /health 200 mü?"}
h2 -->|hayır| inc["çıkış 2: koşu sonuçsuz"]
h2 -->|evet| done["başarısızlık yoksa çıkış 0, varsa 1"]Düzyazıyla:
- Koşucu
web-client/içinde adı_e2e_ile başlayıp.mjsile biten dosyaları listeler,--filterve--excludeuygular ve sıralar (web-client/_run_battery.mjs:42-46).--listile listeyi yazar ve durur (web-client/_run_battery.mjs:48-52). - Hedefin
/healthrotasını sorar. Yanıt 200 değilse hiçbir şey çalıştırmadan 2 koduyla çıkar (web-client/_run_battery.mjs:54-70). - Her süiti ayrı bir Node süreci olarak başlatır ve çıktısını toplar (
web-client/_run_battery.mjs:78-99). Süre sınırından uzun çalışan bir süit öldürülür ve süresi dolmuş olarak kaydedilir. Varsayılan süre 900 saniyedir;--timeoutbunu değiştirir (web-client/_run_battery.mjs:39-41,web-client/_run_battery.mjs:83-93). - Sonuç satırını okur, sayıları ekler ve başarısızlığı olan veya sonuç satırı olmayan her süiti adlandırır (
web-client/_run_battery.mjs:110-119). - Sonunda
/healthrotasını yeniden sorar, toplamları ve başarısız süitleri günlüğe yazar; hiçbir şey başarısız olmadıysa 0, bir şey başarısız olduysa 1, sunucu yanıt vermeyi bıraktıysa 2 koduyla çıkar (web-client/_run_battery.mjs:124-137).
Koşucu seçenekleri¶
| Seçenek | Etki | Kaynak |
|---|---|---|
--log <name> |
Günlük dosyası adı; varsayılan battery.log |
web-client/_run_battery.mjs:8-9, web-client/_run_battery.mjs:33 |
--filter <text> |
Yalnız dosya adı metni içeren süitleri çalıştırır | web-client/_run_battery.mjs:10, web-client/_run_battery.mjs:44 |
--exclude <a,b> |
Dosya adı metinlerden birini içeren süitleri dışarıda bırakır | web-client/_run_battery.mjs:11, web-client/_run_battery.mjs:35-38 |
--list |
Çalışacak süitleri yazar, sonra durur | web-client/_run_battery.mjs:12, web-client/_run_battery.mjs:48-52 |
--timeout <seconds> |
Süit başına sınır, varsayılan 900 | web-client/_run_battery.mjs:13, web-client/_run_battery.mjs:41 |
web-client/ içinden tipik bir tam koşu:
node _run_battery.mjs --log battery
Kaynak: web-client/_run_battery.mjs:8-13.
Ortak temel modül¶
Her süit web-client/_shared_e2e_base.mjs modülünü import eder (197 süitin 197'si, grep -L ile sayıldı). Sağladıkları:
| Dışa aktarım | Amaç | Kaynak |
|---|---|---|
APP_URL, API_URL, E2E_BASE |
CLUSTER_E2E_BASE üzerinden kurulan hedef adresler |
web-client/_shared_e2e_base.mjs:14-17 |
E2E_TENANT_DOMAIN, asLogin |
Çok kiracılı bir düğümde, CLUSTER_E2E_TENANT_DOMAIN üzerinden tek bir kiracıyla oturum açma |
web-client/_shared_e2e_base.mjs:19-38 |
E2E_DB_NAME, E2E_DB_HOST |
Bir süitin doğrudan ulaşabileceği veritabanı, CLUSTER_E2E_DB ve CLUSTER_E2E_DB_HOST üzerinden |
web-client/_shared_e2e_base.mjs:40-48 |
E2E_SERVER_ENV, SELF_HOSTED_MT_BASE |
Kendi sunucusunu başlatan süitler için ortam ve adres | web-client/_shared_e2e_base.mjs:61-90, web-client/_shared_e2e_base.mjs:108 |
ROOT, PG_BIN, pgTool |
Platforma göre çözülen depo yolu ve PostgreSQL istemci araçları | web-client/_shared_e2e_base.mjs:110-130 |
waitForServerHealth, killTree |
Kendi başlatılan sunucuyu bekleme; her platformda bir süreç ağacını durdurma | web-client/_shared_e2e_base.mjs:139-184 |
goHome, gotoHome |
Arka plandaki bir uygulama geri yüklense bile ana ekrana dönme | web-client/_shared_e2e_base.mjs:186-228 |
holdPress |
Sayfa hareketi onaylayana kadar basılı tutan uzun basma | web-client/_shared_e2e_base.mjs:230-261 |
appModuleUrl |
Bir web modülünün sayfanın yüklediği biçimdeki URL'si | web-client/_shared_e2e_base.mjs:277-287 |
report |
Sonuç satırını yazar ve boruya ulaşana kadar bekler | web-client/_shared_e2e_base.mjs:263-295 |
Doğrudan veritabanı yardımcılarının kullandığı parolalar ortam değişkenlerinden gelir; değerleri güvenlik ifşa politikası gereği verilmez.
Arayüz durumu bekçisi¶
Ana ekran yerleşimi sunucudaki kullanıcı hesabına aittir (bkz. sunucu tarafı arayüz durumu). guardUiState ayrılmış test hesabıyla oturum açar, yönetici hesabıyla devam etmeyi reddeder, hesabın saklanan yerleşim anahtarlarını kaydeder, bilinen bir test tahtası yazar ve süreç bittiğinde, çökme veya kesinti olsa bile, özgün değerleri geri yükler (web-client/_ui_state_guard.mjs:34-49, web-client/_ui_state_guard.mjs:114-195). Koruduğu anahtarlar DEFAULT_KEYS içinde listelenir (web-client/_ui_state_guard.mjs:106-113). guardUiStateWithApps test tahtasına uygulama kutucukları ekler (web-client/_ui_state_guard.mjs:91-97). 118 süit guardUiState çağırır (grep -l ile sayıldı).
Fikstürler¶
web-client/_shared_fixtures.mjs ön koşulları bir kullanıcının yapacağı gibi açık API üzerinden oluşturur ve veri zaten varsa hiçbir şey yapmaz (web-client/_shared_fixtures.mjs:1-4). Örnekler ensureGroupWorkweek, ensureRfqWithVendor ve ensureRichBom'dur (web-client/_shared_fixtures.mjs:42, web-client/_shared_fixtures.mjs:61, web-client/_shared_fixtures.mjs:266). 18 süit bunu import eder. web-client/_shared_history.mjs analitik süitleri için bugüne göre göreli bir pencerede satış siparişi ve üretim geçmişi kurar (web-client/_shared_history.mjs:1-13, web-client/_shared_history.mjs:22-29). 7 süit bunu import eder.
Neden böyle kurulmuştur¶
Gerekçeler kodda belirtilir. Varsayılan hedef test örneğidir; böylece dikkatsiz bir koşu kullanıcının verisine ulaşamaz (web-client/_shared_e2e_base.mjs:4-13). Veritabanı adı temel adresle birlikte taşınır, çünkü bir süit bir zamanlar test edilenden farklı bir veritabanına yazmıştı (tests/test_e2e_db_isolation.py:3-18). Koşucu takılan bir süiti öldürür; böylece takılan tek bir tarayıcı bir gece koşusunu durdurmaz (web-client/_run_battery.mjs:75-77). report yazmayı bekler, çünkü process.exit() yük altında bir boruda sonuç satırlarını kaybetmişti (web-client/_shared_e2e_base.mjs:263-276).
Kurallar ve sınırlar¶
tests/test_e2e_db_isolation.py her süiti metin olarak okur ve şu kuralları uygular:
| Kural | Kaynak |
|---|---|
Veritabanına ulaşabilen bir alt süreç başlatan süit CLUSTER_ERP_DB_NAME değerini E2E_DB_NAME üzerinden verir |
tests/test_e2e_db_isolation.py:64-106 |
Kendi sunuculu bir süit yalnız test işaretini taşıyan veritabanlarını adlandırır |
tests/test_e2e_db_isolation.py:51-91 |
| Hiçbir süit bir sunucu adresini veya portunu sabit değer olarak yazmaz | tests/test_e2e_db_isolation.py:109-128 |
| Ortak yardımcı bir süit gibi adlandırılmaz | tests/test_e2e_db_isolation.py:131-139 |
Tek tırnaklı hiçbir metin ${...} yerleştirmeye çalışmaz |
tests/test_e2e_db_isolation.py:142-174 |
| Ana ekran yerleşimini okuyan veya yazan süit arayüz durumu bekçisini kullanır | tests/test_e2e_db_isolation.py:177-200 |
Yedi süit kendi sunucusunu başlatır ve kendi sunuculudur (grep -l CLUSTER_ERP_SERVER_PORT ile sayıldı): _e2e_operator_console.mjs, _e2e_residency.mjs, _e2e_sep_companies.mjs, _e2e_sep_roles.mjs, _e2e_tenant_isolation.mjs, _e2e_tenant_regions.mjs ve _e2e_tenant_signup.mjs. Koşucu yorumu, batarya uzak bir düğüme karşı çalıştığında bunların ve bölge süitinin dışarıda bırakıldığını söyler (web-client/_run_battery.mjs:35-37).
Diğer parçalarla etkileşim¶
Batarya çalışan bir test örneği ister; sunucunun nasıl başlatılacağı yerel geliştirme kurulumu sayfasındadır. Staging'den üretime terfi batarya sonucunu kullanır; bkz. ortamlar ve terfi. pytest yalıtım bekçisi, batarya çalışmasa da CI'da çalışır (.github/workflows/ci.yml:124).
Sınırlar ve açık noktalar¶
web-client/klasöründe her tarihsel koşu için bir tane olmak üzere eski numaralı PowerShell koşu betikleri ve geçmiş koşuların birçok günlük dosyası da vardır. Koşucu başlığı, bu koşu başına betiklerin yerini aldığını söyler (web-client/_run_battery.mjs:5-6). Güncel yöntemin parçası değildirler ve tek tek anlatılmazlar.- Koddan belirlenemedi: bataryanın bir zamanlaması.
.github/workflows/veyadeploy/içinde_run_battery.mjsiçin bir zamanlayıcı girdisi yoktur.
Tanıtılan terimler¶
| Terim | Kod tanımlayıcısı | Tanım | Türkçe terim | Kaynak |
|---|---|---|---|---|
| e2e battery | _run_battery.mjs |
Her tarayıcı süitinin tek bir test örneğine karşı, tek günlük ve tek toplamla sıralı koşusu. | E2e bataryası | web-client/_run_battery.mjs:1-20 |
| e2e suite | _e2e_*.mjs |
Web uygulamasını veya API'yi süren ve bir sonuç satırı yazan tek bir Node betiği. | E2e süiti | web-client/_run_battery.mjs:42-46 |
| result line | report |
Bir süitin yazdığı ve koşucunun okuduğu N passed, M failed satırı. |
Sonuç satırı | web-client/_shared_e2e_base.mjs:289-295 |
| self-hosted suite | SELF_HOSTED_MT_BASE |
Ortak test örneğini kullanmak yerine kendi sunucusunu ve veritabanlarını başlatan süit. | Kendi sunuculu süit | tests/test_e2e_db_isolation.py:51-60 |
| ui-state guard | guardUiState |
Bir süite bilinen bir ana ekran yerleşimi veren ve sonra hesabın yerleşimini geri yükleyen yardımcı. | Arayüz durumu bekçisi | web-client/_ui_state_guard.mjs:114 |
İlgili sayfalar¶
92f8051 numaralı commit ile 2026-11-13 tarihinde doğrulandı.