CMake에서 테스트 결과 평가: "PASS_REGULAR_EXPRESSION" 심층 분석

2024-04-10

CMake에서 "Properties: Tests"와 관련된 "PASS_REGULAR_EXPRESSION" 프로그래밍

기본 구문:

set_property(TEST my_test PROPERTY PASS_REGULAR_EXPRESSION "정규 표현식")
  • my_test: 테스트 이름
  • 정규 표현식: 테스트 결과 문자열에서 일치해야 하는 패턴

사용 예시:

  • 테스트 출력에 특정 문구가 포함된 경우 성공:
set_property(TEST my_test PROPERTY PASS_REGULAR_EXPRESSION ".*Test passed.*")
  • 테스트 종료 코드가 0인 경우 성공:
set_property(TEST my_test PROPERTY PASS_REGULAR_EXPRESSION "^0$")
  • 여러 조건을 OR 연산자로 연결:
set_property(TEST my_test PROPERTY PASS_REGULAR_EXPRESSION ".*Test passed.*|.*All tests successful.*")

주의 사항:

  • 정규 표현식은 PCRE (Perl Compatible Regular Expressions) 형식을 따릅니다.
  • .은 모든 문자를, *은 앞 문자가 0번 이상 반복되는 것을 나타냅니다.
  • ^은 문자열 시작을, $은 문자열 끝을 나타냅니다.
  • 더 복잡한 정규 표현식은 PCRE 문서를 참조하십시오.

추가 정보:

  • "PASS_REGULAR_EXPRESSION" 외에도 "FAIL_REGULAR_EXPRESSION" 속성을 사용하여 테스트 실패 조건을 정의할 수 있습니다.
  • CMake 테스트 프레임워크(CTest)는 "PASS_REGULAR_EXPRESSION" 속성을 사용하여 테스트 결과를 보고합니다.

예시 코드:

add_test(NAME my_test
  COMMAND ./my_test)

set_property(TEST my_test PROPERTY PASS_REGULAR_EXPRESSION ".*Test passed.*")

message(STATUS "Running test: my_test")
ctest -V my_test

if(NOT CTEST_TEST_PASSED)
  message(ERROR "Test failed: my_test")
endif()

이 코드는 "my_test"라는 테스트를 실행하고 "Test passed" 문구가 출력되면 성공으로 간주합니다.

결론:

"PASS_REGULAR_EXPRESSION"은 CMake에서 테스트 결과를 유연하게 평가하는 데 사용할 수 있는 강력한 기능입니다. 정규 표현식을 사용하여 테스트 출력의 특정 부분을 검사하고 테스트 성공 여부를 판단할 수 있습니다.



예제 코드

cmake_minimum_required(VERSION 3.15)

project(MyProject)

add_executable(my_test
  main.cpp)

set_property(TEST my_test PROPERTY PASS_REGULAR_EXPRESSION ".*Test passed.*")

message(STATUS "Running test: my_test")
ctest -V my_test

if(NOT CTEST_TEST_PASSED)
  message(ERROR "Test failed: my_test")
endif()

main.cpp:

#include <iostream>

int main() {
  std::cout << "Test passed!" << std::endl;
  return 0;
}

이 코드를 실행하면 다음과 같은 출력이 나타납니다.

Running test: my_test
Test passed!
[==========] 1 test from 1 test case ran.
[  PASSED  ] my_test

설명:

  • add_executable 명령어는 "my_test"라는 실행 파일을 생성합니다.
  • set_property 명령어는 "my_test" 테스트의 "PASS_REGULAR_EXPRESSION" 속성을 ".Test passed."로 설정합니다.
  • ctest 명령어는 "my_test" 테스트를 실행합니다.
  • if 문은 테스트 결과가 성공 여부를 확인하고 결과를 출력합니다.

테스트 실패 예시:

#include <iostream>

int main() {
  std::cout << "Test failed!" << std::endl;
  return 1;
}

이 코드를 실행하면 다음과 같은 출력이 나타납니다.

Running test: my_test
Test failed!
[==========] 1 test from 1 test case ran.
[  FAILED  ] my_test

결론:

"PASS_REGULAR_EXPRESSION" 속성을 사용하여 테스트 결과를 유연하게 평가할 수 있습니다. 정규 표현식을 사용하여 테스트 출력의 특정 부분을 검사하고 테스트 성공 여부를 판단할 수 있습니다.



"PASS_REGULAR_EXPRESSION" 대체 방법

add_test(NAME my_test
  COMMAND ./my_test)

check_output(RESULT
  COMMAND ./my_test
  REGEX ".*Test passed.*")

if(NOT RESULT)
  message(ERROR "Test failed: my_test")
endif()

CHECK_OUTPUT 매크로는 테스트 실행 결과를 검사하고 정규 표현식과 일치하는지 확인합니다.

ctest 명령어 옵션:

ctest -R ".*Test passed.*" my_test

ctest 명령어에는 테스트 결과를 필터링하는 옵션들이 있습니다. -R 옵션은 테스트 결과 문자열에서 특정 패턴을 찾아 일치하는 테스트만 출력합니다.

사용자 정의 테스트 프레임워크:

CMake 테스트 프레임워크(CTest) 외에도 Google Test, Boost Test 등 다양한 테스트 프레임워크를 사용할 수 있습니다. 이러한 프레임워크는 테스트 결과를 평가하는 다양한 기능을 제공합니다.

테스트 스크립트:

테스트 결과를 평가하는 스크립트를 직접 작성할 수 있습니다. Python, Perl 등 다양한 스크립팅 언어를 사용하여 테스트 결과 파일을 읽고 분석하여 성공 여부를 판단할 수 있습니다.

장단점 비교:

방법장점단점
PASS_REGULAR_EXPRESSION간단하고 직관적정규 표현식에 대한 지식 필요
CHECK_OUTPUT더 많은 기능 제공코드 복잡도 증가
ctest 명령어 옵션간단하고 빠르다기능 제한적
사용자 정의 테스트 프레임워크유연하고 강력개발 및 유지 관리 노력 필요
테스트 스크립트최대한의 제어 가능스크립팅 언어에 대한 지식 필요

선택 기준:

  • 테스트의 복잡도
  • 필요한 기능
  • 개발 및 유지 관리 시간

결론:

"PASS_REGULAR_EXPRESSION"은 간단한 테스트에 적합하지만, 더 복잡한 테스트에는 CHECK_OUTPUT 매크로, ctest 명령어 옵션, 사용자 정의 테스트 프레임워크, 테스트 스크립트 등을 사용하는 것이 더 유리할 수 있습니다.




CMake의 "Commands"와 관련된 "source_group()" 사용법: 코드 작성 및 그룹화

source_group() 명령에는 두 가지 서로 다른 형식이 있습니다.1. 개별 파일 그룹화이 형식은 지정된 이름으로 그룹을 만들고 그룹에 포함될 소스 파일을 개별적으로 나열하거나 정규 표현식을 사용하여 일치하는 파일을 자동으로 추가합니다



CMake에서 target_link_libraries() 함수 활용: 완벽한 가이드

함수 기본 구조:주요 파라미터:<타겟 이름>: 링크를 설정할 타겟의 이름입니다.PUBLIC | PRIVATE | INTERFACE: 링크 유형을 지정합니다. PUBLIC: 타겟을 사용하는 다른 타겟에서도 해당 라이브러리에 대한 의존성이 명시됩니다


CMake "Properties: Directories"와 "TESTS"를 사용한 테스트 케이스 구성 및 실행

"Properties: Directories"는 CMakeLists. txt 파일에서 디렉토리 속성을 설정하는 데 사용됩니다. 테스트 케이스와 관련된 주요 속성은 다음과 같습니다.SOURCE_GROUP: 테스트 케이스 소스 파일을 그룹화하는 데 사용됩니다


"VS_CSHARP_tagname" 속성 사용

구문:예제:위 예제에서는 myapp라는 이름의 대상에 "Core" 및 "Logic"라는 두 개의 태그가 지정됩니다. Visual Studio에서 이 대상을 빌드하면 이러한 태그가 코드 파일에 적용됩니다.사용법:"VS_CSHARP_tagname" 속성은 다음과 같은 다양한 목적으로 사용할 수 있습니다


CMake "Properties: Targets"에서 "PRECOMPILE_HEADERS_REUSE_FROM" 프로그래밍

"PRECOMPILE_HEADERS_REUSE_FROM"는 CMake의 "Properties: Targets"에서 사용되는 속성으로, 다른 타겟에서 이미 생성된 프리컴파일 헤더(PCH)를 재사용할 수 있도록 합니다



CMake 정책 CMP0092 프로그래밍

CMake 정책 CMP0092는 target_compile_features 명령어에서 C++17의 <concepts> 헤더 사용을 제어합니다. 이 정책은 CMake 3.29. 0-rc2에서 도입되었습니다.기능CMP0092 활성화:


CMake "Variables"에서 CMAKE_AUTOGEN_ORIGIN_DEPENDS 프로그래밍: 심층 분석

CMAKE_AUTOGEN_ORIGIN_DEPENDS는 CMake 3.14 버전에서 도입된 변수입니다._autogen 타겟에 원본 타겟의 종속성을 전달하는 것을 제어합니다.기본값은 ON이며, 이는 _autogen 타겟이 빌드될 때 원본 타겟의 모든 종속성도 빌드된다는 것을 의미합니다


CMake에서 CMAKE_ANDROID_STL_TYPE 변수 사용하기

사용 가능한 값:none: C++ 지원 없음system: STL 없이 최소 C++gabi++_static: GAbi++ 정적gabi++_shared: GAbi++ 공유gnustl_static: GNU libstdc++ 정적


CMake의 "Properties of Global Scope"에서 AUTOGEN_TARGETS_FOLDER 프로그래밍

설정 방법:set(AUTOGEN_TARGETS_FOLDER <folder_name>) 명령을 사용하여 폴더 이름을 직접 설정합니다.CMAKE_MODULE_PATH에 있는 CMakeLists. txt 파일에서 set(AUTOGEN_TARGETS_FOLDER <folder_name>) 명령을 사용하여 설정합니다


CMake Modules 문서 프로그래밍

모듈 개요:모듈이란 무엇이며 어떻게 작동하는지 설명합니다.CMakeLists. txt 파일에서 모듈을 사용하는 방법을 설명합니다.모듈 작성:CMakeLists. txt 파일을 사용하여 모듈을 만드는 방법을 설명합니다