就在几天前,我开始研究一个名为check的单元测试框架,我打算在Linux下运行c代码测试.
现在检查一些设计良好的代码和一些测试代码可以帮助我验证基本功能是否正确,我的意思是很容易看到变量和响应然后决定一个函数是否正确.
但是,假设我想测试一个动态内存结构,其中包含很多关于malloc和free的内容结构,事实证明我可以将数据放入并再次获取正确的数据.但这并不能证明我在这个过程中没有打破一些记忆,让我说我忘了释放一半的记忆并丢失指针(一个经典的memleak).该代码可能会通过大部分单元测试.
所以现在问题是:用Valgrind运行整个单元测试代码并让他检测出任何malloc/free问题是一个好主意吗?(或者可能像电围栏一样编译?)
感觉这是一个好主意,但我不确定我是怎么进入这里的......
谢谢约翰
更新:感谢道格拉斯和乔纳森,看起来这是一个好主意,我应该继续:-)
更新: Valgrind是一个有趣的工具,但我发现这样做的第一个memleaks是在测试框架而不是我自己的代码(虽然非常有趣).因此,在将自己的代码颠倒之前,向其余部分提示将验证您使用的单元测试框架是否没有泄漏.在我的案例中只需要一个空的测试用例,因为那时只有单元测试框架正在运行.
在StackOverflow上阅读了相当多的一些主题之后,我得出结论,我应该采用某种形式的测试驱动开发/单元测试(或至少探索该领域).
而且,由于我们是在谈论Linux下的C代码,我决定放弃检查尝试(我不知道这是否是正确的选择,但如果它没有好我可以尝试别的以后的东西).
但是由于单元测试和单元测试框架的这个概念对我来说是全新的,我开始对一个非常小的测试代码进行一些单元测试(但我完全迷失了,感觉就像我错过了一些东西).
这是我到目前为止所做的,我创建了以下文件:
(所以"普通程序"是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?
这基本上与检查手册第3.1章中的相同,但仍然没有....
有人可以请我朝正确的方向努力吗?
谢谢约翰
更新:没有理由我尝试使用支票我只是觉得我应该从某个地方开始,也许CUnit是一个更好的选择(我想我也会尝试这个,然后做出有根据的选择).
更新:感谢@philippe间接指出在线文档只是事实的一半,澄清文档所述内容的示例代码已经与check包一起安装.在Ubuntu案例中/ usr/share/doc/check/example/tests /
更新:代码示例已创建,以便您通过查看他的第一个版本,然后是第二个版本等开始.这样您就可以了解他如何创建一个非常基本的测试用例/代码,从无到有用的东西传统的TTD方式.
而且由于我的代码被破坏了,我希望单元测试证明这一点,我作了一点欺骗并测试了真正的功能.像这样的东西:
START_TEST (test_my_pow1)
{
int resultat = my_pow(3,3);
int math = pow(3,3);
fail_unless ( resultat == math,
"Error on 3^3 != …
Run Code Online (Sandbox Code Playgroud) 我正在尝试按照这里的官方教程,但它需要有autotools的工作知识,我没有.我希望只是写几个快速测试,我发现本教程势不可挡.我认为它依赖于autoconf,automake和一些Check宏中的很多魔法,并且它没有解释Check实际上如何工作以便我可以手动构建测试.
任何人都可以推荐一个不需要autotools的简单教程吗?
我正在尝试使用名为Check的 C单元测试框架.
我按照包装中INSTALL文件的说明安装了包:
在这之后我没能运行自己的测试,所以最后我决定使用包中的示例/usr/local/share/doc/check/example
.
做了以下命令:
$ autoreconf --install
$ ./configure
$ make
$ make check
Run Code Online (Sandbox Code Playgroud)
还是同样的问题:
/usr/local/share/doc/check/example/tests/.libs/lt-check_money: error while loading shared libraries: libcheck.so.0: cannot open shared object file: No such file or directory
FAIL: check_money
Run Code Online (Sandbox Code Playgroud)
试图将目录添加到LDFLAGS
make文件但是没有帮助,也尝试做Rick Hightower在这里做的事情
(...删除*.so文件(及其链接))我不知道如何删除链接
我正在尝试将检查 单元测试框架用于我的C应用程序.但由于两点,我无法使用调试器(gdb):
首先,检查使用一些复杂的宏(START_TEST
和END_TEST
),并且调试器在这两个宏之间的代码中放置一个断点很麻烦(事实上,我可以放一个软件断点,但gdb从未见过它)
第二,通过重新定义中断行为来检查定义某种异常.因此,当我尝试放置硬件断点时,测试失败并退出,因为检查将硬件断点视为我的测试失败.
有没有人已经遇到这个问题并有解决方案?
我开始使用check框架来测试C应用程序.为了更好地理解,我在check包中查看了示例.它工作正常,但我不需要automake工具 - 我想用我自己的Makefile编译它(因为我想要正确理解检查,我需要将我的最终应用程序用作操作系统的包).也许我可以在那里使用自动生成的Makefile,但是现在,它将是我必须学习的下一个新事物,并且我已经限制了准备单元测试的时间.(然后,当然,我想研究和理解生成Makfile的工具,使用configure等)
使用我的Makefile构建应用程序时出现问题,我没有链接该对象以进行检查功能:
/tmp/ccm7cniy.o: In function `test_money_create':
check_money.c:(.text+0x1e): undefined reference to `tcase_fn_start'
check_money.c:(.text+0x79): undefined reference to `_fail_unless'
check_money.c:(.text+0xcc): undefined reference to `_fail_unless'
Run Code Online (Sandbox Code Playgroud)
我发现,在示例应用程序中是带有obj的gcc.文件check_money-check_money.o
,由gcc创建:
gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -MT check_money-check_money.o -MD -MP -MF .deps/check_money-check_money.Tpo -c -o check_money-check_money.o `test -f'check_money.c' || echo './'`check_money.c
Run Code Online (Sandbox Code Playgroud)
这是我的问题:它使用依赖check_money-check_money.Tpo
.该文件是由命令生成的./configure
,我没有使用.
如何创建自己的.o
文件以便检查以成功构建?有必要为每个应用程序创建此文件吗?在共享库的某个地方不可能是一个?
(我很抱歉,如果我的问题是"愚蠢的",我在Linux中构建应用程序的经验很少)
我正在构建支票框架示例“check_money”,但它不是在我的机器上构建的。错误是:
configure: error: cannot find install-sh, install.sh, or shtool in "." "./.." "./../.."
Run Code Online (Sandbox Code Playgroud)
我尝试使用以下方法安装它:
libtoolize --force
aclocal
autoheader
automake --force-missing --add-missing
autoconf
./configure
Run Code Online (Sandbox Code Playgroud)
它仍然给我同样的错误。
因此,我将同一目录复制到另一个目录并运行:
autoreconf --install
./configure
Run Code Online (Sandbox Code Playgroud)
它仍然给我同样的错误。我不知道还能尝试什么。
我在 Mac OS X Mavericks (10.9) 上