我正在 Ceedling 中使用断言语句为以下函数编写测试用例:
fsp_err_t ad7606c_init(const bsp_io_port_pin_t cs, const spi_instance_t* spi)
{
fsp_err_t result = FSP_SUCCESS;
uint8_t rx[20] = {0};
/* write config reg use 1 d out line */
volatile ad7606c_config_reg_t config = {.DOUT_FORMAT = 0};
write_reg(cs, spi, AD7606C_REG_CONFIG, config.REG);
/* read config reg */
read_reg(cs, spi, AD7606C_REG_CONFIG, 1, rx);
/* read id reg */
read_reg(cs, spi, AD7606C_REG_ID, 1, rx);
/* id must be 0x32 */
assert(rx[1] == ID);
/* write range reg */
volatile ad7606c_range_reg_t range = {.CH1_RANGE = AD7606C_RANGE_12500M_TO_12500P_DIFF, .CH2_RANGE = AD7606C_RANGE_12500M_TO_12500P_DIFF};
write_reg(cs, spi, AD7606C_REG_RANGE_CH1_CH2, range.REG);
write_reg(cs, spi, AD7606C_REG_RANGE_CH3_CH4, range.REG);
write_reg(cs, spi, AD7606C_REG_RANGE_CH5_CH6, range.REG);
write_reg(cs, spi, AD7606C_REG_RANGE_CH7_CH8, range.REG);
#ifdef INTERFACE_CHECK
write_reg(cs, spi, AD7606C_REG_DIGITAL_DIAG_ENA, 0x81);
#endif
return result;
}
我按照中提到的步骤进行操作 https://www.electronvector.com/blog/unit-testing-with-asserts
仍然出现以下错误:
错误:测试可执行文件“test_ad7606c.out”失败。
在 $stdout 中没有产生最终测试结果计数: 断言失败:rx[1] == ID,文件 src/ad7606c/ad7606c.c,第 59 行
62:test_ad7606c_init_normal_初始化:通过
并退出,状态为:[0](失败测试的计数)。 这通常是源代码或测试代码中内存访问错误的症状。
我创建了一个帮助文件,如下所示:
#ifndef ASSERT_UNIT_TEST_SUPPORT_H_
#define ASSERT_UNIT_TEST_SUPPORT_H_
#include "CException.h"
#define TEST_ASSERT_FAIL_ASSERT(_code_under_test) \
{ \
CEXCEPTION_T e; \
Try { \
_code_under_test; \
TEST_FAIL_MESSAGE("Code under test did not assert"); \
} Catch(e) {} \
}
#define TEST_ASSERT_PASS_ASSERT(_code_under_test) \
{ \
CEXCEPTION_T e; \
Try { \
_code_under_test; \
} Catch(e) { \
TEST_FAIL_MESSAGE("Code under test failed an assertion"); \
} \
}
#endif
测试文件如下:
#include "unity.h"
#include "r_spi_api.h"
#include "bsp_io.h"
#include "ad7606c.h"
#include "Helper.h"
#include "mock_regread.h"
// Definitions for testing
#define CS_PIN 1 // Chip select pin mock value
#define SPI_INSTANCE NULL // SPI instance mock (assuming a null pointer for simplicity)
void test_ad7606c_init_id_mismatch(void)
{
uint8_t rx[20] = {0};
rx[1] = 0x00; // Incorrect ID value
// Expected sequence
write_reg_Expect(CS_PIN, SPI_INSTANCE, AD7606C_REG_CONFIG, 0);
read_reg_Expect(CS_PIN, SPI_INSTANCE, AD7606C_REG_CONFIG, 1, rx);
read_reg_Expect(CS_PIN, SPI_INSTANCE, AD7606C_REG_ID, 1, rx);
//ad7606c_init(CS_PIN, SPI_INSTANCE);
// Call the function and expect assertion failure
TEST_ASSERT_FAIL_ASSERT(ad7606c_init(CS_PIN, SPI_INSTANCE));
}
仍然出现以下错误
我想隐含的问题是为什么你会收到这个错误,以及该怎么办。 至于为什么……
我按照https://www.electronvector.com/blog/unit-testing-with-asserts
中提到的步骤操作
不,你似乎没有这样做。 代码生成的行为(包括消息传递)表明您正在使用 C 的标准
assert()
宏,而博客文章描述了编写您自己的、拼写不同且行为不同的断言宏。
当标准 C 断言失败时,它会中止程序。 这就是你所观察到的。 它与记录和可选地以编程方式检查程序假定的“不变量”的此类断言的预期用途一致。 你应该能够证明你的 C asserts()
不会失败,所以如果这样的断言确实失败了,那么就意味着程序是错误的。 要么断言本身是错误的,要么程序所依赖的不变量不满足(因此它实际上一定不是不变量),要么
assert()
功能被错误地使用。该博客文章建议编写和使用目标不同的替代断言宏或函数,并检查不正确或意外(但可以想象)的运行时条件。 它建议这样的宏将提供一种在测试场景中配置与实际操作中不同类型的故障响应的方法。 这是完全合理的,但这是另一种意义上的“断言”。 这不是你使用的那种断言。
我创建了一个帮助文件,如下所示:
好的,但这不适合用于测试 C
assert()
离子。再说一遍,如果这些使用得当,那么就不应该导致它们失败,所以它们不适合这种测试。
至于该怎么办:正确使用 C
assert()
assert()
ASSERT()
的宏,但该特定名称没有什么特别之处。 我自己会倾向于选择不同的东西,以避免与标准混淆assert()
。如果您想测试这些运行时验证/一致性检查的失败,那么,正如博客所建议的,提供一种在适合测试的失败行为和适合实际操作的失败行为之间进行选择的方法。