2017-03-15 118 views
0

我的測試需要一些數據文件才能運行。這些文件很大,所以我不想將它們提交到我的VCS中,而是使用腳本按需生成它們。但生成文件也需要很長時間,所以我只想生成一次,而不是每次運行make testcmake生成測試數據

是否有可能讓我的測試依賴於磁盤上的文件的存在,並告訴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

您可以採取以下將其添加爲生成後步驟b建立'bla'或者你可以在全局或'CTestCustom.cmake'中添加'CTEST_CUSTOM_PRE_TEST'命令(參見[Customizing CTest](https://cmake.org/Wiki/CMake/Testing_With_CTest#Customizing_CTest))。 – Florian

+0

@弗洛裏安,但我不想要一個後構建步驟 - 我想指定測試的先決條件。否則,我不能只運行「make test」並假定所需的所有內容都已經被編譯(或將被編譯)。我不明白CTEST_CUSTOM_PRE_TEST是如何工作的,因爲該命令總是被執行,而不僅僅是在需要時執行。 – josch

+0

重複說明:您想**爲測試生成一些文件**。重複的問題詢問**測試可執行文件**。從CMake的角度來看,這兩個行動都只是CMake的目標。 – Tsyvarev

回答

0

是的,它是可能的。 CMake可以添加目標和文件之間的依賴關係,這些文件不需要是源文件。

您的代碼步驟看起來不錯(我沒有構建它),但我認爲缺少的是構建測試。

而且我用add_custom_target代替add_custom_command

的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_targets。

mylib.h

bool compare(int a, int b); 

mylib.cpp

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

mytest.cpp

#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

你認爲我的問題是,我不知道如何構建執行測試的可執行文件,但這不是問題(誰說可執行文件必須首先編譯,而不僅僅是一個shell腳本?)。我的問題是,我希望我的測試依賴於按需生成的輸入文件(如果不需要,不會再生成)。請告訴我什麼不清楚我的問題,以便我可以澄清混淆。 – josch