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.
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.
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.
testthat
expectationsA 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.
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!
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.