c - 基本单元测试和 C,我如何开始?

标签 c linux unit-testing tdd check-framework

在 StackOverflow 上阅读了相当多的主题后, 我得出的结论是我应该采用某种形式 测试驱动开发/单元测试(或至少探索该领域)。

既然我们在谈论 Linux 下的 c 代码, 我决定给check试一试 (我不知道这是否是正确的选择,但如果它不好,我以后总是可以尝试其他选择)。

但是由于单元测试和单元测试框架的概念对我来说是全新的, 我开始对一个非常小的测试代码进行一些单元测试(但无论如何我都完全迷失了,感觉好像遗漏了什么)。

这是我到目前为止所做的,我创建了以下文件:

  • main.c,一个只调用名为 my_pow 的函数并打印结果的 main。
  • my_pow.c,包含函数 my_pow。
  • my_pow.h
  • my_pow_test.c,我想我应该在这里放置 my_pow 函数的单元代码。

(所以“正常程序”是 main.c、my_pow.c 和 my_pow.h。)

这是 my_pow.c


#include "my_pow.h"
int my_pow(int a, int b)
{
    return (a*b);
}

然后我想在 my_pow_test.c 中我放了这样的东西:


#include <check.h>
#include "my_pow.h"

START_TEST (test_my_pow)
{
    /* unit test code */
}
END_TEST

//do I need some sort off main here that calls test_my_pow?

这与the check manual中的基本相同第 3.1 章, 但仍然没有......

有人可以把我推向正确的方向吗?

谢谢 约翰


更新:我没有理由尝试使用检查,我只是觉得我应该从某个地方开始, 也许 CUnit 是更好的选择(我想我也会尝试一下,然后做出明智的选择)。

更新:感谢@philippe 间接指出在线文档只说对了一半, 阐明文档内容的示例代码已经与检查包一起安装。 在 Ubuntu 案例中/usr/share/doc/check/example/tests/

更新:创建代码示例是为了让您从查看他的第一个版本开始, 然后是第二个等等。 这样您就可以了解他如何创建一个非常基本的测试用例/代码,从无到有,直到在传统的 TTD 方式中有用。

因为我的代码被破坏了,我希望单元测试能够证明这一点, 我作弊并针对真实的 pow 函数进行了测试。 像这样:


START_TEST (test_my_pow1)
{
    int resultat = my_pow(3,3);
    int math     = pow(3,3);
    fail_unless ( resultat == math,
           "Error on 3^3 != %d (%d)",math, resultat);
}

但是以后我不会重现标准库中已有的内容:-)


相关:

取自搜索[c] [unit-testing] .

最佳答案

您创建了第一个测试用例。现在你需要 create a test suite (一组测试用例)和一个 runner .

我建议你尝试编译 their example首先要验证您的环境,尽管他们的文档通过差异(源补丁)引入了新代码,我觉得这不是很方便。


如果您决定尝试使用另一个框架(我立即想到了 minunit),我可以为您指出“tutorial”。

关于c - 基本单元测试和 C,我如何开始?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/453141/

相关文章:

c - 在终端应用程序中使用按键导航

linux - 在 bash Shell 中查找和替换

linux - 增加 block 大小时内部碎片会增加吗?

java - 错误 : "javax.servlet.ServletException: Failed to load test suite [SampleTest], Reason is [Class not found "SampleTest"] "

c - 如何让控制台循环直到在 C 中输入正确的输入?

c - 使用 fork 系统调用

c++ - const 使用的内存通常比#define 多还是少?

c - 在 iMac 上做 C 教程,遇到一个挑战

c# - 我如何单元测试 URL 在 c# 中是否有效?

c# - 模拟 HttpResponse WriteAsync