기본 콘텐츠로 건너뛰기

유닛 테스팅 in R

# 유닛 테스팅 : 코드의 일반적인 사용 상황과 특이한 사용 상황을 테스트하기 위함.####
# 모든 코드를 항상 유닛 테스트로 확인 할 수는 없음.
# install.packages("testthat")
library(testthat)
a=1:3
b=1:3
names(a)=c('a','b','c')

> a
a b c
1 2 3
> b
[1] 1 2 3


#expect_equal(object, expected) 오브젝트가 기대되는 값 익스펙티드와 동일한가
#두 객체가 (거의)같은지를 비교, 부동 소수의 경우 매우 작은 값 이하로 차이나는 두 값은 같은 값으로 취급
expect_equal(a,b) # 벡터에 부여한 이름이 다르므로 실패

#expect_equivalent() #equal 과 달리 속성값만
expect_equivalent(a,b) # 벡터에 부여한 이름을 무시하므로 테스트 성공 #두 객체가 동일 하다는 말

#expect_equal을 피보나치 수열을 이용해 예를 들어보자
fib=function(n){
  if(n==0){
    return(1)
  }
  if (n>0) {
    return(fib(n-1)+fib(n-2))
  }
}

#expect_equal이용해 fib(0)=1인지 확인
expect_equal(1,fib(0)) #무반응(무반응은 정상 이라는 말)
expect_equal(1,fib(1)) #오류메세지 반환.
결과>>

#이렇게 에러 메세지가 발생했다면 이에 따라 fib()함수를 올바르게 수정해나가면 된다.

#test_that을 사용한 테스트 그룹화####
#그룹화란 test_that 함수를 통해 expect 문장들을 묶어서 실행할 수 있다.
test_that("base case",{
  expect_equal(1,fib(0))
  expect_equal(1,fib(1))
})
결과>>

# 다음은 버그가 없도록 수정한 fibo에 대한 테스트 그룹화.
fib=function(n){
  if (n==0||n==1){
    return(1)
  }
  if(n>=2){
    return(fib(n-1)+fib(n-2))
  }
}

test_that("base test",{            #무반응으로 정상.
  expect_equal(1,fib(0))
  expect_equal(1,fib(1))
})

test_that("recursion test",{      #무반응으로 정상.
  expect_equal(2,fib(2))
  expect_equal(3,fib(3))
  expect_equal(5,fib(4))
})

댓글