问题标签 [cpputest]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1806 浏览

unit-testing - CppUtest:如何从模拟函数返回自定义结构

我开始将 CppUTest 用于一些 C 嵌入式项目。现在我正在处理对系统的模拟调用。在学习了如何传递 C 典型类型之后,例如:

正常工作的示例:

模拟文件部分代码:

与此模拟调用相关的测试文件部分代码:

理解这一点对我来说没有问题。

但是现在我试图将一个结构从测试传递给一个模拟调用,其中包含我希望模拟发送到调用函数(被测生产代码)的所需字段列表。该案例正在使用一些系统调用来测试一个函数。这件事就像:

正在测试的一段代码:

现在的想法是 -在我使用模拟的测试文件中- :

我的问题是,我如何构建这个 mock.expectOneCall("HAL_AS393x_GetStatus") 的 mock.actualCall 才能说它必须返回一个定义的类型结构(HAL_AS393X_Status)?如果可能或如果存在,我正在搜索信息以执行此类操作:

什么模拟语法必须在 XXX 地方?

0 投票
1 回答
482 浏览

testing - Cpputest:如何编译和使用expectNoCall?

我已经写了语法:mock().expectNoCall("productionCode")正如 Cpputest.org 页面所说。但是编译器说mocksupport 类不支持这种类型的顺序。

如何使用?我必须在标题中包含一些文件吗?目前我有那些用于嘲笑:

问题是我想忽略一个具体的系统调用。我不想测试它。

0 投票
1 回答
746 浏览

testing - CPPUTEST:如何仅忽略在其他呼叫之间放置的一个模拟呼叫

我想忽略在同一案例测试下我想拨打的其他电话之间的一个电话。如果我使用 ignoreothercalls,我不清楚是否会在此之后调用其余的调用。我需要其余的,在被忽略的呼叫之后,将被呼叫。或者至少,在测试用例结束之前找到停止 ignoreothercalls 效果的方法。

我想在没有经过测试的情况下离开这个调用,并将它从测试用例中删除,而不需要 gettig 期望它的调用错误:mock()。xxxCall ("HAL_AS393x_ReadRegisters"); //-其中xxxCall = 用于此的未知关键字-

0 投票
1 回答
281 浏览

c++ - 特征与 CPPUTest?

尝试使用 CPPUTest 测试我的库时遇到问题。

一切都很好,直到我包含 Eigen 库来处理矩阵处理。当我尝试使用 g++ 构建时,Eigen 库不断抛出错误:

  • /eigen3/Eigen/src/Core/util/Memory.h:270:41 错误:“ptr”没有命名类型

  • /eigen3/Eigen/src/Core/CoreEvaluators.h:1655:12 错误:“static_cast”之前的预期类型说明符

  • /eigen3/Eigen/src/Core/PlainOBjectBase.h:137:5 错误:将'operator new'声明为非函数

如果 Eigen 或 CPPUTest 单独运行,则不会输出错误。

我的猜测是这两个库在某些时候有冲突。

这里真的需要一些帮助。非常感谢。

编辑 1: 这是我的 Makefile:

CXX = g++ -std=c++0x -lstdc++ CXXFLAGS = -g -Wall -static -fprofile-arcs -ftest-coverage -I./ -I$(CPPUTEST_HOME)/包括 LDFLAGS = -L./ -L$( CPPUTEST_HOME)/lib -lCppUTest -lCppUTestExt -pthread CPPUTEST_HOME = ./cpputest/workspace/install USER_CFLAGS = -I /usr/local/include/eigen3 TARGET = MyLibrary SRCS = MyLibrary.cpp MyLibraryTest.cpp OBJS = $(SRCS:.cpp =.o) 所有: $(TARGET) $(TARGET): $(OBJS) $(CXX) -o $@ $^ $(CXXFLAGS) $(LDFLAGS) $(OBJS): $(SRCS) $(CXX) -c $(CXXFLAGS) $^ %.o: %.cpp $(CXX) -c $(CXXFLAGS) $<
.PHONY: clean clean: rm -f $(TARGET) $(OBJS) *.gcno *.gcov ~ 找到。-名称“ .gcda”| xargs -rr

0 投票
1 回答
282 浏览

c++ - 使用 cpputest lib 编译测试组项目时无法识别 Mock().enable 和 disable

我正在尝试编译我的测试组项目,但由于下一个我在输出中无法理解的编译错误,我没有成功:

控制台输出:

部分项目代码:

测试组代码 .c 文件。

包含在 mock.c 文件中:

cpputest 似乎没有考虑启用/禁用,也不知道启用/禁用。我认为这可能是我错过的一件愚蠢的事情。但现在我看不出是什么。

我知道我正在 Cpp 测试文件中测试 C 源代码函数。因此,我使用的是 extern c 实例。我很惊讶,因为 dis/en 未被识别,但 Mock().expectonecall 被识别(没有编译错误)。

  • 因此,在当前情况下是否有另一种方法来启用/禁用模拟?
  • 是否可以在包含 cputest 相关依赖项等的方式中看到一些错误?如果可能的话如何修复它们?
0 投票
1 回答
929 浏览

c - 如何使用模拟计时器功能在 C 中对状态机进行单元测试?

我有一个实现状态机的函数,test_hw(),即。第一个状态是空闲的,它内部没有调用任何模拟函数。但是这台机器还有6个状态。这个想法是机器依次从第一个状态到最后一个状态,当特定条件,计时器结果条件发生时。在测试中,我只有一个返回时间值的模拟函数。但是这个函数必须作为条件的一部分在每个状态被调用以返回下一个状态值。它也将在某些状态实现中被调用。

首先,我尝试将每个状态作为测试用例进行测试。运行它后,测试发现太多失败。我开始认为测试状态机将是一个特殊的测试用例。我正在关注一本 TDD 书,但它没有谈论测试机器状态。

我尝试的第二件事是将所有 test_hw 机器作为唯一的测试用例进行测试。但是它再次失败了,因为测试从源代码中拦截了超过 6 个调用,而测试只有 6 个(测试代码中每个状态对这个模拟函数的一个调用)。我不明白为什么源代码(生产代码)每个状态都调用它不止一次。但这就是发生的事情。我想这不是对状态机进行单元测试的正确策略。

我将与您分享一个基于我的简化状态机:

测试代码:

Mock.c 文件中的模拟计时器函数实现:

正如我之前所说,由于“产生了第二个未预期的模拟呼叫”,此测试失败。

什么是正确的策略?--> 如果没有每个状态的测试用例,也没有只有一个测试实体,是哪一个?因此,对于上面显示的状态机的测试代码的实现方式有什么建议吗?

有人可以改进这个测试代码吗?

0 投票
1 回答
168 浏览

c - 从单元测试文件中伪造“正在测试的源文件”中的值

假设我有包含内容的 ac 源文件(正在测试的源文件):

I2CRead() 函数构造如下:

现在我正在尝试编写一个单元测试(使用 cpputest 框架),我想“伪造”函数 I2CRead()读回的值,以便满足 if() 中的所有相等表达式。

单元测试文件与“被测源文件”隔离,但我可以通过特殊方式访问被测源文件中的以下函数:I2C_Hw_Instance()

使用此功能,我可以通过以下方式“伪造”单元测试文件中的寄存器值:

因为我连续调用了 3 个I2CRead()函数,所以我需要通过每个I2CRead()单独调用来伪造 DTR 和 DRR 。因此,这意味着单元测试文件需要知道何时调用下一个I2CRead()函数才能操作 DTR 和 DRR 中的值。

一般如何做到这一点,有什么想法吗?

我的想法是拥有一种与单元测试一起构建的假文件(只是“概念”):

假文件.c

0 投票
1 回答
192 浏览

unit-testing - 如何使用 cputest 在单元测试中注入依赖

我正在编写一个单元测试(在cpputest中),我尝试对函数调用执行“依赖注入”。这意味着当单元测试必须调用放置在被测文件中的真实函数时,函数调用应该重定向到“假”实现。实际上我将函数指针分配给真正的函数并用“假实现”覆盖它。它的构造如下:

我收到编译器错误:

我已经尝试了一些组合,但每次都出现相同的错误。解决方案可能很简单,但我忽略了它。那么,我在这里做错了什么?

0 投票
2 回答
401 浏览

c - 在单元测试环境中模拟/伪造静态函数

我正在使用cpputes t 执行 c 代码的单元测试。

在我的测试源代码中,我有一个静态函数,当从单元测试环境调用时,我希望将其“重定向”到该函数的“伪造”版本。

比方说,我有这样的东西:

正在测试的源代码:

借此;

单元测试环境:

在单元测试环境中调用my_main()时,我想重定向调用

读取(int8 地址) 到:

这里的正确方法是什么?我已经尝试使用函数指针而不是注入依赖项,但它不起作用。任何想法?

0 投票
2 回答
235 浏览

unit-testing - 单元测试 - 如果在生产代码中仅调用一次函数,则在两个测试用例中调用该函数

也许有人有使用cpputest进行单元测试的经验。

我有这样的事情:

被测源代码:

单元测试环境:

}

我需要在 TEST_CASE2 中再次调用函数my_local_function() 。该函数通过公共接口main_function()间接调用,该接口可在单元测试中直接调用。有没有人知道如何在一般情况下或在cpputest环境中执行此操作?