Développement Python aidé par le test Jenkins-Unit

Résumé de cet article

J'expliquerai comment amener Jenkins à faire des tests unitaires en développement en utilisant Python. Nose ou py.test sont des candidats pour le framework de test unitaire de Python. Cette fois, nous utiliserons py.test.

À Jenkins

L'environnement est le suivant.

article Version etc.
Python 3.5.1
Jenkins 1.6...?
Cadre de test py.test

py.test Installer avec pip install pytest

Exemple de code de test

Code à tester --carticer.py

class Calculator():
    def add(self, a, b):
        return a + b

    def sub(self, a, b):
        return a - b

    def mul(self, a, b):
        return a * b

    def div(self, a, b):
        return a / b

Code de test --test_calculator.py

import pytest
from calculator import Calculator

def pytest_funcarg__calc():
    return Calculator()

@pytest.mark.parametrize("a, b, r", [(9, 8, 17), (7, 6, 13), (5, 4, 9), (3, 2, 5), (1, 0, 1)])
def test_add(calc, a, b, r):
    assert calc.add(a, b) == r

@pytest.mark.parametrize("a, b, r", [(9, 8, 1), (7, 6, 1), (5, 4, 1), (3, 2, 1), (1, 0, 1)])
def test_sub(calc, a, b, r):
    assert calc.sub(a, b) == r

@pytest.mark.parametrize("a, b, r", [(9, 8, 72), (7, 6, 42), (5, 4, 20), (3, 2, 6), (1, 0, 0)])
def test_mul(calc, a, b, r):
    assert calc.mul(a, b) == r

@pytest.mark.parametrize("a, b, r", [(9, 3, 3), (8, 4, 2), (6, 2, 3), (4, 2, 2), (0, 1, 0)])
def test_div(calc, a, b, r):
    assert calc.div(a, b) == r

def test_div_error(calc):
    with pytest.raises(ZeroDivisionError):
        calc.div(1, 0)

Essai

Peut être exécuté avec py.test Recherche récursive sous le répertoire exécuté Il exécutera le fichier py qui commence par test.

résultats de test Succès

============================= test session starts ==============================
platform darwin -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1
rootdir: /Users/rotasuke/git/python_test/others, inifile: 
collected 21 items

test_calculator.py .....................

========================== 21 passed in 0.03 seconds ===========================

Exemple d'échec

============================= test session starts ==============================
platform darwin -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1
rootdir: /Users/rotasuke/git/python_test/others, inifile: 
collected 21 items

test_calculator.py ...................F.

=================================== FAILURES ===================================
_______________________________ test_div[0-1-1] ________________________________

calc = <calculator.Calculator object at 0x10c9567f0>, a = 0, b = 1, r = 1

    @pytest.mark.parametrize("a, b, r", [(9, 3, 3), (8, 4, 2), (6, 2, 3), (4, 2, 2), (0, 1, 1)])
    def test_div(calc, a, b, r):
>       assert calc.div(a, b) == r
E       assert 0.0 == 1
E        +  where 0.0 = <bound method Calculator.div of <calculator.Calculator object at 0x10c9567f0>>(0, 1)
E        +    where <bound method Calculator.div of <calculator.Calculator object at 0x10c9567f0>> = <calculator.Calculator object at 0x10c9567f0>.div

test_calculator.py:21: AssertionError
===================== 1 failed, 20 passed in 0.04 seconds ======================

Création d'emplois Jenkins

Les paramètres détaillés tels que le contrôle Git sont omis.

Dans [Build] - [Run Shell] py.test <répertoire à exécuter> Spécifier.

Sortie du rapport de test

Dans le script shell à exécuter que vous avez entré précédemment --junitxml = <fichier xml de destination> En spécifiant, le rapport de test peut être édité au format JUnit.

Ajout de [Résultats de test JUnit agrégés] au [Traitement post-build] Spécifiez le fichier xml qui a été généré précédemment.

Sortie de couverture

Installez le module pour la sortie de couverture avec pip install pytest-cov

Dans le script shell à exécuter que vous avez entré précédemment --cov-report=xml --cov En spécifiant, coverage.xml peut être sorti sous le répertoire où la commande est exécutée.

Il peut être visualisé en demandant au plugin Cobertura de Jenkins de lire coverage.xml.

Recommended Posts

Développement Python aidé par le test Jenkins-Unit
Jugement des nombres premiers par Python
Test d'intégrité Python
Jugement des nombres premiers avec Python
Mémo de visualisation par Python
Traitement de la communication par Python
Notes de développement de package Python
Test numpy Python Basic 8
Mémo du package de test Python
Construction de l'environnement de développement Python
Jugement des nombres premiers avec python
À propos de l'environnement de développement Python
Construction de l'environnement de développement python2.7
Réponse de Beamformer par python
Développement de framework avec Python
Environnement de développement en Python
test de coopération de balises python
modèle de test unitaire python
Développement du microservice Bluemix Python
Développement Slackbot en Python
Algorithme en Python (jugement premier)
API Web EXE par Python
Programme de formation des nouveaux arrivants par Python
Pin python géré par conda
Organiser l'environnement de développement Python
Extraction de mots-clés par MeCab (python)
Séparez les nombres par 3 chiffres (python)
[ev3dev × Python] Construction de l'environnement de développement ev3dev
Modèle Python pour Codeforces-test manuel-
Modèle de commutation de Markov par Python
Développement Python avec Visual Studio 2017
Traitement d'image par python (Pillow)
Python lancé par des programmeurs C
Module de débogage et de test Python
[MEMO] [Construction de l'environnement de développement] Python
[Pour organiser] Environnement de développement Python
Développement Python avec Visual Studio
Jugement de la plateforme (OS) par Python
Trier par date en python
Définir le test python dans jenkins
Mémorandum of scraping & machine learning [technique de développement] par Python (chapitre 4)
Mémorandum of scraping & machine learning [technique de développement] par Python (chapitre 5)
[Pytest] [mock] Les débutants en développement Web ont résumé le test unitaire et simulé en python.