如何在C ++中编写单元测试?

时间:2018-09-11 09:44:34

标签: c++ unit-testing testing

我从来没有为我的c ++程序编写过单元测试或任何测试。我只知道它们是为了测试功能/程序/单元是否完全按照您的想法工作,但是我不知道如何编写。有人可以帮我测试示例功能吗?测试框架是什么意思?我要为代码的每个功能和所有分支编写测试,还是为我认为可能很棘手的分支编写测试?

doMode(int i) {

int a = fromString<int>(Action[i][1]);
int b = fromString<int>(Action[i][2]);

cout << "Parameter:\t" << a << "\t" << b << "\t" << endl;
Sleep(200);

return;
}

编辑: 我不是在寻求框架。或更好:可能与我的看法有关。我只是不知道从哪里开始以及如何开始。我必须使用什么语法?取决于我使用哪种框架?

3 个答案:

答案 0 :(得分:2)

您完全可以从没有其他库开始,只需编写一个程序以不同的值调用您的函数,然后检查结果是否符合期望。

这将带您领悟到此功能(采用这种设计)不容易测试...

通常是一个测试框架

  • 减轻了编写main()函数(调用所有测试)的负担
  • 允许编写多个测试功能
  • 提供每个测试程序/每个测试功能的测试设置等功能
  • 还有更多

“要测试的内容”始终是进行冗长讨论的良好起点。我会说,在理想的世界中,是的,您可以测试所有内容。在现有项目中,首先针对要添加/更改的内容编写测试。在新项目中,尽可能进行测试,也许使用TDD,使用代码覆盖率工具来检查您错过的内容。

答案 1 :(得分:1)

这是在没有框架的情况下编写单元测试的方式。

#include <iostream>

// Function to test
bool function1(int a) {
    return a > 5;   
}

// If parameter is not true, test fails
// This check function would be provided by the test framework
#define IS_TRUE(x) { if (!x) std::cout << __FUNCTION__ << " failed on line " << __LINE__ << std::endl; }

// Test for function1()
// You would need to write these even when using a framework
void test_function1()
{
    IS_TRUE(!function1(0));
    IS_TRUE(!function1(5));
    IS_TRUE(function1(10));
}

int main(void) {
    // Call all tests. Using a test framework would simplify this.
    test_function1();
}

答案 2 :(得分:0)

您应该真正阅读一些有关单元测试的介绍(例如this。但是给您一些提示并回答您的一些问题。

选择测试框架:
您可以选择自己喜欢的任何一种,但是如果您不知道该选择哪一种,我建议您尝试GoogleTest,它非常流行并且记录很好。

  

我是否为代码的每个功能和所有分支编写测试,或者只是为我认为很棘手的分支编写测试?

您应该为每个函数和代码的每个分支编写测试。