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

时间:2010-06-28 07:06:00

标签: c unit-testing embedded

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

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

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

2 个答案:

答案 0 :(得分:4)

答案 1 :(得分:4)

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

首先,浏览嵌入式代码并将任何'int'或'unsigned long'更改为'int16' 或'uint32'(或您选择的任何惯例)。

将嵌入标题中的部分包裹在条件中定义类型:

#ifndef CORE_TYPE_DEFINITIONS
#define CORE_TYPE_DEFINITIONS
typedef long int16;
/*...*/
#endif

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

#ifdef CORE_TYPE_DEFINITIONS
#error "Core Types already defined"
#else
#define CORE_TYPE_DEFINITIONS
typedef short int16;
/*...*/
#endif

在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;
}

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