3.3 在线调测工程 该产品作为嵌入式终端,需要在Linux系统中编译打包版本,然后将其下载到目标单板上运行。这种交叉编译方式对于单个模块的调试而言,效率无疑比较低下。 为提高调测效率,在Linux服务器搭建在线调测工程。即提取OMCI模块代码,稍作改造后直接在服务器上编译和运行。这样就可避免每次修改代码都要重启单板升级大版本,调测效率极高。 为使模块可独立运行,需要编写模拟接口以屏蔽底层调用,并裁减暂不必要的特性(如线程和通信)等。 3.4 模拟数据库OMCI模块使用某内存数据库来管理需要持久化的实体信息,但该数据库代码内调用了大量平台相关的接口,不利于实现模块的在线调测。因此,作者研读源代码后编写了一个模拟数据库。该库仿照模块使用的几个原库接口及行为,模拟接口内部校验均增加错误信息打印,以便于排障。 此外,在数据库接口原语的基础上二次封装统一接口,一举消除模块内数据库操作代码的凌乱和重复。 3.5 自动化测试没有测试保护网的重构,无异于没有血源的外科手术。 首先,公共接口和函数均提供有相应的测试函数,兼做示例和用例。如: //Start of ByteArray2StrSeqTest//
VOID ByteArray2StrSeqTest(VOID)
{
//ByteArray2StrSeq函数算法不甚优美和严谨,应多加测试验证,如有可能尽量优化。
INT8U ucTestIndex = 1;
INT8U pucByteArray[] = {0xD7, 0x8F, 0xF5, 0x73, 0xB7, 0xF0, 0x00, 0xE8, 0x2C, 0x3B};
CHAR pStrSeq[50] = {0};
//Time Consumed(x86_gcc3.2.3_glibc2.2.5): 72us
memset(pStrSeq, 0, sizeof(pStrSeq));
ByteArray2StrSeq(pucByteArray, 4, 1, pStrSeq);
printf("[%s]<Test Case %u> Result: %s, pStrSeq = %s!\n", __FUNCTION__, ucTestIndex++,
strcmp(pStrSeq, "1-2,4,6-9,13-20,22,24,26-28,31-32") ? "ERROR" : "OK", pStrSeq);
//Time Consumed(x86_gcc3.2.3_glibc2.2.5): 7us
memset(pStrSeq, 0, sizeof(pStrSeq));
ByteArray2StrSeq(pucByteArray, 4, 0, pStrSeq);
printf("[%s]<Test Case %u> Result: %s, pStrSeq = %s!!!\n", __FUNCTION__, ucTestIndex++,
strcmp(pStrSeq, "0-1,3,5-8,12-19,21,23,25-27,30-31") ? "ERROR" : "OK", pStrSeq);
//Time Consumed(x86_gcc3.2.3_glibc2.2.5): 4us
memset(pStrSeq, 0, sizeof(pStrSeq));
ByteArray2StrSeq(&pucByteArray[4], 2, 1, pStrSeq);
printf("[%s]<Test Case %u> Result: %s, pStrSeq = %s!\n", __FUNCTION__, ucTestIndex++,
strcmp(pStrSeq, "1,3-4,6-12") ? "ERROR" : "OK", pStrSeq);
//Time Consumed(x86_gcc3.2.3_glibc2.2.5): 4us
memset(pStrSeq, 0, sizeof(pStrSeq));
ByteArray2StrSeq(&pucByteArray[6], 2, 1, pStrSeq);
printf("[%s]<Test Case %u> Result: %s, pStrSeq = %s!\n", __FUNCTION__, ucTestIndex++,
strcmp(pStrSeq, "9-11,13") ? "ERROR" : "OK", pStrSeq);
//Time Consumed(x86_gcc3.2.3_glibc2.2.5): 5us
memset(pStrSeq, 0, sizeof(pStrSeq));
ByteArray2StrSeq(&pucByteArray[8], 2, 1, pStrSeq);
printf("[%s]<Test Case %u> Result: %s, pStrSeq = %s!\n", __FUNCTION__, ucTestIndex++,
strcmp(pStrSeq, "3,5-6,11-13,15-16") ? "ERROR" : "OK", pStrSeq);
}
//End of ByteArray2StrSeqTest//
此外,模块内还增加自动化测试功能(TestSuite),可用来验证批量或单个实体的配置和查询操作。批量测试结果统计如下(省略各实体的具体测试结果):
在上述测试结果中,Failed TestCase(s)最为关键,表示失败的用例数目。此外,UnCompared TestCase(s)表示未做比较的条目数,如获取时间等易变属性的实体,无法预置恰当的期望结果,因此未做比较。测试过程中的打印信息可保存为日志文件,然后在打印日志中搜索Failure关键字,即可获知哪些配置失败。 当大量修改当前代码时,借助上述自动化测试功能,可迅速获知修改结果的影响。在开发新功能时,可先设计好测试用例和期望结果,然后按照“测试驱动开发”的模式来编码,提高编码效率和正确率。
|