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



Značke so verzionirane z repozitorijem in ostanejo veljavne brez zunanjih URL CI.
3.5 Izbirni commit in push
Zunanje pisanje:
--commitustvari 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.