如何通过CTest测试SQLite表是否存在并获得响应?

时间:2017-01-20 20:35:06

标签: c++ sqlite cmake ctest

这是我的主要代码:

   sqlite3 *db;
   sqlite3_stmt * stmt;
   string sqlstatement = "CREATE TABLE IF NOT EXISTS accounts (account_id integer primary key, balance integer not null)";

   if (sqlite3_open("test.db", &db) == SQLITE_OK)
   {
    sqlite3_prepare( db, sqlstatement.c_str(), -1, &stmt, NULL );//preparing the statement
    sqlite3_step( stmt );//executing the statement
   }

   sqlite3_finalize(stmt);
   sqlite3_close(db);

   return 0;

这是我的CMakeLists.txt:

cmake_minimum_required(VERSION 2.8.12.2)
enable_testing()
set(TEST_EXE_NAME tests)
add_executable(test main.cpp)
add_executable(${TEST_EXE_NAME} tests.cpp)
add_test(NAME "tests" COMMAND ${TEST_EXE_NAME})
target_link_libraries(tests sqlite3)

我怎样才能有另一个C ++测试文件test.cpp,它测试main中提到的表是否已成功创建?

我的测试文件包含以下代码:

string sql = ".tables";
sqlite3 *db;
sqlite3_stmt * stmt;

int rc=0;
if (sqlite3_open("test.db", &db) == SQLITE_OK) {
    rc = sqlite3_prepare_v2(db, sql.c_str(), -1, &stmt, NULL);
    rc = sqlite3_step(stmt);

}
return 0;

如何从“.tables”获得回复?

2 个答案:

答案 0 :(得分:0)

使用sqlite,您可以使用pragma .table列出所有现有表。因此,您可以使用

在c中执行此操作
string sqlstatement = ".table";

并检查结果。

或者您可以使用

作为sqlite3命令行调用来执行此操作
sqlite3 test.db ".table"

并用c或bash或ctest检查结果

bash的例子

sqlite3 test.db ".table" | grep accounts
if [[ "$?" != "0" ]]; then echo "Rescue the world"; fi 

从ctest中使用它:

  1. 将其放入脚本文件中,例如checkdb.sh

    /usr/local/bin/sqlite3 /path/to/test.db ".table" | grep accounts > /dev/null

  2. 使脚本可执行

    chmod a+x checkdb.sh

  3. 将以下内容添加到您的CMakeLists.txt

    add_test(NAME check_database COMMAND "checkdb.sh")

答案 1 :(得分:0)

sqlite3* database;
sqlite3_open("test.db", &database);
sqlite3_stmt *statement;
if(sqlite3_prepare_v2(database, "select * from accounts;", -1, &statement, 0) == SQLITE_OK)
{
    return 0;
}
else {
    return -1;

}