如何开始为传统的嵌入式C应用程序编写单元测试 - 非常紧密耦合的模块?

Int*_*ick 7 c embedded unit-testing

我目前正在开发一个代码库,它从未在其上编写任何单元测试.它是为16位嵌入式处理器编写的,我想开始为我编写的所有代码添加单元测试,至少将其扩展到代码的其他部分.

我的问题是,我发现应用程序级别的每个模块(.c文件)似乎与项目中的其他C文件紧密耦合.对于任何给定的文件,这可能是2-10个文件中的任何位置.

  1. 我该如何开始编写单元测试?
  2. 什么是最好/快速/最有效的方法来消除这种紧耦合?
  3. 单元测试也将在PC上运行(32位),嵌入式代码用于16位处理器.在将代码移植到PC时,如何确保这一点得到妥善处理?

ASh*_*lly 4

关于 #3 - 确保它可以移植到 PC,这是我使用的策略:

首先,检查嵌入代码并将任何“int”或“unsigned long”更改为“int16”或“uint32”(或您选择的任何约定)。

将部分包含在嵌入标头中,您可以在其中定义条件内的类型:

#ifndef CORE_TYPE_DEFINITIONS
#define CORE_TYPE_DEFINITIONS
typedef long int16;
/*...*/
#endif
Run Code Online (Sandbox Code Playgroud)

创建一个“PC_Types.h”文件,为 PC 定义相同的类型。

#ifdef CORE_TYPE_DEFINITIONS
#error "Core Types already defined"
#else
#define CORE_TYPE_DEFINITIONS
typedef short int16;
/*...*/
#endif
Run Code Online (Sandbox Code Playgroud)

在PC项目中,为每个嵌入的c文件创建一个包装器,其中包含以下内容:

#include "PC_Types.h"
#include "ModuleX.c"  //the file under test

#include "TestHarness.h"   //verification functions

int TestModuleXUnit1(void)
{
   /* setup */
   /* call Unit1(); */
   /* verify post-conditions */
   return result;
}
Run Code Online (Sandbox Code Playgroud)

通过包装每个文件,您可以根据需要使用所有耦合函数。#include 包装文件中的原始源文件允许您直接从源代码控制系统添加对嵌入式代码的更新,无需任何修改。在包含的源代码之后添加测试函数可以让测试代码完全访问模块的所有函数,即使它们没有公共标头。