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

基本单元测试和C,如何开始?,c,linux,unit-testing,tdd,check-framework,C,Linux,Unit Testing,Tdd,Check Framework,在StackOverflow上读了很多文章之后, 我得出结论,我应该采取某种形式的行动 测试驱动开发/单元测试(或至少探索该领域) 既然我们讨论的是Linux下的c代码, 我决定试一试 (我不知道这是否是一个正确的选择,但如果这不好,我以后总可以尝试其他东西) 但是由于单元测试和单元测试框架的概念对我来说是全新的, 我开始在一个非常小的测试代码上做一些单元测试(但我还是完全迷路了,感觉好像遗漏了什么) 这就是我迄今为止所做的,我创建了以下文件: main.c是一个main,它只调用一个名为my

在StackOverflow上读了很多文章之后, 我得出结论,我应该采取某种形式的行动 测试驱动开发/单元测试(或至少探索该领域)

既然我们讨论的是Linux下的c代码, 我决定试一试 (我不知道这是否是一个正确的选择,但如果这不好,我以后总可以尝试其他东西)

但是由于单元测试和单元测试框架的概念对我来说是全新的, 我开始在一个非常小的测试代码上做一些单元测试(但我还是完全迷路了,感觉好像遗漏了什么)

这就是我迄今为止所做的,我创建了以下文件:

  • main.c是一个main,它只调用一个名为my_pow的函数并打印结果
  • my_pow.c,包含函数my_pow
  • 我的战俘
  • c,我想我应该把mypow函数的单元代码放在这里
(所以“正常程序”是main.c、my_pow.c和my_pow.h。)

这是我的战俘


#include "my_pow.h"
int my_pow(int a, int b)
{
    return (a*b);
}
然后我想在我的测试中,我放了这样的东西:


#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?
$ runtest === foo Summary === # of expected passes 42 foo-test built Thu Jan 15 20:09:19 PST 2009 foo-test version 0.0.0.1 runtest completed at Sun Jan 18 08:29:13 2009 但是,在将来,我将不会复制stdlibs中已经存在的内容:-)


相关的:


从搜索
[c][unittesting]
中可以看出,我更倾向于使用X-unit系列测试框架的一部分

它可以扩展到大型测试套件,并且已经使用多年,因此是成熟的

你为什么不去呢

干杯


Rob

您创建了第一个测试用例。现在您需要(一组测试用例)和一个

我建议您首先尝试编译以验证您的环境,尽管他们的文档通过diff(源代码补丁)引入了新代码,但我觉得这并不方便


如果您决定尝试使用另一个框架(我马上想到),我可以将您指向一个“”

我已经用了很多年了,我很喜欢它

我开始使用它进行嵌入式开发,因为它很好地支持这样一个概念,即运行测试程序的机器可能与构建测试程序的机器不同。这样做的结果是,在多个平台上测试代码也得到了很好的支持。不知道这是否重要。gcc测试套件使用它。我也将其用于桌面开发

dejagnu的基本理念是

  • 将测试程序复制到“目标”(对于本地测试,目标可以是~/tmp目录)
  • 启动测试程序
  • 将内容打印到控制台(作为测试程序的输入)
  • 解析测试程序的输出并将其与您期望的匹配
  • 决定该输出是否意味着通过或失败
一旦您编写了测试程序和测试脚本,您将执行以下操作:


#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?
$ runtest === foo Summary === # of expected passes 42 foo-test built Thu Jan 15 20:09:19 PST 2009 foo-test version 0.0.0.1 runtest completed at Sun Jan 18 08:29:13 2009 $runtest ==foo摘要=== #预期通过次数42次 foo测试于2009年1月15日星期四20:09:19太平洋标准时间 foo测试版本0.0.0.1 运行测试于2009年1月18日星期日08:29:13完成 我到那里测试名为foo的库的方法是:

  • 假设库的源文件和包含文件位于~/src/foo中
  • 创建一个名为~/src/foo/testsuite的目录
  • 编写一个名为foo test.c的测试程序,该程序有一个
    • 处理命令行参数
    • -打印一个提示,并在一个循环中处理“命令”,在这个循环中,我定义了一个命令来测试库中的每个函数。这有点像命令shell,但特定于库。对于像my_pow这样的东西,我将定义接受2个参数的命令
    • 编写一个dejagnu(它是Expect之上的另一层)(http://expect.nist.gov/,这本身就是Tcl之上的一层(http://www.tcl.tk/)调用my_pow的函数:
      • 有两个论点
      • 计算预期结果(在Tcl中)
      • 将“我的战俘”发送到控制台
      • 解析来自foo测试的my_pow命令的输出
      • 确定实际结果是否与预期结果匹配
      • 调用适当的dejagnu函数(通过或失败)
听起来很难,但事实并非如此。这需要一点时间来决定在foo测试中要做多少工作,而在Tcl中要做多少工作。我最终使用了相当多的shell(例如bash)功能来做一些事情,比如将文件复制到临时目录或查看我的程序生成的日志文件。因此,你最终对所有这些事情都很在行

就参考文献而言,有一本关于Expect的书,我认为这是深入研究的必要条件:。
在这一点和在线Tcl命令参考和FAQ()之间,您已经差不多做到了

祝你好运


-DB

你知道pow(a,b)!=a*b?;-)@Aif吗,我想他知道。但是要了解并了解单元测试的威力,最好从一个有缺陷的函数开始。上面的链接不再是最新的了……改用这些:,