如何在C++中对void函数进行单元测试



我正在做一个业余项目,主要学习cpp单元测试和数据库编程。然而,我有点迷失了&困惑于我应该如何编写代码以进行正确的测试。我倾向于为我的cpp项目编写许多void函数。但现在我不知道该如何测试这些功能。我已经成功地测试了非void函数,因为它们返回的东西可以很容易地根据值进行测试。

阿美,我做事不专业?我是否应该尽可能避免使用void函数,以便测试这些函数?或者我错过了什么?例如,我将如何测试这个功能-

database.cpp

#include "database.hpp"
#include <sqlite3.h>
#include <iostream>
#include "spdlog/sinks/basic_file_sink.h"
// Creating the logging object
auto logger = spdlog::basic_logger_mt("appnotex", "../data/appnotexlog");
void Database::createDb(const char *dbname) {
// Creating the database file
sqlite3 *datadb;
int status = sqlite3_open(dbname, &datadb);
//    checking for errors
if (status == SQLITE_OK) {
logger->info("------------ New Session ----------");
logger->info("Connected to Database Successfully");
} else {
std::string errorMessage = sqlite3_errmsg(datadb);
logger->info("Error: " + errorMessage);
}

如果需要

  • 我正在使用谷歌测试框架
  • 我的整个项目代码托管在这里

更新

我试过这个,这个方法测试上面的方法正确吗?

databaseTest.cpp

TEST(DatabaseTest, createDbTest) {
const char *dbfilename = "../data/test/data.db";
const char *tbname = "DataTest";
Database *db = new Database();
std::ifstream dbfile("../data/test/data.db");
bool ok = false;
if (!dbfile.is_open())
ok = false;
else
ok = true;
EXPECT_TRUE(ok);
}

问题不在于返回void的函数。想想它是如何发出错误信号的,并确保所有案例(成功和失败(都经过测试,就这么简单。

然而,除了日志记录之外,我根本看不到任何错误信号。根据经验,日志记录只应用于尸检等。因此,如果日志记录完全失败,您的程序仍然可以正确运行。这意味着,内部没有任何东西依赖于它,它不是一个合适的错误处理/信号机制。

现在,基本上有三种方式可以发出错误信号:

  1. 返回值。通常用于C代码,有时也用于C++。对于void返回,这不是一个选项,这可能是您问题的根源
  2. 例外情况。您可以throw std::runtime_error("DB connect failed");并将其处理委托给调用代码
  3. 副作用。您可以将连接状态存储在Database实例中。为了完整性,使用全局errno也是可能的,但不可取

在任何情况下,这三种方法都可以在单元测试中进行练习和验证。

最新更新