Factorizer/Cluster ERP WikiCluster ERP English
Ana sayfa / Katkı

Açıklama

E2e bataryası

Cluster ERP tarayıcı e2e bataryasının her _e2e_*.mjs süitini tek bir test örneğine karşı nasıl çalıştırdığı ve ortak yardımcıların test veritabanını nasıl yalıttığı.

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 failed biçiminde, M sı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:

  1. Koşucu web-client/ içinde adı _e2e_ ile başlayıp .mjs ile biten dosyaları listeler, --filter ve --exclude uygular ve sıralar (web-client/_run_battery.mjs:42-46). --list ile listeyi yazar ve durur (web-client/_run_battery.mjs:48-52).
  2. Hedefin /health rotasını sorar. Yanıt 200 değilse hiçbir şey çalıştırmadan 2 koduyla çıkar (web-client/_run_battery.mjs:54-70).
  3. 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; --timeout bunu değiştirir (web-client/_run_battery.mjs:39-41, web-client/_run_battery.mjs:83-93).
  4. 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).
  5. Sonunda /health rotası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/ veya deploy/ içinde _run_battery.mjs iç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ı.

Doğrulanan commit 92f8051 · 2026-11-13