맨 마지막 테스트 함수의 테스트 준비단계가 2번 실행되는 버그가 있는 것같다.
나의 test case가 성공할 때도 있고 실패할 때도 있는 이상한 상태가 되어서 내 잘못인 줄 알고 개발중인 모듈의 여기저기를 손댔다가 갑자기 느끼는 바가 있어 EUnit을 테스트하는 간단한 코드를 만들었다.
일단 공식적으로 버그 리포트는 했고,
참고를 위해 글을 남긴다.
do_some_prep()가 두번 불려지면 당혹스런(?) 테스트 실패가 나올 수 있다. disk i/o나 DB operation 처럼 side effect가 있는 경우에 특히 테스트가 통과될 때도 있고 안될때도 있는 불안정한 상태가 될 수 있다.
happy hackin'
ps. 글을 쓰고 좀더 만져 보니 조금 더 복잡하다. EUnit 사이트에 올린 케이스들 말고 테스트 케이스를 다음과 같이 하면...
결과:
2008-12-31 "by design" 이라는군요 Orz. side effect가 있는 함수는 준비단계에서 부르면 절대 안되겠습니다.
나의 test case가 성공할 때도 있고 실패할 때도 있는 이상한 상태가 되어서 내 잘못인 줄 알고 개발중인 모듈의 여기저기를 손댔다가 갑자기 느끼는 바가 있어 EUnit을 테스트하는 간단한 코드를 만들었다.
일단 공식적으로 버그 리포트는 했고,
참고를 위해 글을 남긴다.
last_test_() ->
do_some_prep(), % 요놈이 매번 두번씩 불린단 말씀.
... do some tests ...
happy hackin'
ps. 글을 쓰고 좀더 만져 보니 조금 더 복잡하다. EUnit 사이트에 올린 케이스들 말고 테스트 케이스를 다음과 같이 하면...
twice_case1_test_() ->
io:format("c1: prep one~n"),
?_assert(1 + 1 =:= 2).
twice_case2_test_() ->
io:format("c2: prep one~n"),
?_assert(1 + 1 =:= 2).
twice_case3_test_() ->
io:format("c3: prep one~n"),
?_assert(1 + 1 =:= 2).
io:format("c1: prep one~n"),
?_assert(1 + 1 =:= 2).
twice_case2_test_() ->
io:format("c2: prep one~n"),
?_assert(1 + 1 =:= 2).
twice_case3_test_() ->
io:format("c3: prep one~n"),
?_assert(1 + 1 =:= 2).
결과:
(emacs@desktop)14> eunit_twice_case:test().
c3: prep one
c2: prep one
c3: prep one
c2: prep one
c1: prep one
All 3 tests successful.
ok
마지막에 있는 두개가 두번씩 불린다.c3: prep one
c2: prep one
c3: prep one
c2: prep one
c1: prep one
All 3 tests successful.
ok
2008-12-31 "by design" 이라는군요 Orz. side effect가 있는 함수는 준비단계에서 부르면 절대 안되겠습니다.