C++Test在核电数据库软件单元测试中的应用研究

2019-06-01 10:06王飞向嫄
电脑知识与技术 2019年12期

王飞 向嫄

摘要:软件单元测试是软件测试的基础,是保证软件质量的一个重要阶段,同时也是发现软件缺陷的关键步骤,在核电数据库软件的测试以及范围更广泛的验证和确认工作中占有重要地位。本文从单元测试的基本概念入手,介绍了单元测试的方法,然后重点阐述了利用自动化测试工具C++Test对核电数据库软件进行单元测试的过程。

关键词:软件单元测试;C++Test;数据库软件

中图分类号:TP271 文献标识码:A

文章编号:1009-3044(2019)12-0001-03

開放科学(资源服务)标识码(OSID):

The Research Application of C++ Test in Database Software of Nuclear Power Unit Testing

WANG Fei, XIANG Yuan

(China Nuclear Control System Engineering Co LTD, Beijing 100176, China)

Abstract: Software unit testing is the foundation of software testing and an important stage of software quality assurance. It is a key step in finding software defects and plays an important role in the testing of database software of the nuclear power plant and in the wider scope of the verification and validation. At first, this article gives a short introduction of unit testing and introduces the method of unit testing. Then it goes deeper into how to use C++Test to do unit testing in database software of nuclear power plant.

Key words: software unit testing; C++Test; database software

核电数据库软件是核电厂数字化仪控系统的重要组成部分,它相当于一个数据处理中心,起到数据交换区的作用。数据库软件的质量和可靠性是保障核电厂正常运转的关键,而对数据库软件的测试是达到软件质量目标的一个重要手段。在软件工程实践中,测试有助于软件满足核电标准中的质量和可靠性要求。作为软件测试中一个不可或缺的组成部分,单元测试是各层次测试的基础,是软件验证和确认的大框架中的一项重要活动。

本文研究了基于测试工具C++Test的软件单元测试,主要介绍了单元测试的方法,并着重阐述了利用C++Test测试工具对核电数据库软件进行单元测试的方法及流程,并对测试结果进行了分析,给出了测试报告。

1 单元测试

单元测试采用的测试技术分为两种:静态测试和动态测试。动态测试的方法又分为白盒测试和黑盒测试,其中白盒测试为主,黑盒测试为辅。

1.1 静态测试方法

代码的静态测试是单元测试的第一步,目的是尽量通过人工检查来发现代码的错误,以最小成本保证代码中算法的逻辑正确性、清晰性、规范性、一致性、算法高效性。

静态测试的过程:

1) 准备:测试负责人向测试人员分发代码规范、审查标准、软件详细设计说明书和单元测试计划等文档,确定测试的代码版本和测试环境等;

2) 代码审查:依据相应的审查标准,仔细阅读代码,对照相关材料,发现和记录问题;

3) 形成报告:将发现的问题形成(也可由测试工具输出)静态分析报告。

1.2 动态测试方法

动态测试的方法分为白盒测试和黑盒测试。黑盒测试又称为功能测试、数据测试或规格测试。在不需要了解测试对象内部情况下,依据详细设计说明书/需求规格说明书中的功能来设计和执行测试用例。白盒测试又称结构、逻辑测试或程序测试。这种测试需要了解程序的内部情况,并依据内部构造设计和执行测试用例。单元测试时一般采用白盒测试。白盒测试测试方法有逻辑覆盖法和基本路径法。

2 C++Test测试工具

C++Test是一款针对C/C++的单元测试工具,使用C++Test进行单元测试,测试流程分为建立测试工程、静态测试、动态测试和生成测试报告。每个流程都需要进行相应的配置和一些需要注意的事项。

(1)建立测试工程

建立测试工程的关键步骤是配置编译器,须在Project Configuration中进行编译器的配置,这一步非常关键,因为编译器配置错误将导致整个测试无法进行。由于C++Test能和多种开发环境相集成,所以具体的配置应该和用户开发环境的编译器相一致。

(2)静态测试

C++Test对每个规范都给出了详细的说明和示例,通过对每一个检测到的冲突进行分析,可以提高静态分析的效率和正确性。但是C++Test的静态测试只是使用编程规范对源文件进行扫描,规范不同,得到的结果也不同。因此我们应该根据项目的实际需要选择和配置合适的测试规范,不然有可以能遗漏不少问题,另一方面,盲目的扩大测试规范可能产生大量冗余的测试结果,这也会增加测试人员的分析工作量。

(3)动态测试

C++Test能对被测单元进行详尽的逻辑覆盖测试,包括行覆盖率,语句覆盖率,块覆盖率,分支覆盖率,路径覆盖率,条件覆盖率,可变条件覆盖率;同时通过将黑盒测试的大部分操作形成自动化,大大减轻了黑盒测试的负担。

进行动态测试时,测试用例的设计应充分与覆盖率相结合,系统分析测试用例的设计的合理性和充分性,并根据覆盖率适当增加测试用例。

3 利用C++Test对核电数据库软件进行单元测试

应用上述讨论的软件单元测试方法,利用C++Test测试工具完成了核电厂数据库软件的单元测试。下面以核电厂数据库软件中添加标签点函数AddTag.cpp为例,详细说明C++Test进行单元测试的实现过程,并对结果进行分析。

示例程序AddTag.cpp是数据库软件在添加标签点时获取标签ID的函数。软件的源代码如下:

nicInt32 CTagVector::AddTag(nicOUT nicUInt32* pTagId)

{

if (Size_ < nCapacity_)

{

*pTagId = (nicUInt32)Size_;

Size_++;

}

else if (DeletedHead_ == nicTagId_Unused)

{

nicInt32 nRet = ReAlloc();

if (nicErr(nRet))

{

return nRet;

}

*pTagId = (nicUInt32)Size_;

Size_++;

}

else

{

*pTagId = DeletedHead_;

DeletedHead_ = pData_[DeletedHead_].ParentId;

if (DeletedHead_ == nicTagId_Unused)

{

DeletedTail_ = nicTagId_Unused;

}

else

{

ACE_ASSERT(DeletedTail_ != * pTagId);

ACE_ASSERT(IsDeleted(DeletedHead_));

}

}

InitRecord(* pTagId);

++nCurTagCount_;

IsChange_ = 1;

return nicRET_OK;

}

程序的流程圖如下图1所示。

3.1 静态测试及结果分析

输入新建工程名,导入工程文件,进行编译器配置,读取源文件,配置测试规范,进行静态分析。。C++Test列出了源文件与规范不符的所有地方,并给出了很多详细的信息,对其进行分析能帮助我们较快的定位错误和进行改进。

3.2 动态测试及结果分析

选中添加标签点(AddTag)函数,会自动生成测试用例。自动生成的测试用例,无法满足对代码覆盖率的要求,要在此基础上对测试用例进行修改和添加[6]。如图1所示,示例程序的代码流程中有4个分支点,需要设计测试用例使每个分支点取真(T)、取假(F)各1次,同时由于函数调用了ReAlloc()用于分配空间的函数,需要在设计用例时对其打桩,因此,设计了7个测试用例,每个测试用例的内容和测试的分支点总结列于表1中。测试用例建立并编辑完成后,C++Test可自动依次执行每个测试用例。在测试用例执行过程中,C++Test会检查单元模块的实际输出结果是否与期望值一致,统计执行每个测试用例时软件覆盖情况。如果测试用例中存在设计输出值与期望值不符,则说明该单元模块代码存在功能错误;如果测试结果未实现100%覆盖,则说明对该单元模块的逻辑结构没有实现完全测试[7]。从图中可以看到测试用例对代码的语句覆盖、块覆盖、路径覆盖、决策覆盖均达到了100%。

3.3 生成测试报告

C++Test的测试报告可以生成文本,以及自定义的HTML报告。这些报告将促使测试人员对软件测试的进度进行控制,以及判断软件执行的对错。

4 结论

单元测试是软件测试的基础,其重要性得到了广泛的认可。C++Test是当前较为实用的单元测试软件。本文通过运行C++Test测试工具对核电数据库软件进行单元测试,重点阐述了测试方法及测试流程。运用C++Test测试工具,提高了工作效率,完备了单元测试的完整性,有效地保证了核电数据库软件开发的代码质量。

参考文献:

[1] 刘乐,张奇.核电厂安全系统软件单元测试的安全审评[J].核安全,2013:74-78.

[2] 张巍,尹海波.软件的单元测试方法[J].光电技术应用,2006,21(2):36238.

[3] IEEE Std 610.12-1990“IEEE Standard Glossary of Software Engineering Terminology”.

[4] 朱少民.软件测试方法和技术[M].清华大学出版社,2010:30-62.

[5] 徐宏革,郭庆,雷涛,等.白盒测试之道—C++test[M].北京航空航天大学出版社,2011:63-64.

[6] 张志成.数字化安全系统软件单元测试中的测试用例设计策略[J].第一届中国(国际)核电仪控技术大会,2011.

[7] 李铎,张良驹,冯俊婷.安全软件验证与确认中的单元模块测试技术[J].原子能科学技术,2008,42(6).

【通联编辑:梁书】