Cum de a testa că nu apare o eroare?

Încep să implementez testarea pentru un pachet R și am folosit pachetul testthat . Rețineți că sunt nou la testare, deci probabil că abordarea mea este oprită.

Am o funcție care în prezent nu reușește a șaisprezecea oară când este executată și, înainte de a repara acest lucru, vreau să scriu un test de regresie care să îl captureze dacă apare din nou.

de exemplu, următoarele afișează întotdeauna același mesaj de eroare:

 for i in (1:17) myfun()

myfun does not return anything, it only has a side-effect of opening a database connection. It is clear to me that I can write a test that expects an error and passes if it is returned:

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

Dar nu prea înțeleg cum să scriu un test pentru a vă asigura că eroarea nu apare. Cum nu este evident, poate că abordarea mea este greșită. Îmi dau seama cum să scriu mai multe teste specifice, dar aș vrea să încep cu asta.

Ce tip de test aș scrie pentru a vă asigura că nu apare o astfel de eroare?

24

4 răspunsuri

Editare majoră din cauza modificărilor efectuate în acest test

De la versiunea 0.11 (prin blogul RStudio ) există suport direct pentru testarea lipsei de erori:

expect_error(myfun(), NA)

Același lucru pentru capturarea warning și message :

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

Notă laterală: dacă testați buclă, parametrul info din funcțiile expect_xxx este necesar pentru a transmite informații suplimentare. Deci, puteți face:

for (i in 1:17) expect_error(myfun(), NA, info = paste("i =", i))
21
adăugat

Poate o împachetezi cu o altă așteptare.

Exemplu:

expect_error(1)
expect_error(expect_error(1))
7
adăugat
Esti un geniu!
adăugat autor qed, sursa
Nu pare să mai funcționeze (versiunea 1.0.2)
adăugat autor Kevin Zarca, sursa

De exemplu:

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

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

va testa dacă există o eroare.

> 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)

aceasta înseamnă că prima parte a trecut testul în timp ce a doua parte a eșuat.

5
adăugat
mulțumesc, dar nu știu cum să folosiți brațele curl și semi-colon în așteptare (de exemplu, expect_true ({...; ...}) ).
adăugat autor David LeBauer, sursa
Deci, în principiu, aceasta este o încercare de a prinde o eroare, deoarece o eroare ar împiedica evaluarea a doua parte a expresiei (în acest caz, TRUE )?
adăugat autor David LeBauer, sursa
Îmi place simplitatea acum, pe care o înțeleg
adăugat autor David LeBauer, sursa
Puteți pune orice expresie acolo. Și {...; ...; ...} este doar o expresie. Deci, în cazul tău, ar trebui să fie scris ca expect_true ({pentru (i în 1:17) {myfun ()}; TRUE}) .
adăugat autor kohske, sursa
Da, exact. TRUE poate fi înlocuită cu orice valoare.
adăugat autor kohske, sursa

Iată o soluție folosind așteptarea că tryCatch returnează 0 atunci când eroarea nu apare:

expect_equal(tryCatch(for(i in 1:17) myfun()), 0)
3
adăugat