Gitlab

Tests unitaires

Valable pour les applications conteneurisées

Tester l’application

L’intérêt du workflow est sa capacité à instancier des outils de test sur le serveur de CI à chaque push du code dans Gitlab. Une fois instanciés, on peut demander à la CI de réaliser des tests qui peuvent être bloquants pour que la pipeline s’arrête en cas de problème et que l’application ne soit pas déployée avant d’être débeuguée.

La CI va tester unitairement l’application, toujours avec un conteneur: soit avec un volume partagé contenant les sources (avant le build de l’image), soit directement avec l’image de l’application (post build). Il est possible de paramétrer Gitlab pour qu’il puisse lire le taux de couverture des tests unitaires.

Exemple d’un test unitaire lancé par la CI

Dans notre application python utilisant Flask, on écrit un test unitaire qui vérifie l’existence d’un fichier sur le serveur.

import pytest
from os.path import exists
from app import web

def test_file():
    """
    GIVEN a language 
    WHEN a new file is written
    THEN check if file exists and translation is made
    """
    language = 'fr'  
    path_test_file = '/tmp/svg-schem_'+language
    file_exists = exists(path_test_file)
    assert file_exists == 1
    with open(path_test_file, 'r') as fd:
        assert 'Test unitaire' in fd.read()

Le test est instancié par la librairie pytest. Dans le cas d’une application conteneurisée, il suffit donc d’écrire la commande dans le Makefile pour lancer le test à l’aide de la commande docker-compose.

unit_test: up
  $(COMPOSE) exec -T app pytest -vx tests/unit

Il est aussi souhaitable de lancer les tests unitaires AVANT le build de l’image de l’application en utilisant une image qui embarque Python et en montant le code de l’application dans un volume temporaire:

unit_test:
  docker run --name test -v $(CI_PROJECT_DIR):/app --rm --entrypoint \
  /bin/bash bearstech/python-dev:3 \
  -c "pip3 install pytest && cd /app && python -m pytest tests/"

Ainsi on peut ajouter une nouvelle étape pour nos tests unitaires dans le .gitlab-ci.yml pour la pipeline qui sera lancée depuis la CI:

stages:
    - pull       # pull latest images required for our build
    - unit-test  # run prebuild unit tests
    - build      # build the image
    [...]
    
unit-test:
    stage: unit-test
    script:
        # run our test
        - make unit_test    
Top