Test des unités

Principes de génie logiciel en Python

Adam Spannbauer

Machine Learning Engineer at Eastman

Pourquoi faire des tests ?

  • Vérifier que le code fonctionne comme prévu
  • Veiller à ce que les modifications dans une fonction n'affectent pas une autre
  • Protéger contre les modifications dans une dépendance
Principes de génie logiciel en Python

Les tests dans Python

  • doctest
  • pytest

pytest logo

Principes de génie logiciel en Python

Utilisation de doctest

def square(x):
    """Square the number x

    :param x: number to square
    :return: x squared

    >>> square(3)
    9
    """
    return x ** 3


import doctest doctest.testmod()
Failed example:
    square(3)
Expected:
    9
Got:
    27
Principes de génie logiciel en Python

Structure pytest

Structure de test

Principes de génie logiciel en Python

Structure pytest

Structure de test

Principes de génie logiciel en Python

Écriture de tests unitaires

travail dans workdir/tests/test_document.py

from text_analyzer import Document


# Test tokens attribute on Document object
def test_document_tokens():
    doc = Document('a e i o u')

    assert doc.tokens == ['a', 'e', 'i', 'o', 'u']

# Test edge case of blank document def test_document_empty(): doc = Document('') assert doc.tokens == [] assert doc.word_counts == Counter()
Principes de génie logiciel en Python

Écriture de tests unitaires

# Create 2 identical Document objects
doc_a = Document('a e i o u')
doc_b = Document('a e i o u')

# Check if objects are ==
print(doc_a == doc_b)

# Check if attributes are == print(doc_a.tokens == doc_b.tokens) print(doc_a.word_counts == doc_b.word_counts)
False

True True
Principes de génie logiciel en Python

Exécution de pytest

travail dans le terminal

datacamp@server:~/work_dir $ pytest
collected 2 items

tests/test_document.py ..                     [100%]

========== 2 passed in 0.61 seconds ==========
Principes de génie logiciel en Python

Exécution de pytest

travail dans le terminal

datacamp@server:~/work_dir $ pytest tests/test_document.py
collected 2 items

tests/test_document.py ..                     [100%]

========== 2 passed in 0.61 seconds ==========
Principes de génie logiciel en Python

Tests en échec

travail dans le terminal

datacamp@server:~/work_dir $ pytest
collected 2 items

tests/test_document.py F.

============== FAILURES ==============
________ test_document_tokens ________

def test_document_tokens(): doc = Document('a e i o u')

assert doc.tokens == ['a', 'e', 'i', 'o']
E AssertionError: assert ['a', 'e', 'i', 'o', 'u'] == ['a', 'e', 'i', 'o']
E Left contains more items, first extra item: 'u'
E Use -v to get the full diff

tests/test_document.py:7: AssertionError
====== 1 failed in 0.57 seconds ======
Principes de génie logiciel en Python

Passons à la pratique !

Principes de génie logiciel en Python

Preparing Video For Download...