diff --git a/Makefile b/Makefile
index a6cbc234016bbf777ac722977c1dd135aaaf8328..4875b824576974f26da4f4836bfb0b49438570b8 100644
--- a/Makefile
+++ b/Makefile
@@ -19,7 +19,7 @@ HTMLOPTIONS += -t html5
 HTMLOPTIONS += -c css/tufte-css/tufte.css
 HTMLOPTIONS += --self-contained
 
-all: make.pdf base_3.pdf base_2.pdf base_1.pdf intro.pdf index.html
+all: tests_assertions.pdf make.pdf base_3.pdf base_2.pdf base_1.pdf intro.pdf index.html
 
 intro.pdf: intro.md metadata.yaml
 	pandoc $(PDFOPTIONS) -o $@ $^
@@ -36,6 +36,9 @@ base_3.pdf: base_3.md metadata.yaml
 make.pdf: make.md metadata.yaml
 	pandoc $(PDFOPTIONS) -o $@ $^
 
+tests_assertions.pdf: tests_assertions.md metadata.yaml
+	pandoc $(PDFOPTIONS) -o $@ $^
+
 index.html: index.md
 	pandoc -s $(OPTIONS) $(HTMLOPTIONS) -o $@ $<
 
diff --git a/tests_assertions.md b/tests_assertions.md
new file mode 100644
index 0000000000000000000000000000000000000000..be3487ae47ca604f29fa57b4e85ff831dd3775b6
--- /dev/null
+++ b/tests_assertions.md
@@ -0,0 +1,95 @@
+% Tests unitaires et assertions
+% Inspirés des slides de F. Glück
+% 9 octobre 2019
+
+# 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, ...).