问题标签 [unity-test-framework]

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 投票
2 回答
4985 浏览

c - 如何为 IAR Embedded Workbench 项目配置 Ceedling?

我正在尝试为嵌入式应用程序开发一项新功能,并且我想使用测试驱动的方法来做到这一点。

该项目是用纯 C 编写的,正在使用 IAR Embedded Workbench 6.60.1.5104 进行开发。我的目标是 LPC1788,它是一个 Cortex-M3 设备,所有开发都是在 64 位 Windows 7 机器上完成的。现在我更倾向于让单元测试在 PC 上而不是在目标硬件上运行(RAM 非常有限)。

我遇到了一本有用的书,名为Test Driven Development for Embedded C,它向我介绍了 Unity、CppUTest、Ceedling 等工具。在研究了这些东西之后,我认为我最好的选择是配置 Ceedling(它使用 Unity ) 对于我的项目。但是,我不确定需要采取哪些步骤来配置 Ceedling 以使用我当前的 IAR 工具链。

我已经安装了 Ceedling 并创建了“blinky”示例项目,我正在尝试使用 IAR 工具链构建和测试它。我已添加iccarm.exe到我的路径并进行blinky/project.yml了如下编辑:

这和默认的唯一区别project.yml是第二:tools部分下的内容。

我的猜测是我正朝着正确的方向前进,但我不确定是否iccarm.exe是用于工具链所有这些部分的正确可执行文件以及我需要传递哪些参数。

如果我可以配置 Ceedling 以使用 IAR 工具链构建和测试闪烁项目,我希望我应该能够为我的实际项目应用相同的配置。如果我现在尝试运行rake,我会得到以下输出:

我认为这是因为测试文件预处理器应该在build/test/preprocess/files目录下复制测试文件,这目前不会发生。

经过一番挖掘后,我发现这个Unity 示例配置文件看起来可能会有所帮助。它面向 IAR EW/Cortex M3 环境,就像我正在使用的那样。这可能会表明我需要在我的 Ceedling 中指定哪些配置选项project.yml

如果我可以让 Ceedlingblinky使用 IAR 工具链构建和测试项目,我希望我可以调整它以适应我的实际项目。任何帮助,将不胜感激。

0 投票
1 回答
3774 浏览

c - 如何手动指定 Ceedling 无法获取的源文件?

我正在为嵌入式应用程序开发一项功能,并且正在使用 Ceedling(它构建在 Unity 测试框架之上)对其进行测试。我遇到的一个问题是我需要在 C 源文件中使用 Ceedling 没有与我的单元测试文件编译/链接的功能。

根据 Ceedling 文档:

Ceedling 通过每个测试文件中包含的#include 列表知道要编译和链接到每个单独的测试可执行文件的文件。配置的搜索目录中与包含在测试文件中的头文件相对应的任何 C 源文件都将被编译并链接到生成的测试夹具可执行文件中。

问题是我在单元测试中包含了一个头文件“RTOS.h”来访问 embOS RTOS 函数,但是这些函数是在“RTOSInit.c”和“os7m_tl__dp.a”中定义的,并且根据这个文档 Ceedling 只会#include "RTOS.h"在单元测试代码中看到“RTOS.c” 。

我正在寻找的是一种手动指定在生成测试运行程序可执行文件时应该编译和链接这些附加文件的方法。这似乎是 Ceedling 的一个非常基本的要求,但我从文档中看不到这样做的方法。

我也在Ceedling Github 网站上提出了这个问题。

作为参考,我当前的“project.yml”文件(由 Ceedling 使用)如下所示:

0 投票
1 回答
740 浏览

c - 带有编译器特定关键字的单元测试 C

我正在为一些嵌入式 C 编写单元测试,它们在主机上运行(尚未在目标上测试)并使用 GCC 编译。我一直在使用 Ceedling 构建系统和 Unity 测试框架进行测试。

我想测试的文件之一包括一个文件(比如 ah),其中包含另一个文件(比如 cpu.h),该文件是嵌入式设备供应商的板级支持包的一部分,并使用特定于目标编译器的关键字(例如__cregister,例如在extern __cregister volatile unsigned int IER;

另一个问题,同样是从 BSP 中包含的此类文件,是内联汇编asm()部分,例如#define FOO_ASM asm("FOO").

在构建测试时,这两者都会引发错误,因为 GCC 无法识别这些关键字。

我原以为我可以通过让 Ceedling 生成模拟、添加到我的测试文件来防止添加这些 BSP 标头#include "mock_a.h",但 GCC 仍然编译啊,因此 bh

是否有解决此类问题的最佳实践方法?

我可以在有问题的 BSP 文件中添加类似下面的内容,但我不愿意更改会更改或用新版本版本覆盖我的更改的供应商代码,我宁愿了解如何正确隔离该单元。

0 投票
1 回答
562 浏览

c - 我可以在 Ceedling 中循环运行测试吗?

我对使用 Ceedling/Unity 很陌生。我有一个模块,我通过给它不同的输入测试点并检查输出值来测试它。但我需要多次这样做。这就像我尝试过的(使用'for'循环):

虽然我看到测试通过(预期和实际都在 delta 内),但在整体测试摘要中我看到了这个

这向我表明一个测试函数 = 1 个测试。有趣的是,我可以通过循环打印预期和实际的所有值(因此循环正在完全执行)。那么,有没有办法在循环中进行测试?或者以其他方式迭代它?还是我违反了一些单元测试规则?

谢谢。

0 投票
1 回答
976 浏览

c - 嵌入式系统到 Web 输出的 Unity 测试

我目前正在开发一个能够运行单元测试的嵌入式设备,这要归功于 Unity 框架。我使用 JLINK 和 SEGGER_RTT 将这些测试的输出发送到我的计算机。问题是,我如何从统一输出中制作网络报告?

我发现的最好的方法是将 Unity 内容转换为 JUnit,以便有更多的库可以使用。问题是,我没有找到使用这个 JUnit 的最佳方法。这个想法是几乎不需要安装任何东西,能够在新计算机上运行测试并拥有符合人体工程学/现代 Web UI 来快速处理单元测试。我找到的最好的库是 Allure(https://github.com/allure-framework/allure2),但我想知道它是否是最好的方法(很多东西要安装,在我有任何东西之前要做)。

0 投票
0 回答
95 浏览

c - 由于参数差异,定义宏以更改打印函数错误

我正在尝试将统一测试框架与 NRF51822 板一起使用,但为了查看统一的输出,我需要重新路由它/管道,以便它在我的计算机上可见。我正在使用 SEGGER RTT 在我的项目中打印,理想情况下 id 将其用于 unity.c 输出。

根据统一

默认情况下,Unitystdout在运行时打印其结果。这在您使用本机编译器进行测试的大多数情况下都可以正常工作。只要它们已stdout路由回命令行,它也适用于某些模拟器。但是,有时模拟器将缺乏对转储结果的支持,或者您出于其他原因希望将结果路由到其他地方。在这些情况下,您应该定义UNITY_OUTPUT_CHAR宏。该宏一次接受一个字符(作为,因为这是最常用int的标准 C 函数的参数类型)。putchar你可以用你喜欢的任何函数调用来替换它。

想要的

我试图定义

但是我得到以下信息

我还尝试了在函数中调用 segger 并转换为 char * 的替代方法,如下所示

但不幸的是,当我调用 print_test 时,我没有看到任何输出

我应该如何定义宏以便我可以将输出发送到 segger 或者如果有更合适的替代方案是什么?

0 投票
1 回答
590 浏览

c - 使用统一进行单元测试时模拟 C 函数

我有一个带有 2 个模块的 C 项目 - A 和 B。B 有一个从 A 调用函数的函数。

我使用统一来测试这些模块。

当我测试模块 B 时,我想模拟 A_func 以便它使用我的实现并更改返回值。有没有办法在不改变模块 B 的源代码的情况下做到这一点?

0 投票
0 回答
875 浏览

c - makefile 错误 - Unity 测试框架 - Keil uvision 5 - STM32CubeMx

我一直在尝试将Unity 测试框架集成到 Keil 版本 5 中,自然我遇到了很多问题和错误并且能够解决很多问题,现在我遇到了一个错误,我希望得到您的支持。

一个简短的总结:

这是我的论文项目,它是嵌入式软件测试,实施团队正在使用 Keil uvision 5 以及使用 STM32CubeMx 生成的代码框架和配置,用于在我的大学开发自动驾驶汽车项目。

环境

该方法

我计划通过使用 makefile 来集成 Unity FW,以在 Keil 提供的预构建选项中编译和运行测试。现在我正在尝试使用 Keil 外部的命令行使 makefile 工作,一旦它工作,我相信使用 Keil 预构建选项中的 make 命令运行它会很容易。我按照本教程创建了 makefile http://www.throwtheswitch.org/build/make

我通过添加适当的 armcc 和 armlinker 来编辑 makefile

结构

以下是使用 STM32CubeMx 创建的 TIM10 定时器的 Blinky 项目的示例结构,并将 Unity FW 手动添加到文件夹中

生成文件

电流输出和误差

更新——简单的makefile来测试依赖错误

不幸的是它回来了armcc --no_depend_system_headers test.d test.c Error: C4065E: type of input file 'test.d' unknow

但是当将编译器和标志更改为

它工作并且 test.d 是从 test.c 创建的——所有文件都在同一个文件夹中

更新

在检查文档后,我设法让 armcc 工作,我更新了我的 makefile,如下所示:

将makefile和源文件放在同一个文件夹中,它可以正常工作。

现在,当返回到主 makefile 并将 DEPEND 标志更新为以下

armcc --no_depend_system_headers --ignore_missing_headers --md --depend

它返回了一个不同的错误,这与 armlink 有关,我不知道过程是如何进行的,首先触发的是什么,哪个取决于另一个,但是当我现在运行 make 时,事实仍然存在,它给出了以下错误:

我会继续努力,但如果有人可以帮忙,请做

伟大的更新!

之前的错误消失了,我开始看到实际的进展!我在 LINK 步骤中注释掉了 $(PATHD)Test%.d,因为它在我得到的原始文件中被注释掉了,当我包含它时,错误消失了,我现在面临来自实际文件的语法错误和警告:)请在下面查看并提供建议

更新

我不是这里发生的事情,在 3 4 之后返回之前的错误

更新

好的,如果我删除构建文件夹并运行 make,它会给出 L6218E 错误,如果我再次运行 make 它会给出 L6002U 错误。也有人可以解释为什么在每个 make it run 结束时rm Unity/src/unity.o

0 投票
1 回答
447 浏览

c - 更新 make 文件以链接依赖文件

我正在使用 Unity C 单元测试框架(http://www.throwtheswitch.org/unity)。我正在使用他们提供的示例生成文件(http://www.throwtheswitch.org/build/make)。

我的问题是如何在这个 makefile 中声明依赖项。

例如:我有一个文件 ac,它有头 bh 我有一个文件 bc,它有头 bhbc 实现了函数 foo()。ac 使用函数 foo()。如何使用下面的 makefile 设置这样的链接:

所以,到目前为止,我的项目目录设置为

  • src/node.c
  • src/node.h
  • src/lca.c
  • lca.c 使用 node.h 中定义的函数 newNode(在 node.c 中实现)
  • test/Testlca.c 是 Unity 测试 lca.c 的测试函数

我收到以下错误:

我相信这是由于makefile中的错误,我必须调整makefile。

0 投票
0 回答
198 浏览

c - 使用 Unity 调试 C 单元测试

我正在编写一些关于统一的单元测试(http://www.throwtheswitch.org/unity/),但是我没有得到预期的结果,并且在断言时测试失败。

有没有办法让 printfs 对模拟回调函数进行一些调试?

例如,下面的断言失败了,我需要能够知道我在 _myfunction_test 中得到了什么来理解为什么失败:

任何帮助深表感谢。