-
c++ 테스트 도구dev/c++ 2022. 11. 5. 23:29
Catch2
c++ 테스트 도구에는 여러가지 종류가 있다.
Visual C++의 경우 Visual Studio의 테스트 도구를 사용하는 것이 베스트이다.
하지만, 그렇지 않은경우 다른 테스트 도구를 선택해야 하는데.. Google Test, Boost Test 같은 테스트 도구가 있지만, 예전에 써보려다가 사용법을 찾는 것이 어려워 포기했던 기억이 있다.. ㅠ.ㅠ
하지만 이번에 Catch2라는 테스트 도구를 알게되어 사용해보았다.
가장 매력적인 부분은 사용이 매우 쉽다는것이다 ㅎㅎ
linux/mac에서 사용할 수 있고, Catch2는 C++14도 지원하며, 테스트 코드를 작성하기 쉽고, 간결하다고 한다.
그리고 Catch2는 BDD - Behavior Driven Development 도구라고 한다.
버전은 2번대 버전과 3번대 버전이 있는데 이 둘은 사용법에 차이가 있다.
2번대는 헤더파일을 프로젝트에 포함하여 사용하고, 3번대는 라이브러리를 링크하여 사용한다.
나는 이제 시작하는 입장이니 최신인 3번대 버전으로 사용해보았다.
이 글에서는 기존 프로젝트에 어떻게 테스트를 적용할 수 있는지 정도 정리해볼 것이다.사용법
먼저 소스를 클론 받아주고 나면
git clone https://github.com/catchorg/Catch2.git
Catch2가 생긴다. 내가 테스트하고자 하는 프로젝트에 넣어줄 것이다.
테스트할 프로젝트에 그대로 쏙 넣어준다. 요렇게그리고 내 프로젝트의 CMakeLists.txt에 항목을 추가해주어야 한다.
make_minimum_required(VERSION 3.24) project(myproject) add_subdirectory(Catch2) set(srcs sum.cpp) add_executable(main main.cpp ${srcs}) add_executable(tests test.cpp ${srcs}) target_link_libraries(tests PRIVATE Catch2::Catch2WithMain)
add_subdirectory 로 Catch2를 빌드해주어야 하고 (Catch2 v3)
그리고 프로젝트의 실행파일 또는 라이브러리와 별개로, add_executable로 테스트 코드(test.cpp)를 빌드해준다. 그리고 프로젝트의 소스파일(sum.cpp)을 빌드해줘야 테스트 코드에서 프로젝트의 소스를 사용할 수 있다.마지막으로 target_link_libraries(tests PRIVATE Catch2::Catch2WithMain)는 테스트코드를 빌드할때 Catch2의 main함수를 사용하겠다는 의미이다.
빌드하면 main과 tests가 생긴다.
// sum.cpp #include "sum.h" int sum(int a, int b) { return a + b; } // -------------------- // test.cpp #include <catch2/catch_test_macros.hpp> #include "sum.h" TEST_CASE( "sum test", "[sum]" ) { printf("1\n"); SECTION( "sum test 1" ) { REQUIRE( sum(1, 2) == 3 ); } SECTION( "sum test 2" ) { REQUIRE( sum(1, 2) == 4 ); } }
테스트 코드 내용은 매우 간단하다. sum.cpp에 있는 sum함수를 테스트하는 코드이다.
실행하면 아래와 같이 나온다.$ ./tests 1 =============================================================================== test cases: 1 | 1 failed assertions: 2 | 2 passed | 1 failed
이렇게 테스트 코드를 작성하고 실행하면 내 프로젝트의 sum함수가 잘 작동하는지 확인할 수 있다.이렇게 짧게보면 테스트 하는것이 정말 필요가 있나 싶지만..이런 테스트는 무엇보다 프로젝트가 커지고나서유지보수시에 생길 수 있는 사이드 이펙트를 찾아내는데 매우매우 큰 도움이 된다.'dev > c++' 카테고리의 다른 글
함수 한번만 실행하기 std::call_once (0) 2022.11.22 스마트포인터 이해하기 (0) 2022.11.20 가상함수테이블 v-table, 소멸자에 virtual 을 붙히는 이유 (2) 2022.09.20 RAII (0) 2022.08.24 "Debug Assertion Failed! Expression: __acrt_first_block == header" (0) 2022.08.11