Welcome

首页 / 软件开发 / 数据结构与算法 / 提前认识软件开发(19) C语言中的协议及单元测试示例

提前认识软件开发(19) C语言中的协议及单元测试示例2015-01-24在实际的软件开发项目中,经常要实现多个模块之间的通信,这就需要大家约定好相互之间的通信协议,各自按照协议来收发和解析消息。

本文以实际的程序代码为例,详细介绍了如何用C语言来实现通信协议,并基于对协议字段的判断,说明了程序单元测试的过程,为相关的开发工作提供了有益的参考。

一、软件模块之间的协议

什么是软件模块之间的协议?不同的软件模块之间要实现相互通信,就必须遵循共同的消息规范,大家按照约定好的规范来收发消息。软件模块之间的协议就是不同模块间消息交互的规范。

在通信协议中,一条完整的消息由消息头和消息体构成,如图1所示。

图1 一条完整的消息示意图

在C语言中,用结构体来表示协议。在进行消息解析的时候,一般只关注消息体的内容。消息头只是用于标识一条消息,让其它模块能够识别该类消息。

二、单元测试

在提交程序版本之前,开发人员需要对代码进行单元测试和集成测试。那么什么是单元测试呢?单元测试就是对程序中的一个函数进行测试,看对于某个输入,是否有预期的输出。

单元测试的示意图如图2所示。

图2 单元测试的示意图

可以把函数看成一个灰色的盒子,测试的时候只关心输入和输出,要设计多组单元测试数据来对函数的功能进行测试。

此外,在测试中,还有一个叫做“测试用例”的概念。测试用例就是一次测试的整个过程,包括:测试目的、预置条件、测试步骤、预期结果、通过准则、测试工具等。

三、本程序中的协议

本程序中的协议包括了消息头和消息体,其中,消息头有四个字段,消息体有五个字段。如下代码所示。

// 消息头结构typedef struct{UINT16iReserve1;UINT16iReserve2;UINT16iReserve3;UINT16iReserve4;}MsgHead_T; // 消息结构体(包含消息头和消息体)typedef struct{MsgHead_TMsgHead; // 消息头UINT32 iOperType; // 操作类型UINT8szUserNumber[30];// 用户号码UINT8szOperTime[20];// 操作时间, 格式为: yyyymmddUINT32 iReserve1;// 保留字段1UINT8szReserve2[50]; // 保留字段2}UserReqMsg_T;
在消息体的五个字段中,操作类型、用户号码和操作时间是本次要进行判断处理的字段,另外两个字段是保留字段,可以先不用赋具体的值。

在协议中,为什么要留有保留字段呢?这是方便以后对协议进行扩展。也就是说,如果以后除了操作类型、用户号码和操作时间之外,还需要增加新的字段定义,可以直接利用扩展字段。这在实际的软件开发项目中是很重要的。