Unit Tests in R
Unit Tests sind ein wichtiger Bestandteil in der Softwareentwicklung. Mit Unit Tests kannst du sicherzustellen, dass einzelne Komponenten eines Programms richtig funktionieren. Sie können zum Beispiel die Zuverlässigkeit und Robustheit von Funktionen und Skripten gewährleisten. In diesem Post zeige ich, wie du Unit Tests in R mit dem Paket testthat
erstellst und durchführst.
Allgemeines zu Unit Tests in R
Warum Unit Tests?
Unit Tests helfen, Fehler frühzeitig zu erkennen und zu beheben, bevor sie in die Produktionsumgebung gelangen. Hier sind einige Aspekte:
- Korrektheit: Überprüfen, ob Funktionen wie erwartet arbeiten.
- Wartbarkeit des Codes: Einfacheres Refactoring, da jederzeit getestet werden kann, ob die Komponenten weiterhin erwartungsgemäß funktionieren.
- Dokumentation: Unit Tests verdeutlichen die Erwartungen an eine Funktion und deren Rückgabewerte.
Installation und Einrichtung von testthat
Das Paket testthat
ist eines der am häufigsten verwendeten Pakete für Unit Tests in R. Es bietet eine einfache und intuitive Syntax zur Erstellung und Durchführung von Tests.
install.packages("testthat")
library(testthat)
Unit Tests in R Schreiben
Grundlegende Struktur eines Unit Tests
Ein Unit Test in testthat
besteht aus mindestens einer Testdatei und einer oder mehreren Testfunktionen. Eine typische Testdatei hat das Präfix test_
und liegt im Pfad /tests/testthat
.
Beispiel für Unit Tests in R
Nehmen wir an, wir haben eine Funktion, die zwei Zahlen addiert:
# add.R
add <- function(a, b) {
return(a + b)
}
Wir erstellen nun eine Testdatei, um diese Funktion zu testen:
# test_add.R
library(testthat)
source("add.R")
test_that("addition works correctly", {
expect_equal(add(1, 1), 2)
expect_equal(add(-1, -1), -2)
expect_equal(add(0, 0), 0)
})
Hinweis: Es gibt neben expect_equal
die Funktion expect_identical
. Der Unterschied liegt darin, dass expect_equal
sehr kleine numerische Unterschiede ignoriert, was häufig gewünscht ist.
Erweiterte Testfunktionen
testthat
bietet eine Vielzahl von Funktionen, um unterschiedliche Aspekte des Codes zu testen:
expect_equal()
: Überprüft, ob zwei Werte gleich sind.expect_true()
: Überprüft, ob ein AusdruckTRUE
ist.expect_false()
: Überprüft, ob ein AusdruckFALSE
ist.expect_error()
: Überprüft, ob ein Fehler auftritt.- Weitere Funktionen kannst du hier anschauen: testthat-Dokumentation
Zweites Beispiel: Testen auf Fehler
Erweitern wir die add
-Funktion, um sicherzustellen, dass nur numerische Eingaben akzeptiert werden:
add <- function(a, b) {
if (!is.numeric(a) || !is.numeric(b)) {
stop("Beide Eingaben müssen numerisch sein.")
}
return(a + b)
}
Der entsprechende Test könnte folgendermaßen aussehen:
test_that("addition handles errors correctly", {
expect_error(add("a", 1), "Beide Eingaben müssen numerisch sein.")
expect_error(add(1, "b"), "Beide Eingaben müssen numerisch sein.")
})
Organisieren von Tests
In einem größeren Projekt ist es sinnvoll, die Tests zu organisieren und in einem eigenen Verzeichnis abzulegen. Ein typischer Aufbau könnte so aussehen:
my_project/
├── R/
│ └── add.R
└── tests/
└── testthat/
├── test_add.R
Ausführen der Tests
Die Tests können manuell oder automatisch ausgeführt werden. Um alle Tests in einem Projekt auszuführen, verwendet man:
test_dir("tests/testthat")
Alternativ können Tests auch mit dem Befehl test_file()
für eine einzelne Datei ausgeführt werden:
test_file("tests/testthat/test_add.R")
Testen von Paketen
Wenn du ein R-Paket entwickelst, ist testthat
vollständig in das Paket-Ökosystem integriert. Testdateien werden im Verzeichnis tests/testthat
abgelegt, und die Tests werden automatisch ausgeführt, wenn das Paket überprüft wird (R CMD check
).
Fazit
Unit Tests sind ein unverzichtbares Werkzeug für die Entwicklung zuverlässiger und robuster R-Skripte und -Funktionen. Mit testthat
lassen sich Tests einfach erstellen und verwalten. Durch regelmäßiges Testen kannst du sicherstellen, dass dein Code korrekt funktioniert und zukünftige Änderungen keine unerwarteten Fehler einführen.
Ich hoffe, dass dir diese kleine Einführung in Unit Tests mit R gefallen hat. Hast du Fragen oder Anregungen? Schreib gern eine E-Mail oder hinterlasse einen Kommentar. Bleib außerdem auf dem Laufenden mit dem r-coding Newsletter. Du erhältst Infos zu neuen Blogeinträgen, sowie kleine Tipps und Tricks zu R. Melde dich jetzt an: http://r-coding.de/newsletter.
Viel Erfolg beim Testen und Entwickeln!