2014-11-25 20 views
2

비교 기능을 위해 Boost :: Test 프레임 워크를 사용하여 단위 테스트를 작성하고 있습니다. 각 테스트 케이스에 대해 일련의 입력 요소를 만들고이를 쌍으로 비교하여 각 쌍에 대한 비교 함수의 반환 값을 확인합니다. 수동으로 작성하거나 함수를 작성할 수 있습니다. 단위 테스트에서 기능을 작성하는 것은 좋지 않습니다. 왜냐하면 우리는 실패가있을 때 유용한 정보를 얻지 못하기 때문입니다. 수동으로 각 수표를 작성하면 매우 긴 단위 테스트가 수행됩니다. 그래서 매크로를 사용하여 검사 할 요소를 반복하기로 결정했습니다. 부분적으로 테스트 케이스에서부스트 전 처리기의 반복 제한

#define CHECK_NODE_LESS(less, more) do {\ 
     BOOST_CHECK_EQUAL(compareQueueUnderTest((less), (more)), true); \ 
     BOOST_CHECK_EQUAL(compareQueueUnderTest((more), (less)), false); \ 
} while (false) 

#define CHECK_NODE_ORDER_ELEMENT(r, elem1, elem2) CHECK_NODE_LESS(elem1, elem2); 

#define CHECK_NODE_ORDER_INNER_LOOP(r, list, i, elem) \ 
     BOOST_PP_SEQ_FOR_EACH(CHECK_NODE_ORDER_ELEMENT, elem, \ 
         BOOST_PP_SEQ_REST_N(i, list)) 

#define CHECK_NODE_ORDER(nodes) \ 
     BOOST_PP_SEQ_FOR_EACH_I(CHECK_NODE_ORDER_INNER_LOOP, \ 
         BOOST_PP_SEQ_TAIL(nodes), nodes) 

하지만 전체 순서는 내가 정렬 요소를 확인하기 위해 해당 요소에 CHECK_NODE_LESS 매크로를 사용하지 않으며, 그것을 잘 작동합니다 : 그것은 다음과 같습니다. 총 주문이있는 테스트 케이스에서는 CHECK_NODE_ORDER 매크로를 사용합니다. 예 :

CHECK_NODE_ORDER((node1)(rootNode1)(node2)(rootNode2)); 

이제이 파일은 컴파일되지 않습니다. 테스트 한 첫 번째 것은 CHECK_NODE_LESS 매크로를 주석 처리하고 전 처리기를 실행하여 생성 된 내용을 확인하는 것입니다. 그것은 내가 예상했던 것입니다 : CHECK_NODE_LESS은 올바른 요소에 대해 호출되었습니다. 그런 다음 CHECK_NODE_LESS을 다시 도입하고 전 처리기를 실행하여 어떤 일이 발생하는지 확인했습니다. Boost Test에서 사용 된 매크로 때문에 결과가 정말 못 생겼지 만 일부 매크로가 확장되지 않은 것을 볼 수 있습니다.

마지막으로, 나는 다음과 CHECK_NODE_LESS을 변경하고 지금은 잘 작동 :

#define CHECK_NODE_LESS(less, more) do {\ 
     BOOST_CHECK(compareQueueUnderTest((less), (more))); \ 
     BOOST_CHECK(!compareQueueUnderTest((more), (less))); \ 
} while (false) 

나는 문제 중 하나 내가 함께 BOOST_CHECK_EQUAL를 사용하는 경우 초과 부스트 전 처리기 라이브러리의 일부 반복 한계가 있다고 생각 다른 매크로와 함께 사용하거나 컴파일러에 전 처리기 깊이 제한이 있습니다 (필자는 Clang 3.4를 사용합니다). 이 제한은 무엇이며 어떻게 늘릴 수 있습니까?

답변

2

좋은 주님.

Boost.Test에서 일하는 사람이 아무리 노력해도 될 가능성이 매우 높습니다. 이 문제는 컴파일러의 제한 사항이 아니며, BOOST_PP_SEQ_FOR_EACH은 재진입 가능하지 않으며 BOOST_CHECK_EQUAL은이를 사용합니다. 이 때문에 BOOST_PP_SEQ_FOR_EACH 안에 BOOST_CHECK_EQUAL을 사용할 수 없습니다. BOOST_CHECKBOOST_PP_SEQ_FOR_EACH을 사용하지 않기 때문에 작동합니다.

#define CHECK_NODE_ORDER_INNER_LOOP(r, list, i, elem) \ 
    BOOST_PP_LIST_FOR_EACH(CHECK_NODE_ORDER_ELEMENT, elem, \ 
          BOOST_PP_SEQ_TO_LIST(BOOST_PP_SEQ_REST_N(i, list))) 

내가 중첩 루프의 목적으로 목록으로 순서를 변환하는 것은 오히려 추한 것을 알고 :

나는이 해결 방법을 제안한다. 나의 변론에서 내가 생각할 수있는 가장 못 생기는 접근법이다.

+0

감사합니다. 솔루션이 작동합니다. 나는 적어도 bool을 확인하는 동안 해결 방법을 선호한다. – petersohn