Pre programátorov · Java + TestNG + Selenium

Ako to funguje vnútri

Celá automatizácia je Maven projekt s TestNG testami. Jenkins job nerobí nič iné, než že spustí test s parametrami — a test potom kombinuje tri veci: Selenium (preklikanie Spinj), API volania (ESB) a databázu (generovanie údajov). Selenium časť je v jadre „find element + click“ — dôležité je pochopiť tok dát okolo nej.

Celý tok od Buildu po e-mail

Jenkins odovzdá parametre testu

Polia z „Build with Parameters“ sa do JVM dostanú ako system properties (-Demail=…, -Dsegment=…). Test si ich číta cez System.getProperty s rozumnými defaultmi.

Validácia vstupov (fail-fast)

E-mail regexom, telefón presne 12 číslic, suma musí byť číslo — a ak je nad 50 000, potichu sa zníži na 50 000. Zlý vstup zhodí beh hneď na začiatku, nie po piatich minútach klikania.

Príprava dát: IČO, meno firmy, majiteľ

IČO sa vygeneruje (8-miestne číslo); pre municipality sa berie náhodné reálne IČO zo súboru mun_ico.csv. Unikátne meno firmy sa skladá cez DB + BeastMachine. Majiteľ (fyzická osoba) sa vytvorí vopred cez SOAP — nie klikaním.

Selenium: založenie klienta v Spinj (NE64)

Page objecty prekliknú NE64: údaje, sektor, kategória a segment (podľa segment/templates.json), pridanie majiteľa, KYC, marketingové súhlasy, uloženie, podpis, archív dokumentov. Na konci sa vyčíta nové CIS_ID.

Reštart prehliadača, potom účet (IN03 → IN19)

Browser sa zavrie a otvorí nanovo (Edge, 1920×1080), aby nezhavaroval celý proces. Nové prihlásenie, otvorenie účtu cez IN03 na existujúce CIS_ID, dohľadanie cez IN19 — výsledkom je IBAN.

API cez ESB: platba nefunguje · podpis funguje

Nadotovanie = vygenerovanie payment document ID + vytvorenie platby cez ESB — táto časť aktuálne padá. Podpisový vzor a oprávnenia k účtu sa nastavia API volaním v poriadku. Voliteľne nasleduje úver (createLoan) a kontokorent (createOverdraft).

Zápis CSV a e-mail

Po dobehnutí všetkých klientov (@AfterSuite) sa zapíše results/<názov>.csv so zoznamom vytvorených klientov a Jenkins ho pošle e-mailom.

Kde kód žije

Balík sk.vub.autotests.SPINJ; Finstat časť má vlastný balík sk.vub.autotests.FINSTAT.

Trieda / miestoRolaPoznámka
tests.LEClientAndAccountTestTestNG test — vstupný bodČíta parametre, validuje, volá helper, zbiera výsledky a zapisuje CSV.
helper…selenium.LegalEntityAndAccountHelperOrchestrácia celého scenáraPoradie krokov: klient → účet → dotácia → podpis → úver/kontokorent.
pages.*Selenium page objectyLoginPage, SpinjMainPage, SearchingClientPage, NE64PravnickaOsobaPage, NE64PSektorPage, NE64PMajitelPage, NE64PdotaznikKYCPage, IN03Page, PV01ShowPage, IN19Page. Vnútri „find element + click / fill“.
providers.*Generátory dátLegalEntityDataProvider (dataProvider testu), NameProvider (meno firmy), CompanyNumbersProvider (IČO).
objects.*Dátové objektyNewClient, Account, Customer, NewClientOwner, DatabaseConnection…
helper.requests.*API helpery (ESB)ExecutePaymentRequestHelper (platba), AccountRequestHelper (podpisový vzor), LoanServiceHelper, OverdraftServiceHelper.
resources/segment/templates.jsonMapa segmentovSegment → sektor / kategória / právna forma; pre corporate a sme_retail vnorené podľa businessType.
FINSTAT.tests.FinstatTestFinstat AUTO jobinsertFinancialStatementOnLegalEntity — vloženie výkazu (rok 2024) a final ratingu vo Finstat Viewer.

Kľúčové miesta v kóde

LEClientAndAccountTest — parametre prichádzajú z Jenkinsu ako system properties

String amountParam    = System.getProperty("amount", "10000").replace(" ", "");
String userEmail      = System.getProperty("email", "jantal@vub.sk").replace(" ", "");
String phoneNumber    = System.getProperty("phoneNumber", "421915558385").replace(" ", "");
String segmentChoice  = System.getProperty("segment", "default").replace(" ", ""); // načítanie z Jenkins
String businessType   = System.getProperty("businessType", "sro").replace(" ", "");
String finalRating    = System.getProperty("finalRating", "").replace(" ", "");

Validácia vstupov — zlý vstup zhodí beh hneď na začiatku

if (!newClient.getEmail().matches("^(.+)@(\\S+)$")) {
    throw new AssertionError("Zadaj platny email do userEmail…");
}
else if (!newClient.getPhoneNumber().matches("^\\d{12}$")) {
    throw new AssertionError("Zadaj cislo na mobile vo formate: 421905123456…");
}
// suma musí byť číslo („veľa“ ani „sto“ neprejde) a viac než 50 000 sa zníži:
if (amountNumber > 50000) { account.setAmount("50000"); }

LegalEntityAndAccountHelper — odkiaľ sú IČO, meno firmy a nastavenie segmentu

// IČO: municipalita berie reálne IČO zo súboru, ostatné segmenty generované 8-miestne číslo
if (!newClient.getSegment().equals(municipality)) {
    companyNumber = generateEightDigitNumber();
} else {
    companyNumber = getRandomNumberFromFile();          // mun_ico.csv
}

// unikátne meno firmy: databáza + BeastMachine
DatabaseConnection db = new DatabaseConnection(urlDB, schemaDB, usernameDB, passwordDB);
String companyName = generateFiveDigitAndWordCompanyName(db, beastMachineHelper);

// segment → právna forma/sektor: resources/segment/templates.json;
// pre corporate a sme_retail sa šablóna vyberá ešte podľa businessType
JsonNode segment = json.get(newClient.getSegment());
JsonNode resultSegment = (corporate || sme_retail) ? segment.get(businessType) : segment;

Nadotovanie účtu — presne toto je miesto, ktoré teraz nefunguje

public void legalEntityTopUpAccount(NewClient newClient, Account account) throws Exception {
    ExecutePaymentRequestHelper paymentRequestHelper = new ExecutePaymentRequestHelper();
    if (!account.getAmount().equals("0")) {
        String generatedPaymentId = paymentRequestHelper.vygenerujPaymentDocumentId(endpointESB);
        String pgwId = paymentRequestHelper.vytvorPlatbu(newClient, account, endpointESB, generatedPaymentId);
        logInfo("PgwId platby: " + pgwId);   // aktuálne: PgwId platby: null
    }
}

Výstupné CSV — @AfterSuite pozbiera všetkých vytvorených klientov

legalEntityData = legalEntityArray.stream().map(n -> counter.getAndIncrement()
        + ". Cis_id: "       + n.getId()
        + ", Ucet: "          + n.getIban()
        + ", Majitel/Staturar: " + n.getCustomer().getCustomerId()
        + ", Segment: "       + n.getSegment()
        + ", Pobocka: "       + n.getBranch()
        + ", FinalRating: "   + n.getFinalRating())
    .collect(Collectors.toList());

File file = new File("./results/" + legalEntityCsv + ".csv");   // Jenkins ho pošle e-mailom

Známe problémy a kam siahnuť

ProblémPrejavKde hľadať
Nadotovanie účtu V extent reporte „Nepodarilo sa nadotovat ucet: Index 0 out of bounds for length 0“ a „PgwId platby: null“. Job aj tak skončí Pass, účet má nulový zostatok. ExecutePaymentRequestHelper.vytvorPlatbu — spracovanie odpovede ESB platobnej služby vracia prázdne pole (index 0 na prázdnom zozname). Chyba je chytená, beh pokračuje. Rieši sa prechodom na ACE: odpovede z ACE už chodia, dolaďujú sa detaily — po dokončení pôjde nadotovanie cez ACE aj pre PO.
Účelový úver (createLoan) V poslednom behu SOAP volanie createLoan/1.0 vrátilo CRL-TECHNICAL : null → „Commercial loan creation failed“. LoanServiceHelper.createCommercialLoan. Môže súvisieť s prázdnym účtom (nefunkčné nadotovanie) — úver sa čerpá voči účtu.
Kontokorent — limity Kontokorent sa zriadi, ale limity sa nenastavujú. Zámerne vypnuté: volanie setOverdraftLoanLimits je v kóde zakomentované („podľa dohody zatiaľ neprestavujeme limity“).
Dočasná alternatíva na dotovanie účtu

Data Forge obsahuje šablónu „Nadotovanie účtu (data_nadotovanie_uctu.csv)“ — môže poslúžiť ako náhrada, kým sa platba cez ESB neopraví. Funkčnosť si najprv over na jednom účte.

Detaily, ktoré sa oplatí vedieť

  • Prečo sa medzi klientom a účtom reštartuje prehliadač: nová inštancia Edge (1920×1080) chráni beh pred zamrznutím Spinj po dokončení NE64 — je to zámer, nie chyba.
  • Vstupné parametre sa menia: podľa požiadaviek používateľov pribúdajú polia (napr. naceCode, legalForm). Ak formulár vyzerá inak než screenshoty, riadiš sa popismi pri poliach — validačné hlášky ťa navedú.
  • Viac klientov na jeden build: newClientCount vytvára klientov sekvenčne — každý ďalší klient pridá k behu ďalších cca 7 minút.
  • Prihlasovacie údaje a endpointy (Spinj login, DB, ESB) žijú v property súbore per prostredie — job (T) a (W) sa líšia práve týmto súborom, kód je rovnaký.
  • Čistý klient bez účtu: odškrtnutý createAccount preskočí celú druhú polovicu flow — vrátane úveru a kontokorentu (sú závislé na účte).