Test Management Tool

Sommario

Lo strumento tmt mira a fornire un modo efficiente e confortevole per creare, eseguire, effettuare il debug e abilitare i test nella Continuous Integration (Integrazione Continua).

Implementa la [https://tmt.readthedocs.io/en/stable/spec.html](Test Metadata Specification (Specifica dei Metadati di Test) che consente di memorizzare tutti i dati necessari per l’esecuzione dei test direttamente all’interno di un repository git. La stessa configurazione può essere utilizzata per abilitare i test in Fedora CI, RHEL CI e [https://packit.dev/](Packit. I test possono essere facilmente eseguiti nell’ambiente preferito, ad esempio in una macchina virtuale, in un container o direttamente sull’host locale.

Primi Passi

Installa

Installa tmt sul tuo laptop:

sudo dnf install -y tmt       # basic features, executing tests on localhost
sudo dnf install -y tmt+all   # install all available tmt subpackages including all dependencies

È anche possibile installare solo plugin di provisioning specifici:

sudo dnf install -y tmt+provision-container   # additional dependencies for executing tests in containers
sudo dnf install -y tmt+provision-virtual     # support for running tests in a virtual machine using testcloud

Vedere la sezione install di tmt per ulteriori opzioni di installazione.

Repository Git

Esegui il checkout del ramo dist-git desiderato utilizzando fedpkg:

fedpkg clone -a bash
cd bash
git checkout f32

Oppure clona il repository del tuo progetto GitHub:

git clone https://github.com/teemtee/tmt/
cd tmt
git checkout -b enable-tests

Test del Fumo

Abilitiamo un semplice smoke test utilizzando il modello di piano minimale:

$ tmt init --template mini
Tree '/tmp/bash' initialized.
Applying template 'mini'.
Directory '/tmp/bash/plans' created.
Plan '/tmp/bash/plans/example.fmf' created.

Modifica il piano appena creato secondo le tue esigenze, ad esempio in questo modo:

summary:
    Basic smoke test for bash
execute:
    script: bash --version

Esegui i test

Esegui i test

Esegui in sicurezza tutti i test disponibili in una macchina virtuale:

tmt run

Esegui solo i test che corrispondono al nome dato o che si trovano nella directory corrente:

tmt run test --name smoke
tmt run test --name .

Mostra i risultati dettagliati dei test dell’ultima esecuzione di tmt effettuata dall’utente corrente:

tmt run --last report -fvvv

Seleziona le fasi

Scegli esplicitamente quali fasi devono essere eseguite:

tmt run discover

Questo fornirà una panoramica dei test che verrebbero eseguiti. Per elencare i singoli test, abilita la modalità dettagliata (verbose):

tmt run discover --verbose
tmt run discover -v

Opzioni di provisioning

Scegli local come metodo di provisioning ma esegui tutte le fasi (--all):

tmt run --all provision --how local

Esegui all’interno di un contenitore o di una macchina virtuale:

tmt run --all provision --how container --image fedora
tmt run --all provision --how virtual --image fedora-32

Controlla tutti i plugin di provisioning disponibili:

tmt run provision --help

Opzioni stampante

Installa pacchetti aggiuntivi sul guest:

tmt run --all prepare --how install --package httpd

Scarica l’ultimo pacchetto dal repository Copr fornito:

tmt run --all prepare --how install --copr @teemtee/tmt --package tmt

Utilizza l’rpm locale appena compilato o tutti gli rpm della directory locale fornita:

tmt run --all prepare --how install --package tmp/RPMS/noarch/tmt-0.20-1.fc32.noarch.rpm
tmt run --all prepare --how install --directory tmp/RPMS/noarch

Controlla tutte le opzioni di preparazione disponibili:

tmt run prepare --help

Creazione di timer

Per creare test più complessi, utilizziamo il modello di piano base plan template:

tmt plan create /plans/basic --template base
tmt plan create /plans/basic -t base

Aggiorna il sommario (summary) secondo le necessità, mantieni il metodo di rilevamento (discover) su fmf e scegli se i test debbano essere eseguiti come script shell (controllando solo il codice di uscita) o come test beakerlib (esaminando il journal per i risultati del test):

summary:
    Check basic bash features
discover:
    how: fmf
execute:
    how: tmt

Test Shell

Per creare lo scheletro di un semplice test shell, utilizza il modello shell template:

$ tmt test create /tests/smoke
Template (shell or beakerlib): shell
Directory '/tmp/bash/tests/smoke' created.
Test metadata '/tmp/bash/tests/smoke/main.fmf' created.
Test script '/tmp/bash/tests/smoke/test.sh' created.

Aggiorna il file dei metadati:

summary: Check bash version
contact: Petr Šplíchal <psplicha@redhat.com>
test: ./test.sh

Modifica lo script di test come desiderato:

#!/bin/sh -eux
tmp=$(mktemp)
bash --version > $tmp
grep 'GNU bash' $tmp
grep 'Free Software Foundation' $tmp
rm $tmp

Utilizza tmt run per verificare che il test funzioni come previsto.

Test BeakerLib

Utilizza il template beakerlib per creare un nuovo test beakerlib:

$ tmt test create /tests/smoke -t beakerlib
Directory '/tmp/bash/tests/smoke' created.
Test metadata '/tmp/bash/tests/smoke/main.fmf' created.
Test script '/tmp/bash/tests/smoke/test.sh' created.

Aggiorna i metadati del test e il codice secondo necessità, utilizza tmt run per verificare che tutto funzioni correttamente.

Pull Requests

Quando crei la pull request, assicurati di aggiungere tutti i file creati, inclusa la directory speciale .fmf.

git add .
git commit

Fedora

Per testare le tue modifiche nella Fedora CI non è necessaria alcuna configurazione aggiuntiva. Assicurati di effettuare il push delle modifiche nel tuo repository forkato, poiché il namespace fedora rpms/tests non consente il force-push o la rimozione dei branch.

   git remote add fork ssh://psss@pkgs.fedoraproject.org/forks/psss/rpms/bash.git
git checkout -b tests

GitHub

Per testare una pull request su GitHub, abilita l’integrazione Packit-as-a-Service e aggiungi un file di configurazione .packit.yaml:

jobs:
- job: tests
  trigger: pull_request
  metadata:
    targets:
    - fedora-all

Per maggiori dettagli consulta la documentazione di Testing Farm. Una volta abilitata l’integrazione, esegui il push del branch, crea una nuova pull request come di consueto e attendi i risultati:

git push origin -u enable-tests

Modelli

Quando crei una pull request per abilitare i test in un repository che non ha una configurazione tmt, includi un paio di suggerimenti e collegamenti per chi non ha familiarità con il nuovo strumento:

Questa pull request abilita i test nel Fedora CI utilizzando `tmt`,
 il che consente anche di eseguire e sottoporre a debug i test facilmente dal proprio laptop:

Esegui i test direttamente sul tuo localhost:

    sudo dnf install -y tmt
    tmt run --all provision --how local

Esegui i test in una macchina virtuale:

    sudo dnf install -y tmt+provision-virtual
    tmt run

Controlla la documentazione per saperne di più sullo strumento:
https://docs.fedoraproject.org/en-US/ci/tmt/

Gestisci i test

Esplora i test disponibili, converti i vecchi metadati, condividi il codice dei test.

Esplora i test

Per vedere quali test sono disponibili:

tmt test ls

Per mostrare maggiori dettagli sui singoli test:

tmt test show

Per vedere una panoramica di tutti i metadati:

tmt

Explore all available options and commands using --help.

Condividi i test

Il codice dei test non deve necessariamente risiedere nello stesso repository git (ad es. lo spazio dei nomi rpm in dist-git). È possibile memorizzare i test in un repository dedicato e condividerli tra diversi componenti o versioni del prodotto. È sufficiente fare riferimento al repository nella fase di discover. Usa il modello di piano completo (full plan template) per iniziare rapidamente:

tmt plan create /plans/upstream -t full

Aggiorna l’url del repository per fare in modo che punti alla posizione corretta:

summary:
    Essential command line features
discover:
    how: fmf
    url: https://github.com/teemtee/tmt
execute:
    how: tmt

Ora sarai in grado di eseguire i test dal repository remoto. Vedi la documentazione della fase di discover per ulteriori dettagli.

Suggerimenti vari

Comandi multipli

È possibile fornire più comandi shell anche sotto l’attributo script:

summary:
    Basic smoke test for bash
execute:
    script:
        - bash --version
        - bash -c 'echo $((1+1+1))' | grep 3

See the script method documentation for details.

Installazione dipendenze

I pacchetti richiesti possono essere installati utilizzando l’attributo prepare:

    summary: Basic smoke test for python3-m2crypto
    prepare:
        how: install
        package:
          - python3-setuptools
          - python3-m2crypto
execute:
script: python3 -c "import M2Crypto"

Vedi la documentazione della fase di prepare per ulteriori dettagli.

Repository multipli

Nella fase di discover è possibile fare riferimento anche a più repository. In questo modo è possibile, ad esempio, eseguire facilmente sia i test upstream che quelli di Fedora all’interno di un unico piano:

discover:
  - name: fedora
    how: fmf
    url: https://src.fedoraproject.org/tests/selinux.git
  - name: upstream
    how: fmf
    url: https://github.com/SELinuxProject/selinux-testsuite

Vedi anche l’esempio multiple config nel repository di tmt per farti un’idea migliore.

Utilizzando Piani Multipli

È possibile utilizzare più piani per raggruppare i test rilevanti o per poter eseguire facilmente un sottoinsieme di test. Ad esempio, creiamo un piano /plans/features che copra tutti i test di funzionalità del repository git locale:

discover:
    how: fmf
execute:
    how: tmt

E un piano /plans/integration separato per abilitare i test di integrazione con un altro componente:

discover:
    how: fmf
    url: https://src.fedoraproject.org/tests/shell
execute:
    how: tmt

Eseguire tutti i test da un determinato piano è quindi molto semplice:

tmt run plan --name /plans/features

Quando eseguiti nella CI, i risultati di tali piani vengono segnalati come un singolo testcase di resultsdb e vengono mostrati nelle pull request come un singolo flag. Per abilitare un risultato separato per ogni piano, crea un file ci.fmf nella radice del repository git con il seguente contenuto:

resultsdb-testcase: separate

Una volta abilitata la segnalazione separata, è possibile attivare il gating solo per i piani selezionati. Il nome del piano diventa parte del nome del testcase di resultsdb utilizzato nella configurazione gating.yaml. Vedi la documentazione del gating su Using Multiple Plans per ulteriori dettagli.

Percorso minimo

Ecco un esempio di percorso minimo per la creazione di un test:

dnf install -y tmt+all
git clone https://src.fedoraproject.org/rpms/bash
cd bash
tmt init -t mini
vim plans/example.fmf
tmt run

Un esempio leggermente esteso con un modello personalizzato di test e di piano, ed esecuzione del test direttamente sull’host locale:

dnf install -y tmt+all
git clone https://src.fedoraproject.org/rpms/bash
cd bash
tmt init
tmt plan create --template base plans/smoke
tmt test create --template beakerlib tests/smoke
vim plans/smoke.fmf tests/smoke/*
tmt run --all provision -h local
git add .
git commit -m "Enable basic tests"
git push

Strumenti di virtualizzazione

Per eseguire in sicurezza i test all’interno di una macchina virtuale avviata sul proprio laptop, è sufficiente installare il pacchetto tmt+provision-virtual. Di default viene utilizzata la connessione di sessione, quindi non dovrebbero essere necessari altri passaggi: basta eseguire i test usando il comando tmt run. Per ulteriori opzioni, consulta i Consigli sulla Virtualizzazione della documentazione upstream.

Domande

Il tool sostituisce/depreca lo STI?

No, attualmente non è previsto lo smantellamento di STI. Entrambi gli approcci alla configurazione della CI, tmt e sti, possono essere utilizzati in parallelo.

Sì, questi test sono supportati in Fedora CI?

Sì, il supporto a Fedora CI è abilitato per tutti i branch attivi e anche per il namespace dei test.

Quali distribuzioni Linux supporta il tool?

Come sistema sotto test (su cui vengono eseguiti i test) possono essere utilizzate tutte le versioni di Fedora supportate, CentOS 6+ e Red Hat Enterprise Linux 6+. Per il test runner (dove viene eseguito il comando tmt) sono richieste tutte le versioni di Fedora supportate, CentOS 8+ o Red Hat Enterprise Linux 8+.