如何在CUnit中为打印到stdout的函数编写测试,以验证其输出?
要测试的示例函数:
void print()
{
printf("Hello world");
}
Run Code Online (Sandbox Code Playgroud)
它的单元测试应该以某种方式验证"Hello world"是否已打印到控制台:
void test_print()
{
// how to assert?
}
Run Code Online (Sandbox Code Playgroud)
我该怎么办呢?
我即将对现有的Apache C模块进行一些更改,以修复一些可能的安全漏洞和一般的不良做法.但是,代码的功能必须保持不变(除非修复错误).标准回归测试的东西似乎是有序的.我想知道是否有人知道在代码中运行一些回归单元测试的好方法.我正在考虑使用C-Unit,但是对于Apache APR和状态结构的所有关系,我想知道是否有一种很好的方法来测试它.是否有任何预先构建的框架可以与C-unit一起使用?
谢谢
彼得
我正在寻找CUnit的在线教程.经过多次"谷歌搜索"后,我遇到的唯一一个是关于sourceforge的CUnit文档和这个.其中没有一个可以真正被描述为带有"走路"工作示例的教程.
有没有人知道CUnit教程实际上是通过测试示例程序?
试图在NetBeans上测试我的C项目,测试永远不会结束,而输出是:
Test: testFileOne ...passed Test: testFileTwo ...passed
Run Summary: Type Total Ran Passed Failed Inactive
suites 1 1 n/a 0 0
tests 2 2 2 0 0
asserts 8 8 8 0 n/a
Elapsed time = 0.000 seconds
Run Code Online (Sandbox Code Playgroud)
即使它看起来完整,进度条仍然闪耀着0.0%的值.
测试用例都是这样的:
void testMethod() {
CU_ASSERT(1 == 1);
//other lines of code..
CU_ASSERT(0 == 0);
}
Run Code Online (Sandbox Code Playgroud)
每个函数有多个CU_ASSERT.NetBeans自动生成的测试代码的一些行为.
命令
make test
Run Code Online (Sandbox Code Playgroud)
从命令行工作就像一个魅力,结束没有问题.
以前有人遇到过这个问题吗?没有捆绑我的笔记本电脑的任何方式来解决它?提前感谢您的每一条评论.
我有一个关于如何在单元测试中“驱动”基于 flex bison 的解析器扫描仪的问题。
最终的解决方案将是一个可用的命令解析器或 telnet 到目标板。我有一个使用 stdin 的完全工作的 flex bison 实现。
现在我的重点是为命令解析器运行单元测试。
我希望能够为解析器(一个命令)提供一个“const 字符串”,然后测试在应用程序中(在应用程序存根中)调用了相应的命令。
我不知道如何为此设置 flex 和 bison。请在下面找到测试用例:
status_cmd_test.c:
#include "CUnit/Basic.h"
#include "cmd_stub.h"
void scan_string(const char* str);
void testSTATUS_OK(void)
{
scan_string("status\n\0\0");
CU_ASSERT(1 == status_sub_nrof_invokes())
}
Run Code Online (Sandbox Code Playgroud)
摘自 cmd_lexer.l:
void scan_string(const char* str)
{
YY_BUFFER_STATE buf;
buf = yy_scan_string(str);
yylex();
yy_delete_buffer(buf);
}
Run Code Online (Sandbox Code Playgroud)
cmd_parser.y 不包含任何 c 代码,只有野牛语法。
摘自 cmd_test.c(有 cunit 代码所在的 int main())
if (NULL == CU_add_test(suite_p, "test of status", testSTATUS_OK))
{
CU_cleanup_registry();
return CU_get_error();
}
/* Run all tests using the …Run Code Online (Sandbox Code Playgroud) 我正在使用CUnit进行项目单元测试.我需要测试我是否使用正确的参数调用libc函数以及我是否以正确的方式处理它们的返回值.例如:如果我调用bind(...)函数 - 我想检查哪个af param我传递并断言如果这是错误的,并且我想模拟它的返回值并断言如果我检查它正确的方式.
出于这些目的,我希望CUnit环境有一个内置机制让我在测试时调用'mocked'bind()函数,并在运行代码时调用真正的bind()函数 - 但我找不到类似的东西这个.
如果我在CUnit中遗漏了某些东西,或者可能建议一种方法来实现这一点,你能告诉我吗?
谢谢,乔.
我想在Lua调用的C函数中弹出/清理Lua调用堆栈.这可能吗?
背景:
我希望我的C库及其扩展脚本使用相同的测试框架.(我知道Lua存在各种单元测试工具.我不在乎;我想要一个报告)我将CUnit包装在一层薄薄的Lua中.CUnit提供了致命和非致命测试断言的选择.致命的断言导致立即longjmp退出测试并重新进入框架运行器.如果我没有先清理堆栈,这似乎会对Lua VM做坏事.
堆栈可能看起来像:
#0. C: assert_wrapper_fcn(test, fatal)
#1. Lua: assert_fcn(bool)
#2. Lua: test_fcn()
#3. C: runner(&test_fcn)
Run Code Online (Sandbox Code Playgroud)
我想清理#0和#3之间的所有内容.我知道的方法签名test_fcn()和assert_fcn(bool),但仅此而已.
我刚用MacPorts/DarwinPorts在Snow Leopard上安装了CUnit.安装很顺利,但是,在尝试运行单元测试时遇到错误:
dyld: Symbol not found: _acs_map
Referenced from: /opt/local/lib/libcunit.1.dylib
Expected in: flat namespace
in /opt/local/lib/libcunit.1.dylib
Trace/BPT trap
Run Code Online (Sandbox Code Playgroud)
有没有人遇到过这个问题,或者有没有人成功让CUnit以其他方式使用Snow Leopard?
我刚刚换用 M1 MacBook Air,但在使用 Homebrew 时遇到了问题。我认为安装很顺利,然后我使用给定的命令将其添加到我的路径中:
Run these two commands in your terminal to add Homebrew to your PATH:
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/xxx/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"
Run Code Online (Sandbox Code Playgroud)
我也brew install cunit这样做了,然后当我输入brew listCUnit 时,它就列在那里,所以我假设 cunit 的brew 安装工作正常。
但是当我运行我的 C 测试代码时,我得到的是:
test/test.c:3:10: fatal error: 'CUnit/Basic.h' file not found
#include <CUnit/Basic.h>
^~~~~~~~~~~~~~~
1 error generated.
make: *** [test_compile] Error 1
Run Code Online (Sandbox Code Playgroud)
我已经解决这个问题三天了,打电话给苹果支持,搜索了与此相关的每个页面,但仍然找不到有效的解决方案。
有人遇到过同样的问题吗?请帮忙
cunit ×9
c ×7
testing ×2
unit-testing ×2
apache ×1
avr-gcc ×1
bison ×1
c++ ×1
cppunit ×1
flex-lexer ×1
homebrew ×1
installation ×1
lua ×1
macports ×1
netbeans ×1