테스트 주도의 개발을 위한 Unit Test in R
유닛 테스트를 통한 Test Driven Development (TDD)를 생각해 보자.
RUnit 테스팅을 위해서는 RUnit
와 testthat
두 개의 package가 존재 한다.
사용할 수 있는 함수
expect_true(x): x가 참인가
expect_false(x): x가 거짓인가
expect_equal(object, expected): object가 기대되는 값 expected와 동일한가. 값의 비교에는 all.equal()이 사용되며 all.equal()은 두 객체가 (거의) 같은지를 비교한다. 따라서 부동소수의 경우 epsilon 이하로 차이나는 두 값은 같은 값으로 취급한다.
expect_equivalent(x,y): x,y가 동등한가. expect_equal()과 달리 속성 (예를 들면, rownames)을 제거한 뒤 값만 비교 한다.
생성한 파일 구조는 아래와 같다.
tests/test_fibo.R #test case가 저장됨
run_tests.R #test 실행 명령어들의 집함
fibo.R # test할 함수가 저장됨
소스코드
fibo.R
fibo <- function(n){
if(n==0 || n == 1){
return(1)
}
return(fibo(n-1) + fibo(n-2))
}
run_tests.R
require(testthat)
source("fibo.R")
test_dir("tests", reporter="summary")
tests/test_fibo.R
context("fibonacci series")
test_that("base test",{
expect_equal(1, fibo(0))
expect_equal(1, fibo(1))
})
test_that("recursion test",{
expect_equal(2, fibo(2))
expect_equal(3, fibo(3))
expect_equal(5, fibo(4))
})
실행 결과
정상적인경우
> source("run_tests.R")
fibonacci series: .....
DONE ============================================================================================================================================
의도적으로 오류를 발생 시키자
expect_equal(0, fibo(4))
문제가 있는 경우
> source("run_tests.R")
fibonacci series: ....1
Failed ------------------------------------------------------------------------------------------------------------------------------------------
1. Failure: recursion test (@test_fibo.R#12) ----------------------------------------------------------------------------------------------------
0 not equal to fibo(4).
1/1 mismatches
[1] 0 - 5 == -5
DONE ============================================================================================================================================
참고문헌
[1] R을 이용한 데이터 처리 & 분석 실무, 서민구
'AI > R Basic' 카테고리의 다른 글
빈도분석 표와 백분율 구하기 (0) | 2016.08.21 |
---|---|
Vector 분할 (0) | 2016.08.21 |
Missing Value (0) | 2016.03.20 |
병렬화를 통한 연산 성능 향상 및 성능 측정 방법 (0) | 2016.03.06 |
위도,경도를 주소로 변환 ggmap package를 이용한 (geocoding and revgeocode in R) (0) | 2016.03.03 |