2012-05-31 14 views
21

Estoy empezando a implementar pruebas para un paquete R, y he estado usando el paquete testthat. Tenga en cuenta que soy nuevo en las pruebas, por lo que tal vez mi enfoque sea inactivo.¿Cómo comprobar que no se produce un error?

Tengo una función que actualmente falla la décimo sexta vez que se ejecuta, y antes de arreglar esto, quiero escribir una prueba de regresión que la atrape si vuelve a aparecer.

por ejemplo, la siguiente siempre lanza el mismo mensaje de error:

for i in (1:17) myfun() 

myfun no devuelve nada, que sólo tiene un efecto secundario de la apertura de una conexión de base de datos. Es claro para mí que puedo escribir una prueba que espera un error y pasa si se devuelve:

expect_error(for (i in 1:17) myfun()) 

Pero no acabo de conseguir la forma de escribir una prueba para asegurarse de que no se produce el error. Como no es obvio, tal vez mi enfoque es incorrecto. Puedo averiguar cómo escribir pruebas más específicas, pero me gustaría comenzar con esta.

¿Qué tipo de prueba escribiría para asegurarme de que dicho error no aparezca?

Respuesta

19

edición mayor debido a cambios en testthat

desde la versión 0.11 (a través de RStudio blog) hay un apoyo directo a prueba la falta de errores:

expect_error(myfun(), NA) 

Lo mismo para atrapar warning y message:

expect_warning(myfun(), NA) 
expect_message(myfun(), NA) 

Nota al margen: si la prueba de bucle no es info parametr en expect_xxx funciones para pasar información adicional. Por lo que puede hacer:

for (i in 1:17) expect_error(myfun(), NA, info = paste("i =", i)) 
5

Por ejemplo:

context("test error") 
test_that("test error 1", { 
    expect_true({log(10); TRUE}) 
}) 

test_that("test error 2", { 
    expect_true({log("a"); TRUE}) 
}) 

pondrá a prueba si hay un error.

> test_file("x.r") 
test error : .1 


    1. Error: test error 2 ------------------------- 
    Non-numeric argument to mathematical function 
    1: expect_true({ 
      log("a") 
     TRUE 
    }) 
    2: expect_that(object, is_true(), info, label) 
    3: condition(object) 
    4: expectation(identical(x, TRUE), "isn't true") 
    5: identical(x, TRUE) 

esto significa que la primera parte pasó la prueba mientras que la segunda parte falló.

+0

gracias, pero no estoy familiarizado con el uso de las llaves y punto y coma dentro de la expectativa (por ejemplo, 'expect_true ({...; ...})') podría por favor, ¿explicar? –

+0

Puedes poner cualquier expresión allí. Y el '{...; ...; ...} 'es solo una expresión. Entonces, en su caso, debe escribirse como 'expect_true ({for (i en 1:17) {myfun()}; TRUE})'. – kohske

+0

Esto básicamente trata de detectar un error, ya que un error evitaría que se evalúe la segunda parte de la expresión (en este caso, 'TRUE'). –

2

Aquí es una solución con la expectativa de que los rendimientos tryCatch0 cuando no se produce el error:

expect_equal(tryCatch(for(i in 1:17) myfun()), 0) 
7

Tal envolverla con otro expect_error.

Ejemplo:

expect_error(1) 
expect_error(expect_error(1)) 
+1

¡Eres un genio! – qed

+0

Parece que ya no funciona (versión 1.0.2) –

Cuestiones relacionadas