Unit Tests in R
|

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 Ausdruck TRUE ist.
  • expect_false(): Überprüft, ob ein Ausdruck FALSE 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!

Ähnliche Beiträge

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.