Preskoči na vsebino

Orodja za testiranje in testne značke

run_pytest_repo.sh in publish_repo_badges.sh: cevovod testiranja in objave značk PMIVerse/PMISuite.

1. Pregled

run_pytest_repo.sh izvede pytest-odoo po dodatkih, ustvari dnevnike, JUnit XML, pokritost ter posamezne in skupne značke SVG ter vzdržuje povezavo latest. publish_repo_badges.sh kopira najnovejše SVG v .badges/tests/ repozitorija in jih izbirno potrdi ter pošlje. README tako prikazuje značke iz lastnega repozitorija brez zunanjih storitev.

Kanonična politika za običajno delo zahteva omejeni izbor --addons; celoten repozitorij zahteva izrecno odobritev. Izvajalnik ustvarja in odstranjuje začasne baze PostgreSQL.

2. run_pytest_repo.sh — Izvajalnik testov repozitorija

2.1 Namen

Izvede pytest za vse dodatke s tests/ pod repozitorijem ali za izrecni seznam map. Temelji na pytest-odoo: loči dodatke v začasne baze, omogoča zaporedno/vzporedno delo, zapiše strukturirane dnevnike v časovno označeno mapo, povzetke CSV/JSON in značke SVG dodatkov ter celote.

2.2 Uporaba

run_pytest_repo.sh --repo <repo_root> [options] [-- PYTEST_ARGS]
run_pytest_repo.sh --addons <addon_dir1> [<addon_dir2> ...] [options] [-- PYTEST_ARGS]

Možnosti

Možnost Opis
--repo <path> Koren repozitorija dodatkov.
--addons <paths...> Izrecni dodatki, vsak z __manifest__.py.
--pattern <glob> Vključitveni vzorec imen, privzeto *.
--exclude <glob> Izključitveni vzorec imen.
--db-prefix <prefix> Predpona začasnih baz, privzeto test_.
--parallel <N> Največ sočasnih dodatkov, privzeto samodejno, vsaj 4, če je izvedljivo.
--stop-on-first-fail Ustavi obdelavo po prvem neuspešnem dodatku.
--only-changed [<ref>] Samo spremenjeni glede na Git ref, privzeto origin/18.0.
--no-junit Brez JUnit XML.
--no-coverage Brez merjenja pokritosti tudi ob razpoložljivem vtičniku.
--keep-db Ohrani baze namesto brisanja pred in po zagonu.
-h, --help Pomoč in izhod.

Argumenti po -- gredo neposredno v pytest. --keep-db se posreduje vsakemu izvajalniku pred tem ločilom, ohrani bazo ob uspehu in napaki ter preskoči začetno/končno čiščenje. Brez njega ostane čiščenje vključeno.

Vzporedni način uporablja sprotni nabor delavcev: ob zaključku dodatka v prostem mestu začne naslednjega brez čakanja drugih. Hkrati teče največ N dodatkov; vsi začeti se zaključijo pred povzetkom. Potreben je Bash 4.3 ali novejši.

2.3 Odkrivanje vhodov

Izrecni --addons zahteva __manifest__.py in upošteva samo mape s tests/. --repo poišče manifeste pod korenom, filtrira tests/, uporabi --pattern/--exclude in po potrebi --only-changed [<ref>] prek git diff. Brez ustreznih dodatkov vrne kodo 2.

2.4 Izhodna struktura

Vsak zagon ustvari novo korensko mapo dnevnikov:

/srv/pmiverse/logs/tests/<timestamp>/
    summary.txt
    summary.json
    <addonA>.log
    <addonA>.exit
    <addonA>/
        junit.xml
        coverage.xml
        htmlcov/...
        coverage.pct
    <addonB>.log
    <addonB>.exit
    <addonB>/
        ...
    badges/
        summary.svg
        <addon>_status.svg
        <addon>_coverage.svg

Vzdržuje se tudi povezava:

/srv/pmiverse/logs/tests/latest → /srv/pmiverse/logs/tests/<timestamp>/

latest je stabilni vir za publish_repo_badges.sh.

2.5 Izvedba po dodatkih

tests/odoo_dependencies.txt lahko navede testne aplikacije Odoo, eno ime na vrstico; dovoljene so prazne vrstice in celovrstični komentarji #. Delegirani izvajalnik preveri datoteko in aplikacije namesti skupaj s ciljnim dodatkom pred pytest. Neprazna deklaracija zahteva bazo test_*; ločena priprava ali --keep-db za svež zagon nista potrebna. Produkcijske odvisnosti manifesta ostanejo enake; aplikacije morajo biti na nastavljeni poti dodatkov. Napaka namestitve povzroči neuspeh.

Za vsak dodatek se izpelje ime baze:

<db-prefix><addon_name>

Nato se pokliče izvajalnik:

/srv/pmiverse/_pmiconfig/scripts/test/run_pytest_addon.sh \
    -a <addon_dir>/tests -d <db_name> -- <per-addon pytest args>

Izhod se prek tee zapiše v <addon>.log, koda v <addon>.exit. Argumenti pytest vključijo JUnit, če ni izklopljen, razpoložljivo vključeno pokritost in dodatni PYTEST_ARGS.

2.6 Pokritost

Privzeto vključeno merjenje poskusi odkriti pytest-cov s Python virtualnega okolja instance, njegovim pytest ali globalnim pytest. Če ga ni, merjenje izklopi in izpiše sporočilo. Aktivno merjenje doda:

-p pytest_cov
--cov=odoo.addons.<addon_name>
--cov-report=term-missing:skip-covered
--cov-report=xml:<addon_dir>/coverage.xml
--cov-report=html:<addon_dir>/htmlcov

coverage.pct se izpelje iz atributa XML line-rate in shrani kot odstotek, npr. 92.5.

2.7 Povzetki

summary.txt

Povzetek CSV:

Addon,Status,ExitCode,Log
addon_a,PASSED,0,/srv/pmiverse/logs/tests/<ts>/addon_a.log
addon_b,FAILED,1,/srv/pmiverse/logs/tests/<ts>/addon_b.log
...

summary.json

Minimalni seznam JSON z vnosi dodatkov:

[
  {
    "addon": "addon_a",
    "status": "PASSED",
    "exit": 0,
    "log": "/srv/.../addon_a.log",
    "junit": "/srv/.../addon_a/junit.xml",
    "coverage_xml": "/srv/.../addon_a/coverage.xml",
    "coverage_pct": "92.5",
    "htmlcov": "/srv/.../addon_a/htmlcov"
  }
]

Primeren je za API, nadzorne plošče in nadaljnja poročila.

2.8 Značke

SVG nastanejo pod:

/srv/pmiverse/logs/tests/<timestamp>/badges/

Značke dodatkov

<addon>_status.svg prikazuje PASSED/FAILED, <addon>_coverage.svg nastane ob izračunani pokritosti. Uspeh je zelen #4c1, neuspeh rdeč #e05d44. Pokritost je zelena pri ≥ 90 %, rumena #dfb317 pri ≥ 75 % in < 90 %, rdeča pod 75 % in siva #9f9f9f, ko ni na voljo.

Skupna značka

summary.svg prikazuje oznako tests in <passed>/<total> passed, zeleno ob popolnem uspehu, sicer rdeče. Pravokotna oblika z levo oznako in desno vrednostjo sledi običajnemu slogu shields.

2.9 Izhodne kode

0: vsi dodatki uspešni. 2: ni dodatkov s tests/. 3: vsaj en neuspešen dodatek. Druge neničelne kode pomenijo argumente, okolje ali zgodnjo prekinitev.

2.10 Primeri

Vsi dodatki repozitorija:

./run_pytest_repo.sh --repo /srv/pmiverse/_pmisuite18/repos/pmiverse/testing

Samo spremenjeni glede na origin/18.0:

./run_pytest_repo.sh --repo /path/repo --only-changed

Štiri vzporedna opravila in dodatni argumenti:

./run_pytest_repo.sh --repo /path/repo --parallel 4 -- --maxfail=1 -q

Brez pokritosti in JUnit:

./run_pytest_repo.sh --repo /path/repo --no-junit --no-coverage

3. publish_repo_badges.sh — Lokalna objava značk

3.1 Namen

Kopira zadnje SVG izvajalnika v ciljni repozitorij:

<repo>/.badges/tests/

Izbirno jih potrdi in pošlje. README izriše značke iz repozitorija brez zunanje storitve.

3.2 Uporaba

publish_repo_badges.sh --repo <repo_root> \
    [--source <logs_dir>] \
    [--commit] \
    [--branch <name>]

Možnosti

Možnost Opis
--repo <path> Obvezen ciljni koren.
--source <path> Vir, privzeto /srv/pmiverse/logs/tests/latest/badges.
--commit Git commit in push.
--branch <name> Ciljna veja, privzeto trenutna.
-h, --help Pomoč.

3.3 Vir in cilj

Privzeti vir:

/srv/pmiverse/logs/tests/latest/badges/

Cilj:

<repo_root>/.badges/tests/

Kopirajo se vse izvorne *.svg.

3.4 Vključitev v README

Po objavi:

## Test Status

![Overall Tests](./.badges/tests/summary.svg)
![Addon A](./.badges/tests/addon_a_status.svg)
![Addon A Coverage](./.badges/tests/addon_a_coverage.svg)

Značke so verzionirane z repozitorijem in ostanejo veljavne brez zunanjih URL CI.

3.5 Izbirni commit in push

Zunanje pisanje: --commit ustvari potrditev in jo pošlje. Zahteva izrecno odobritev in ni del preverjanja samo za branje.

Skripta po potrebi preklopi na --branch, doda .badges/tests/*.svg v indeks in ob spremembah ustvari commit:

chore(badges): update test badges

Pošlje ga na trenutno vejo:

git push origin <current_branch>

Brez sprememb SVG ni commita.

3.6 Napake

Pogoj Vedenje
Manjka --repo Napaka, uporaba, neničelni izhod.
Manjka vir Napaka s potjo, neničelni izhod.
Ni SVG Varno nadaljevanje brez potrditve.
Checkout odpove Neničelni izhod ob --branch.
Ni razlike Informativno sporočilo brez commita.

4. Običajni cevovod CI

# 1. Run repository tests and generate badges
./run_pytest_repo.sh --repo "$CI_PROJECT_DIR" --parallel 4 -- --maxfail=1 -q

# 2. Publish badges into the repo and push
./publish_repo_badges.sh --repo "$CI_PROJECT_DIR" --commit --branch "$CI_COMMIT_REF_NAME"

Nastanejo strukturirani dnevniki v /srv/pmiverse/logs/tests/<timestamp>/, trenutne značke v <repo>/.badges/tests/ in README z rezultati zadnjega CI.

5. Vzdrževanje

Ohranite stabilni run_pytest_addon.sh in ga verzionirajte skupaj z dokumentacijo. Spremembe pravil pokritosti uskladite z argumenti run_pytest_repo.sh. Nove značke, npr. lint ali migracije, dodajte v klice generate_badge_svg in razmislite o podmapah. Za več repozitorijev standardizirajte zbirno mesto /srv/pmiverse/logs/tests/.

6. Licenca

Copyright (c) 2025 LUXIM d.o.o., Slovenia — Matjaž Mozetič Del PMISuite.

Pravne podrobnosti določata projektni LICENSE in korenski README.