2017-03-15 4 views
0

내 테스트를 실행하기 전에 일부 데이터 파일이 있어야합니다. 파일이 너무 크기 때문에 VCS에 커밋하지 않고 대신 스크립트를 사용하여 필요할 때 생성합니다. 그러나 파일을 생성하는 데에도 많은 시간이 걸리기 때문에 make test을 실행할 때마다 한 번만 생성하고 다시는 생성하지 않을 것입니다.cmake 테스트 데이터 생성

내 테스트가 디스크에있는 파일의 존재 여부에 의존하게하고, 존재하지 않거나 오래된 파일 인 경우 cmake가 해당 파일을 다시 생성하도록 할 수 있습니까?

나는 시도한 다음 있지만 작동하지 않는 것 :

enable_testing() 
add_test(NAME foo COMMAND bla myfile.txt) 
set_tests_properties(foo PROPERTIES DEPENDS myfile.txt) 
add_custom_command(OUTPUT myfile.txt COMMAND createmyfile) 

이 가능한 모든 있습니까?

+0

을 MyTest.cpp 단계에서 b로 (CTest 커스터마이징 참고) (https://cmake.org/Wiki/CMake/Testing_With_CTest#Customizing_CTest)를 참조하십시오.) CTest 커스터마이징 커맨드를 추가 할 수 있습니다. – Florian

+0

@Florian하지만 빌드 후 단계가 필요 없습니다. 테스트의 전제 조건을 지정하고 싶습니다. 그렇지 않으면 나는 "make test"를 실행하고 필요한 모든 것이 이미 컴파일되었다고 가정 할 수 없다. 그리고 나는'CTEST_CUSTOM_PRE_TEST'가 명령이 * 항상 * 실행되고 필요할 때만 실행되기 때문에 어떻게 작동 하는지를 보지 못했습니다. – josch

+0

중복에 대한 설명 : ** 테스트를 위해 ** 파일을 생성하고 싶습니다. 중복 된 질문은 ** 테스트 실행 파일 **에 대해 묻습니다. CMake의 관점에서 볼 때 두 가지 액션은 단지 CMake 타겟 일뿐입니다. – Tsyvarev

답변

0

예 가능합니다. CMake는 대상과 파일 간의 종속성을 추가 할 수 있으며 이러한 파일은 원본 파일 일 필요가 없습니다.

코드 단계가 잘 보입니다 (빌드하지 않았 음)하지만 테스트 빌드가 누락되었다고 가정합니다.

add_custom_command 대신 add_custom_target을 사용합니다. 화장 실행 중에

CMakeLists.txt

cmake_minimum_required(VERSION 2.8.12) 
add_library(mylib SHARED mylib.cpp) 

# Create out.dat as an example 
add_custom_target(testfile_outdat COMMAND touch out.dat) 

add_executable(mytest mytest.cpp) 
target_link_libraries(mytest mylib) 
add_dependencies(mytest testfile_outdat) 
add_test(NAME mytest COMMAND mytest) 

예는 코드를 생성한다. 이 솔루션은 데이터가 테스트로 수정되지 않는 경우 적합합니다.

가 아니라 MYTEST는 일부 플랫폼 특정 물건 수 테스트 데이터 파일을 만들 명령에 따라 시험

로서 사용되는 선언에 따라 대상 MYTEST 만든 테스트 데이터 생성 가능하다. 따라서 지원할 플랫폼에 따라 다른 custom_target을 만들 수 있습니다.

mylib.h

bool compare(int a, int b); 

mylib.cpp

#include "mylib.h" 
bool compare(int a, int b) 
{ 
    return a == b; 
} 

당신이 중 하나를 가지고 포스트 빌드로 추가 할 수

#include <stdio.h> 
#include "mylib.h" 
int main(int arcc, char* argv[]) 
{ 
    bool actual = compare(1, 1); 
    bool expected = true; 
    printf("Testresult %s\n", (actual == expected) ? "OK" : "Failed"); 
    return 0; 
} 
+0

좋습니다. 방법? 나는 이미 시도한 것과 그것이 작동하지 않는다는 것을 설명했다. – josch

+0

예제를 확장했습니다. 그러나 "터치"는 플랫폼에 따라 다릅니다. –

+0

당신은 내 문제가 있다고 가정합니다. 테스트를 수행하는 실행 파일을 빌드하는 방법을 모르지만 문제가 아닙니다. (그리고 누가 먼저 실행 파일을 컴파일해야하며 쉘 스크립트가 아니라고합니다 ?). 내 문제는 필자의 테스트가 필요에 따라 생성 된 입력 파일에 의존하도록하고 싶지 않다는 것이다. 혼란을 해결할 수 있도록 내 질문에 대해 명확하지 않은 점을 알려주십시오. – josch