Interface Layers

testex provides a multi-tiered API, allowing you to adopt it at in a way that makes the most sense for your package – whether you’re minimizing your dependency footprint or rely on a specific set of tools. Whatever your workflow, testex has something to offer.

Base building-blocks

R examples can include test code! Even if you’re not using testex, you can already add tests to your examples!

\examples{
identity("hello, world")
\testonly{
  stopifnot(.Last.value == "hello, world")
}
}

Here we use .Last.value to grab the result of our last example and test it against an expected value. Though, as you might expect, you can’t easily add another test because .Last.value will have changed.

testex provides a familiar interface for managing just this:

\examples{
identity("hello, world")
\testonly{testex::testex(
  is.character(.),
  . == "hello, world")
)}
}

Already testex is doing a bit of work to make our lives easier. The .Last.value is propagated to each of the tests and we can use the convenient shorthand . to refer to the value we want to test.

Use a roxygen2 tag!

If you’re already using roxygen2, then things get even easier! roxygen2 can make use of new tags provided by testex:

#' Hello, World!
#' 
#' @examples
#' 
#' hello("World")
#' @test "Hello, World!"
#'
#' hello("darkness my old friend")
#' @test grepl("darkness", .)
#' 
#' @export
hello <- function(who) {
  paste0("Hello, ", who, "!")
}

After running roxygen2::roxygenize(), you can take a peak at the Rd files and see how the code has been translated to testex tests.

Leverage testthat expectations

A convenience tag is also provide for those that prefer the testthat style of testing. testthat provides a wealth of expectation functions, which can be used in conjunction with testex to write more familiar tests.

#' Hello, World!
#' 
#' @examples
#' 
#' hello("World")
#' @testthat expect_equal("Hello, World!")
#'
#' hello("testthat my old friend")
#' @testthat expect_match("testthat")
#' 
#' @export
hello <- function(who) {
  paste0("Hello, ", who, "!")
}

The @testthat tag will automatically insert the .Last.value from the previous example into the first argument of each expectation. Multiple consecutive @testthat expectations will all test the previous example output.

Other Test Suites?

There are, of course, plenty of other flavors of testing suites. Thankfully, testex is quite versatile because Rd code is used as the foundation of everything else.

If you want to see support for another framework, please open an issue!