Cours 6 — Tests

Patrick Fournier

MAT8186 — Techniques avancées en programmation statistiques R

Automne 2023

Tests formels

Definitions

  • Vérification qu'un logiciel fait ce qu'il doit faire
  • Plusieurs types (source)
    Acceptation
    logiciel répond aux exigences
    Régression
    nouvelle fonctionnalité dégrade une ancienne
    Utilisabilité
    facilité d'utilisation du logiciel
    Performance
    performance du logiciel sous conditions réelles
    Unitaire
    partie du logiciel

Tests formels

  • Test informel: expérimentation dans le REPL par exemple.
  • Simple & rapide 😀, mais ne laisse pas de trace ☹️
  • Solution: automatiser les tests
  • Penser aux cas problématiques lorsqu'on code
  • Créer tests à partir de bugs

Coût-bénéfices

  • Tests formels demandent plus d'efforts 🏋
  • Bugs sont très couteux en temps et en argent

Test unitaires avec R

Testthat

  • Possible d'implémenter les tests dans un simple script
  • Plus facile d'utiliser un package dédié: Testthat
  • Recommandé d'utiliser la troisième édition
  • S'intègre parfaitement au workflow vu précédemment pour la création d'un package

                r$> usethis::use_testthat(3)
            

Création de tests

  • Quelques conventions à respecter pour emplacement/nom fichiers tests
  • Le plus simple: créer les fichiers avec usethis::use_test("nom")
  • Plus simple si chaque «nom» correspond à un fichier dans R/

Structure d'un fichier test

  • Script R \( \Rightarrow \) peut contenir tout code R valide
  • Peu utile si rien n'est testé
  • Fonction principale: testthat::test_that
  • Prend exactement 2 arguments:
    1. desc: description du test
    2. code: code effectuant le test

                    test_that("multiplication works", {
                        expect_equal(2 * 2, 4)
                    })
                

Expectations

  • Plusieurs manières de concevoir des tests
  • Attentes 🤝🏽 réalité
  • Testthat: fonctions expect_<...>()
  • Liste exhaustive
  • En résumé: expectations \( \in \) tests \( \in \) fichiers
Expectations courrantes:
expect_equal
égalité
expect_identical
identité
expect_error
erreur
expect_warning
avertissement
expect_type
typeof(x)
expect_s3_class
objet S3 hérite d'une classe (ou pas S3 si NA)
expect_length
longueur d'un vecteur
expect_true
argument est TRUE

Trucs et remarques

  • Un test_that peut contenir plusieurs expectations
  • Devrait tester un ensemble de fonctionnalités reliés
  • Un fichier peut contenir plusieurs test_that
  • Possible d'utiliser du code hors test_that dans les tests

Snapshot testing

  • Parfois, résultat d'un test trop compliqué pour être spécifié correctement
  • Exemple: tout ce qui est aléatoire 😭
  • Solution: enregistrer le résultat dans un fichier et vérifier «à la main»