首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用cmocka处理静态元素?

如何使用cmocka处理静态元素?
EN

Stack Overflow用户
提问于 2017-02-09 13:29:52
回答 1查看 1.4K关注 0票数 2

我正在使用cmocka在我的C-项目上做一些单元测试,我想知道如何处理静态执行程序。

静态元素对我来说是:

  1. 声明为静态的函数
  2. 声明为静态函数的函数中的变量

因此,让函数fut作为我们正在测试的函数,而foo是另一个函数。都放在文件bar.c中。

代码语言:javascript
复制
static int fut(int add) {
  static int sum = 0;
  sum += add;
  return sum;
} 

int foo(int someVar){
  //Some calculation on someVar...
  someVar = someVar * 42;

  //call subRoutine
  return fut(someVar);
 }

让foo.h看起来像这样:

代码语言:javascript
复制
extern int foo(int someVar);

所以让我们继续,我会给出问题的。我想通过两个不依赖的测试来测试测试中的函数,这两个测试通过了add的一些随机值。testroutines放在main.c中,如下所示:

代码语言:javascript
复制
void fut_test_1(void **state) {
  int ret;
  ret = fut(15);
  assert_int_equal(ret, 15);
  ret = fut(21);
  assert_int_equal(ret, 36);
}

void fut_test_2(void **state) {
  int ret;
  ret = fut(32);
  assert_int_equal(ret, 32);
  ret = fut(17);
  assert_int_equal(ret, 49);
}

现在我可以尝试用类似于gcc的main.cfoo.c -Icmocka来编译单元测试了。

现在有两个问题:

  1. 声明为静态的函数不能从main.c访问,因此链接器将在构建过程中停止。
  2. 声明为静态的函数中的变量不会在两个测试之间重置。所以fut_test_2会失败。

如何用这些静态元素来处理这些问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-10 09:36:15

基于@LPs的评论和我自己的想法,我想总结一下可能的解决方案:

关于问题的--一个函数声明为静态:

  1. 一种解决方案是将源文件bar.c包含到#include "foo.c"驱动的测试驱动main.c中。
  2. 测试fut_test_2fut_test_2可以放置到bar.c中,后者既包含测试中的fut,又包含测试中的fut和测试。然后,通过将声明添加到foo.h,可以访问这些测试: extern int foo(int someVar);extern void fut_test_1(void **state);extern void fut_test_2(void **state);

关于静态变量问题的

  1. 这是不容易测试的。唯一的可能性是通过一种休闲方式( )来扩大静态变量的可见性。
    • 把它移到fut外面
    • 在全球范围内
    • 使用一些getter和setter方法

  1. 只编写在测试过程中不需要重新设置静态变量的函数。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42138037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档