Tests unitaires

Principes d'ingénierie logicielle en Python

Adam Spannbauer

Machine Learning Engineer at Eastman

Pourquoi tester ?

  • Confirmer que le code fonctionne comme prévu
  • S'assurer qu'un changement dans une fonction n'en brise pas une autre
  • Se protéger contre des changements dans une dépendance
Principes d'ingénierie logicielle en Python

Tester en Python

  • doctest
  • pytest

logo de pytest

Principes d'ingénierie logicielle en Python

Utiliser 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 d'ingénierie logicielle en Python

Structure de pytest

Structure des tests

Principes d'ingénierie logicielle en Python

Structure de pytest

Structure des tests

Principes d'ingénierie logicielle en Python

Écrire des 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 d'ingénierie logicielle en Python

Écrire des 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 d'ingénierie logicielle en Python

Exécuter pytest

travail avec le terminal

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

tests/test_document.py ..                     [100%]

========== 2 passed in 0.61 seconds ==========
Principes d'ingénierie logicielle en Python

Exécuter pytest

travail avec 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 d'ingénierie logicielle en Python

Échecs de tests

travail avec 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 d'ingénierie logicielle en Python

Passons à la pratique !

Principes d'ingénierie logicielle en Python

Preparing Video For Download...