Fuzz-Test R Functions

Test function arguments with a wide array of inputs, and produce reports summarizing messages, warnings, errors, and returned values.


Project Status: Active - The project has reached a stable, usable state and is being actively developed. CRAN_Status_Badge Travis-CI Build Status AppVeyor Build Status

fuzzr implements some simple "fuzz tests" for your R functions, passing in a wide array of inputs and returning a report on how your function reacts.

Installation

install.package("fuzzr")
devtools::install_github("mdlincoln/fuzzr")

Usage

Tests are set by passing functions that return named lists of input values. These values will be passed as function arguments. Several default suites are provided with this package, such as test_char, however you may implement your own by passing a function that returns a similarly-formatted list.

library(fuzzr)
str(test_char())
#> List of 8
#>  $ char_empty         : chr(0) 
#>  $ char_single        : chr "a"
#>  $ char_single_blank  : chr ""
#>  $ char_multiple      : chr [1:3] "a" "b" "c"
#>  $ char_multiple_blank: chr [1:4] "a" "b" "c" ""
#>  $ char_with_na       : chr [1:3] "a" "b" NA
#>  $ char_single_na     : chr NA
#>  $ char_all_na        : chr [1:3] NA NA NA

Evaluate a function argument by supplying fuzz_function its quoted name, the tests to run, along with any other required static values. fuzz_function returns a fuzz_results object that stores conditions raised by a function (message, warning, or error) along with any value returned by that function.

fuzz_results <- fuzz_function(fun = lm, arg_name = "subset", data = iris, 
                              formula = Sepal.Length ~ Petal.Width + Petal.Length, 
                              tests = test_all())

You can render these results as a data frame:

fuzz_df <- as.data.frame(fuzz_results)
knitr::kable(head(fuzz_df))
subset data formula output messages warnings errors result_classes results_index
char_empty iris Sepal.Length ~ Petal.Width + Petal.Length NA NA NA 0 (non-NA) cases NA 1
char_single iris Sepal.Length ~ Petal.Width + Petal.Length NA NA NA 0 (non-NA) cases NA 2
char_single_blank iris Sepal.Length ~ Petal.Width + Petal.Length NA NA NA 0 (non-NA) cases NA 3
char_multiple iris Sepal.Length ~ Petal.Width + Petal.Length NA NA NA 0 (non-NA) cases NA 4
char_multiple_blank iris Sepal.Length ~ Petal.Width + Petal.Length NA NA NA 0 (non-NA) cases NA 5
char_with_na iris Sepal.Length ~ Petal.Width + Petal.Length NA NA NA 0 (non-NA) cases NA 6

You can also access the value returned by any one test by matching the argument tested with its test name:

model <- fuzz_value(fuzz_results, subset = "int_multiple")
coefficients(model)
#>  (Intercept)  Petal.Width Petal.Length 
#>          0.8           NA          3.0

Multiple-argument tests

Specify multiple-argument tests with p_fuzz_function, passing a named list of arguments and tests to run on each. p_fuzz_function will test every combination of argument and variable.

fuzz_p <- p_fuzz_function(agrep, list(pattern = test_char(), x = test_char()))
length(fuzz_p)
#> [1] 64
knitr::kable(head(as.data.frame(fuzz_p)))
pattern x output messages warnings errors result_classes results_index
char_empty char_empty NA NA NA invalid 'pattern' argument NA 1
char_single char_empty NA NA NA NA integer 2
char_single_blank char_empty NA NA NA 'pattern' must be a non-empty character string NA 3
char_multiple char_empty NA NA argument 'pattern' has length > 1 and only the first element will be used NA integer 4
char_multiple_blank char_empty NA NA argument 'pattern' has length > 1 and only the first element will be used NA integer 5
char_with_na char_empty NA NA argument 'pattern' has length > 1 and only the first element will be used NA integer 6

Matthew Lincoln

News

fuzzr 0.2.1

  • Removes one call to purrr::map_df to be compatible with purrr 0.2.2.1.

fuzzr 0.2

  • Added a NEWS.md file to track changes to the package.
  • Multiple test combinations with p_fuzz_function no longer require setting a character delimiter. These are now properly stored within the fuzz_results object. This change means that tidyr is no longer a dependency.
  • Single and multiple NA vectors have been added to several tests.
  • test_null() passes NULL as an argument value.
  • fuzz_value and fuzz_call will now retrieve results by matching test names in addition to exact index.

Reference manual

It appears you don't have a PDF plugin for this browser. You can click here to download the reference manual.

install.packages("fuzzr")

0.2.2 by Matthew Lincoln, 14 days ago


https://github.com/mdlincoln/fuzzr


Report a bug at https://github.com/mdlincoln/fuzzr/issues


Browse source code at https://github.com/cran/fuzzr


Authors: Matthew Lincoln [aut, cre]


Documentation:   PDF Manual  


MIT + file LICENSE license


Imports assertthat, progress, purrr

Suggests knitr, rmarkdown, testthat


See at CRAN