---
title: Tests unitaires et assertions
date: 2019-10-09
---

# Tests unitaires

- Compilation `!=` bon fonctionnement!
- Toujours tester vos programmes.
- Tester les fonctionnalités une par une $\Rightarrow$ **tests unitaires**.
- Plus le code est modulaire, plus il est simple à tester.
- Plus le code est testé, moins il aura contiendra de bugs.

*Testing shows the presence, not the absence of bugs.* E. W. Dijkstra.

# Assertions (1/N)

```C
#include <assert.h>
void assert(int expression);
```

## Qu'est-ce donc?

- Macro permettant de tester une condition lors de l'exécution d'un programme:
  - Si `expression == 0`{.C} (condition fausse), `assert()`{.C} affiche un message d'erreur sur `stderr`{.C} et termine l'exécution du programme.
  - Sinon l'exécution se poursuit normalement.

## À quoi ça sert?

- Permet de réaliser ds tests unitaires.
- Permet de tester des conditions catastrophiques d'un programme.
- **Ne permet pas** de gérer les erreurs.

# Assertions (2/N)

\footnotesize

## Exemple

:::::::::::::: {.columns}

::: {.column width="52%"}
```C
#include <assert.h>
#include <stdlib.h>
void copy(int *src, int *dst, int n) {
    // identique à assert(src != NULL)
    assert(src); assert(dst);
    assert(n >= 0);

    for (int i = 0; i < n; ++i) {
        dst[i] = src[i];
    }
}
void fill(int *dst, int n, int val) {
    assert(dst && 
        "problem with allocated mem");
    assert(n >= 0 && 
        "n is the size of dst");

    for (int i = 0; i < n; ++i) {
        dst[i] = val;
    }
}
```
:::
::: {.column width="48%"}

```C
int main(int argc, char **argv) {
    int size = 10;
    int *src = malloc(size * 
                      sizeof(int));
    fill(src, size, 0);
    int *dst = malloc(size *
                      sizeof(int));
    copy(src, dst, size);

    return EXIT_SUCCESS;
}
```
:::
::::::::::::::

# Assertions (3/N)

## Cas typiques d'utilisation

- Vérification de la validité des pointeurs (typiquement `!= NULL`{.C}).
- Vérification du domaine des indices (dépassement de tableau).

## Bug vs erreur de *runtime*

- Les assertions sont là pour détecter les bugs (erreurs d'implémentation).
- Les assertions ne sont pas là pour gérer les problèmes externes au programme (allocation mémoire qui échoue, mauvais paramètre d'entrée passé par l'utilisateur, ...).