Roles de Prueba Estándar
El paquete standard-test-roles
provee roles Ansible compartidos y scripts de inventario implementando Interfaz Prueba Estándar versión 1.1.0
. Tiene soporte para diversos marcos de pruebas (como BeakerLib o Avocado) y de esta manera habilitar fácilmente las pruebas existentes en Fedora CI.
Ajuste
Paquetes
STR está disponible para Centos/RHEL desde Repositorio EPEL. Como primer paso instale todos los paquetes necesarios:
sudo dnf install fedpkg libselinux-python standard-test-roles
Puede instalar también la última versión desde el repositorio copr:
sudo dnf copr -y enable @osci/standard-test-roles sudo dnf update standard-test-roles
Artefactos
La salida de la prueba (bien salida stdout/stderr output, archivos de registro o pantallazos) es guardada de forma predeterminada en el directorio artifacts
directory. Use la variable de entorno TEST_ARTIFACTS
para elegir una localización diferente si lo desea:
export TEST_ARTIFACTS=/tmp/artifacts
Limpieza de artefactos |
Inventario
Un sujeto de prueba es como llamamos a la cosa a ser probada. Para convertir a un sujeto de prueba lanzado, en un sistema instalado a probar, usamos El inventario dinámico de Ansible. Use el siguiente comando para habilitarlo:
export ANSIBLE_INVENTORY=$(test -e inventory && echo inventory || echo /usr/share/ansible/inventory)
Como puede ver por la manera es que se establece el inventario, las pruebas pueden contener su propio inventario, que define sus propias instrucciones para convertir un sujeto de prueba en uno o más sistemas comprobables.
Probando
Clásico
Usted puede llamar siempre a las pruebas localmente. Muchas pruebas modifican o cambian el sistema contra el que están corriendo, de modo que téngalo en cuenta cómo invocar a las pruebas. los siguientes ejemplos invocan pruebas contra el mismo sistema en el que se extrae el repositorio git. Abajo hay más opciones para invocar pruebas contra otros sistemas totalmente formados e integrados, como un Atomic Host o una imagen contenedor sujeto de prueba_.
Hay más de una prueba presente en paquete del repositorio git. El sistema de prueba ejecutará cada libro de jugadas que coincidan con el glob tests/tests*.yml
separadamente en un entorno limpio. La mayoría de las veces se utiliza un único archivo `tests.yml`coo punto de entrada principal. Para ejecutarlo use el siguiente comando:
ansible-playbook tests.yml
Puede encontrar artefactos de salida de las pruebas en artifacts/
o o especificar un directorio concreto como este:
TEST_ARTIFACTS=/tmp/output ansible-playbook tests.yml
Usted puede filtrar que clase de pruebas están corriendo mediante el argumento --tags
. Para ejecutar sólo pruebas que son adecuadas para sistemas clásicos instalados por yum
o dnf
puede usar un comando como:
ansible-playbook --tags=classic tests.yml
Cuando corren por un Sistema CI System las pruebas se llaman de acuerdo a Prueba Estándar de Interfaz. Mire aquí para más detalles y variables estándar de invocación.
Paquete
Cuando corre las pruebas de arriba, las pruebas asumen que el sistema a probar es el mismo que está pidiendo las pruebas. En concreto, las pruebas asumen que lo que hay que probar ya está instalado.
Un sujeto de prueba es lo que llamamos a la cosa a ser probada. Los RPMs son una clase particular de sujeto de prueba. Para convertir un sujeto de prueba en un sistema a ser lanzado e instalado usamos Inventario dinámico Ansible. Invoquemos las pruebas con un inventario y una versión específica de gzip:
curl -o gzip.rpm https://kojipkgs.fedoraproject.org//packages/gzip/1.8/2.fc26/x86_64/gzip-1.8-2.fc26.x86_64.rpm export TEST_SUBJECTS=$PWD/gzip.rpm ansible-playbook tests.yml
Advertirá que el RPM es instalado en un sistema comprobable antes de llamar a las pruebas. Algunas pruebas contienen su propio inventario, que sus propias instrucciones para convertir un sujeto en prueba en uno o más sistemas comprobables. Pero en este caso usamos el inventario predeterminado standard-test-roles
de /usr/share/ansible/inventory
para hacer esto.
Contenedor
Otro ejemplo es usar un sujeto en prueba de una imagen contenedor. Este es también un entregable completamente formado e integrado. El sujeto en prueba de nuevo representa la cosa a ser probada. Para probar contenedores hay una dependencia adicional necesaria:
sudo dnf install standard-test-roles-inventory-docker
La imagen contenedor es sacada de un registro y lanzada usando un estibador por un Inventario dinámico Ansible.
export TEST_SUBJECTS=docker:docker.io/library/fedora:27 ansible-playbook --tags=container tests.yml
Si observa de cerca advertirá que la imagen es extrae si no es ya local, lanzada como contenedor y luego se prepara para que se ejecuten las pruebas. La primera vez esto puede ser un poco más largo. No todas las pruebas son capaces de funcionar en cualquier entorno distinto de un contenedor. De hecho, para ciertas pruebas, el software a ser probado puede no estar incluido en el contenedor. Pero mucha de las pruebas para los paquetes centrales deberían trabajar aqui.
El argumento --tags
filtra las pruebas que no son adecuadas para ejecutarse en un contenedor, bien porque el sistema funciona de manera diferente o los paquetes correctos no son instalables.
Vea en la sección Debug instrucciones sobre como acceder a un contenedor en funcionamiento y diagnosticar porque han fallado las pruebas.
Argumentos adicionales para el Estibador
Las pruebas para los contenedores se ejecutan con la ayuda de un Estibador. Los contenedores se ejecutan dentro de un contexto de seguridad predeterminado. Para más información vea https://docs.docker.com/engine/security/seccomp/Pérfiles de seguridad Seccomp para Estibadores].Es posibkes que algunas pruebas requieran privilegios adcionales. En este caso especifique los argumentos necesarios para el Estibador usando la variable de entorno TEST_DOCKER_EXTRA_ARGS
. Para esto cree un archivo inventario
en el directorio tests
con el siguiente contenido:
#!/bin/bash export TEST_DOCKER_EXTRA_ARGS="--security-opt seccomp:unconfined" exec merge-standard-inventory "$@"
o
#!/bin/bash export TEST_DOCKER_EXTRA_ARGS="--privileged" exec merge-standard-inventory "$@"
See merge-standard-inventory documentation for details.
Atomic
The former example may seem a bit contrived, but the concept of a test subject starts to make more sense when you want to test a fully formed and integrated deliverable, such as Atomic Host. The test subject again represents the thing to be tested. The test subject in this case is a QCow2 image. To turn a test subject into a launched system ready to be tested, we use Ansible dynamic inventory.
curl -Lo /tmp/atomic.qcow2 https://getfedora.org/atomic_qcow2_latest export TEST_SUBJECTS=/tmp/atomic.qcow2 ansible-playbook --tags=atomic tests.yml
If you watch closely you’ll see that the Atomic Host image is booted, and the tests run against the launched image. Not all tests are able to function in the somewhat different environment of Atomic Host, in fact, for certain cases, the software to be tested may not be included in the Atomic Host test subject. But most of the tests in core packages should work here.
Some tests contain their own inventory, that is their own instructions for turning a test subject into one or more testable systems. But in this case we use the default standard-test-roles
inventory to do this.
The --tags
argument filters out tests that are not suitable for running on an Atomic Host, either because the system functions differently, or the correct packages are not available on that system.
See the Debug section to learn how to diagnose why the tests failed, and log into the running Atomic Host.
Required Packages |
Required Packages |
Debug
To increase output verbosity use option -v
or -vvv
:
ansible-playbook --tags=container tests.yml -v
or for full verbosity:
ansible-playbook --tags=container tests.yml -vvv
To debug tests in a running container or atomic host use the TEST_DEBUG
environment variable. After the playbook runs, you’ll see diagnosis information with a helpful command to log in.
export TEST_DEBUG=1
For container you’ll see output like this:
DIAGNOSE: docker exec -it 56de801f0ddde36fc9770666f7be2a68f89d7f18f52b7b6fe7df7a12b193bf08 /bin/bash DIAGNOSE: kill 18261 # when finished
For atomic host the instructions are a bit different:
DIAGNOSE: ssh -p 2222 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null root@127.0.0.3 # password: foobar DIAGNOSE: export ANSIBLE_INVENTORY=/tmp/inventory-cloudxyhF2M/inventory DIAGNOSE: kill 16611 # when finished
Now you can easily connect using these commands. Use suggested kill
command to finish the running instance when done with investigation.
Roles
Here’s the list of currently supported roles for test execution:
- standard-test-avocado
-
Role for executing tests written via the Avocado testing framework
- standard-test-basic
-
A simple role for executing runtest.sh scripts, or other scripts in given directories
- standard-test-beakerlib
-
Role for executing tests written via Beakerlib testing framework, supporting all testing environments
Here’s list of currently supported helper roles:
- standard-test-repo
-
A role for installing packages from additional yum repositories
- standard-test-rpm
-
A role for installing additional rpms
- standard-test-source
-
A role for extracting upstream source tarball (with tests)
BeakerLib
This is the recommended role for running tests written via the Beakerlib Testing Framework as it supports all currenlty supported testing environments (atomic, classic, container). It also supports beakerlib-libraries which allow easy code reuse among multiple tests.
To use this role create tests.yml
file with contents similar to the following snippet. The tests
parameter should include the list of directories with your beakerlib tests.
- hosts: localhost
tags:
- atomic
- classic
- container
roles:
- role: standard-test-beakerlib
tests:
- cmd-line-options
The required_packages
parameter can be used to list additional packages that need to be installed on the system to run tests. If you have required packages correctly specified in the beakerlib test metadata (in Makefile RhtsRequires
stands for hard requirements, Requires
for soft requirements) it is not necessary to list them again here.
- hosts: localhost
tags:
- atomic
- classic
- container
roles:
- role: standard-test-beakerlib
tests:
- cmd-line-options
required_packages:
- which # which package required for cmd-line-options
- rpm-build # upstream-testsuite requires rpmbuild command
- libtool # upstream-testsuite requires libtool
- gettext # upstream-testsuite requires gettext
The |
Instead of manually listing all tests to be executed it is also possible to provide an fmf filter in the following way:
- hosts: localhost
roles:
- role: standard-test-beakerlib
tags:
- classic
repositories:
- repo: "https://src.fedoraproject.org/tests/shell.git"
dest: "shell"
fmf_filter: "tier: 1"
Filter can be used also if tests are stored directly in the git:
- hosts: localhost
roles:
- role: standard-test-beakerlib
tags:
- classic
fmf_filter: "tier: 1"
See Metadata for more info about filtering tests based on fmf metadata.
Basic
Basic role can be used for executing scripts or binaries as simple tests. For example the following tests.yml
file will run binary --help
as a shell command in the current directory and provide pass/fail based on its return code:
- hosts: localhost
roles:
- role: standard-test-basic
tags:
- classic
tests:
- simple:
dir: .
run: binary --help
Here’s another example tests.yml
file which fetches a single integration test from a shared repository and uses parametrizing to run it multiple times with different environment variables:
- hosts: localhost
roles:
- role: standard-test-basic
tags:
- classic
repositories:
- repo: "https://src.fedoraproject.org/tests/python.git"
dest: "python"
tests:
- smoke27:
dir: python/smoke
run: VERSION=2.7 METHOD=virtualenv ./venv.sh
- smoke37:
dir: python/smoke
run: VERSION=3.7 ./venv.sh
required_packages:
- python27
- python37
- python2-virtualenv
- python3-virtualenv
- python2-devel
- python3-devel
RHTS
This role has been obsoleted by the BeakerLib role which provides similar functionality.
Want to help? Learn how to contribute to Fedora Docs ›