automatically generate test cases in RUnit or testthat
Asked Answered
L

2

7

How can I automatically generate test cases in RUnit?

For example, let's say I have a simple sum() function:

sum <- function(x, y) {
    return (x + y)
    }

I would like to test this function on a series of different test cases:

test_cases <- c( c(2, 2, 4),
     c(3, 3, 6),
     c(0, 0, 0),
     c(-1, 2, 1)
     )

The first two elements of each vector are x and y, and the third is the expected output of the sum(x,y) function.

In python I can easily write a function that generate a test case for each of the elements in test_cases, but I don't know how to implement it in R. I have looked at the RUnit and testthat documentation, but there is nothing similar. What is the best solution here?

This is how I would write it in python (using nosetest to launch the test unit):

for triplet in test_cases:
    yield test_triplet(triplet)

def test_triplet(triplet):
    assert(sum(triplet[0], triplet[1]) == triplet[2])
Loathing answered 18/9, 2012 at 15:3 Comment(0)
I
4
# You simply take advantage of R's vector orientation.
test_cases <- matrix(c(2, 2, 4,
                       3, 3, 6, 
                       0, 0, 0, 
                      -1, 2, 1), ncol = 3, byrow = TRUE)
my_sum <- function(x, y) { x + y}

## testthat
library(testthat)
expect_equal(my_sum(test_cases[ , 1], test_cases[ , 2]), test_cases[ , 3])

## RUnit
library(RUnit)
test_my_sum <- function() {
  checkEquals(my_sum(test_cases[ , 1], test_cases[ , 2]), test_cases[ , 3])
}
Inquisition answered 2/1, 2013 at 20:54 Comment(0)
T
2

sapply could be useful

Sum <- function(x, y) {  # Sum is much better than sum,this avoids problems with sum base function
  return (x + y)
}

test_cases <- matrix( c(2, 2, 4,  # I think a matrix structure is better to handle this problem
                        3, 3, 6,
                        0, 0, 0,
                        -1, 2, 1), ncol=3, byrow=TRUE)

# Applying your function and comparing the result with the expected result.
sapply(1:nrow(test_cases), function(i) Sum(test_cases[i,1], test_cases[i,2]))==test_cases[,3]

TRUE TRUE TRUE TRUE  # indicates the result is as expected.
Transoceanic answered 18/9, 2012 at 15:13 Comment(1)
thank you, the problem is that this won't be seen by the RUnit launcher. I forgot to say that I have another run_tests.R script, which parses all the scripts in a directory, recognizes all the functions whose name starts with "test.", and execute them as tests. I supposed that this is the standard way of running tests in R, but maybe I am python-biased.Loathing

© 2022 - 2024 — McMap. All rights reserved.