首页 > 文章中心 > 单元测试

单元测试

单元测试

单元测试范文第1篇

九年级语文(上册)第二单元 测试卷 总得分________基础知识及运用 (30分)1.给下列加粗字注音(4分)①解剖( ) ②旁骛( )③承蜩( ) ④佝偻( )( )⑤骈( )进 ⑥强聒( )( )不舍⑦亵渎( )( ) ⑧扶掖( )⑨睿( )智 ⑩繁衍( )2.给下列同音字组词(3分)3.选出对"度"解释最正确的一项( )(2分)一年一度 度日如年 审时度势 置之度外A.超过 衡量 估计 程度B.次 过去 衡量 分寸C.超过 安排 考虑 限度D.次 过 估量 所打算或计较的

单元测试范文第2篇

一、教师认真备卷,胸有成竹

教师要认真分析试卷,做好统计和记录。“工欲善其事、必先利其器”。在这个过程中,教师做的工作其实是大量的,要做好分数的统计,要做好每套试卷得分率的统计,要做好错题原因的分析,要做好知识点、题型掌握情况的分析,要统计、综合学生的解题思路,要找到一题多解的方法,要准备一题多变的题目,要准备一份针对本次考试的补偿性试卷或习题。这样在面上有利于把握学生的整体情况。在点上也会相应地采取一些有针对性的补救措施。

二、学生自我诊断。自我评价

几乎在每一次考试之后,都会听到学生的后悔与感叹:我怎么就不仔细点呢?我怎么……其实每一次考试,都会有学生因为粗心或其他原因而丢掉不该失的分数。为了纠正学生这种错误,我在每次纠正试卷之前,都提前将试卷发给学生,让学生进行“自查”,标出自己不应该错的题目,加以改正,将应得的成绩添加在自己的成绩旁。经过一段时间,已经有学生将原来容易粗心、马虎的毛病改掉了,收到了初步的效果,这样的做法比老师强调有效多了。

三、处理共性错误,学生主讲

试卷讲评课上经常会出现“教师讲得津津有味,而学生听得昏昏欲睡,订正之后类似题目仍然不会”的尴尬局面。试卷讲评本身就是一种反思性教学活动,若没有学生的积极参与,就收不到好的效果。因此,对于一些有代表性的错误,我在课堂上采取的方法是让学生“说题”,教师及其他学生考查其思维过程。答案以及结果的对错,只是一种表面现象,其实质是思维上的偏差,所以,只有从学生的说题过程中体现出来的思维种种误区着手,才能够有针对性地采取相应的措施解决问题。这样,既为学生下一次出错打下预防针,也为教师日后的教学积累经验,使评讲真实有效。

四、一题多解多变。深化拓展

试卷的讲评,不单是为了纠正错误,更主要的是对知识的总结与升华。一份好的试卷所提供的题目,――般都经过优选,不管是对知识的运用和对解题思路的概括,都有一定的代表性。对于这些典型题目,同样有必要在讲评时进行讨论,引导学生多角度去认识’,多方面去联想,寻求最佳解题方法:这样既能培养学生一题多解的能力,又要培养学生寻求最佳解题方法的能力,前者有助于开拓思维的创造性和收敛性,后者则有助于提高学习效率。在讲评的过程中,我还注意抓住能够一题多变的好题,讲时以某一题为基点,让学生的思维在“一题多变”中向各个可能方向拓展、发散,能够大大提高思维的广阔性,促成思维及解题能力的再一次飞跃。

例如,在进行“圆”这一章测验时,我出了一个这样的题目:

已知:AB是圆O的直径,BC是圆O的切线,切点为B,D为圆上一点,OC平行于AD。

求证:DC是圆O切线。

在进行讲评时,我又给学生进行了下面的三变:

一变:已知AB是圆O的直径,CD、CB分别切圆O于点D,求证:OC平行AD。

二变:已知AB是圆O的直径,OC平行于弦AD,CD切圆O于点D,求证:是圆的切线。

三变:已知BC为圆O的切线,切点为B,DC切圆O于点D,OC平行AD,求证:是圆的直径。

通过这三变,学生把题目中的切线、直径、平行、垂径定理等相关知识密切联系起来,对它们有了更明确的认识,促进了知识的融会贯通。

在这个环节中,要求老师做主导,引导学生的思维,既不能在多解中思维过于发散,又要在变中掌握好深度和难度,不可牵强附会,过于繁杂。

五、供补偿练习。延续巩固

讲评课后必须根据讲评课反馈的情况进行矫正和补偿,这是讲评课的延伸,也是保证讲评课教学效果的必要环节。我的做法是:每次讲评后要求学生将答错的试题全部用红笔订正在试卷上,并把典型错误的试题收集在“错题集”中,做好答错原因的分析,并注明正确解答。同时,依据讲评情况,再精心设计一套有针对性的练习题,作为讲评后的补偿练习,使学生真正领悟试卷中暴露出来的问题,掌握典型问题的解题规律与技巧。

单元测试范文第3篇

关键词:软件测试;单元测试;模拟对象

中图分类号:TP311文献标识码:A文章编号:1009-3044(2008)05-00ppp-0c

1 引言

随着极限编程在实际软件开发项目中的推广,越来越多的项目开始采用测试驱动开发作为主要的软件开发方法。单元测试不仅优化了软件系统设计,还大大简化了功能测试的工作量[1]。但是另一方面.更多的项目在开始不久就发现在很多情况下针对一个类编写单元测试比较困难.随着项目的进行,越来越多的代码无法进行单元测试.到最后整个项目无法继续采用测试驱动的方式进行开发。因此,要将测试驱动开发真正在整个项目里贯彻执行,必须有一种方法能够相对容易的解决这些问题。本文将首先讨论了单元测试和无法或很难进行单元测试的情况,然后引入Mock Object的概念,基于Mock Object实现单元测试。接下来讨论在软件开发过程中引入Mock Object对测试和设计的影响。最后简述了Mock Object的局限性。

2 单元测试

2.1 什么是单元测试

单元测试是对程序中的单个子程序或过程进行测试的过程,也就是说,一开始并不是对整个程序进行测试,而是将注意力集中在对构成程序的较小模块的测试上面[2]。单元测试从两个角度进行测试:一是测试数据都是针对程序的功能来设计的黑盒测试;二是针对程序的逻辑结构来设计测试用例的白盒测试。

2.2 单元测试面对的难题

造成针对一个类难以进行单元测试的主要原因是因为这个类依赖于一些其它的难以测试的资源。主要有这三类最主要的资源:数据库,第三方组件和网络硬件资源。下面我们将对这三大类难以测试的资源进行分类讨论。

2.2.1 数据库

现在大部分的软件项目都会采用数据库作为数据存储。常见的开发团队会在每个开发人员的机器上安装一个本地的数据库,每个人针对自己的数据库进行开发调试。这样做的问题是:必须有一种方式同步数据库的设计。如果有一个人修改了数据库schema或者某个存储过程,这个修改必须同步到所有开发者的本地数据库以及测试服务器上。采用敏捷软件开发的很多项目组往往会浪费大量的时间在数据库设计同步上。更严重的是每周都会遇到由于数据库设计不同步,修改冲突导致的问题导致整个项目的中心源码库在Auto Build时失败。每个开发人员都有自己的测试数据,除了上面提到的需要把这些测试数据同步到所有开发机器和测试服务器上外,还面临更重大的问题。因为测试用例需要修改数据库,因此还必须准备一种机制能够在每一个测试用例执行结束后重新将所有的测试数据调入数据库。采用最简单直接的方法就是在每个测试用例执行前都将数据库清空,然后再将测试数据调入,这样会大大减慢单元测试的时间。单元测试时间越长,开发者就越不愿意执行这些测试用例,单元测试所发挥的作用越小,这也是很多测试驱动项目最终无法进行到底的一个重要原因。另一个非常严重的问题是为了清理测试环境,在针对商业逻辑的测试用例中加入了大量的数据访问层的代码。采用这样的方式强迫开发者在开发商业逻辑层的同时开发数据访问层,并且严重降低了可读性。

2.2.2 第三方组件或应用服务器

数据库是最常见的第三方服务器。除此以外在越来越多的项目中使用第三方的组件和应用服务器。例如:客户环境中的ERP系统,全球定位系统(GPS)的Web Service接口,绘图引擎等。对于这些第三方提供的内容,造成难以编写单元测试的最根本的原因有:一是系统不透明:对于大部分商业组件或者服务来说,一个很重要的内容是良好的封装。但这个特性带来的问题是在外界无法对其内部状态进行控制和访问。往往经过好几个操作后才能在外部观察到相应的变化。二是环境配置困难。由于项目组成员计算机配置不同,加入项目的时间不同,在项目中负责的内容不同导致无法为所有开发人员配置一个完全一致的环境。例如一个绘图引擎的开发版的license是按照一个局域网内部同时使用的人员个数收费的,就不可能只为了能够进行完整的单元测试就为只编写商业逻辑层的开发人员也安装一套。

2.2.3 网络资源和硬件资源

在稍大一些的项目中都或多或少的用到一些网络资源。例如将文件部署到远程的webDAV服务器上同时很多项目还会用到一些硬件资源。常见的有打印机、指纹识别验证或者条形码阅读器等。这些资源有两大特点导致很难针对与他们相关的类编写测试用例。

一是资源访问冲突。很多网络资源对于并发访问的响应协调是通过锁机制进行的,在实际项目中常见的是一个开发人员在调试本地代码时导致远端资源被锁定导致其它开发者无法访问这些资源。

二是环境可控因素。对于网络资源和硬件资源相关代码的测试与针对商业逻辑层代码的测试最大的不同是环境的不确定性。访问网络资源有可能遇到的异常情况非常多,例如网络忙造成访问超时,也有可能建立链接后数据传输失败,还有可能数据传输完成后校验失败。针对访问这些资源的代码进行的测试必须能够覆盖到所有可能出现的每一种情况。如果没有一个可控,并且是全自动的环境辅助单元测试的话,这项任务基本上不可能完成。

3 模拟对象

3.1 什么是模拟对象

Mock这个单词翻译成中文大概的意思是假的,模拟的。如图1所示:通过一个常见的对商业逻辑的测试描述了一个Mock Object。在图中我们可以看出:测试代码需要测试商业逻辑,而商业逻辑代码需要通过IMyDataAccess接口访问底层数据库,这就是数据库依赖问题。为了解决这个问题我们引入一个Mock Object,并将这个Mock Object而非真正的Data Access传递给商业逻辑代码进行测试。这里的Mock Object不需要实现任何逻辑只需要根据商业逻辑的需要返回适当的内容就可以了。

图1 使用Mock Object对商业逻辑进行测试

3.2 模拟对象实现单元测试应用实例

现在我们写好了类AccountService,具体如下:

public class AccountService {

private AccountManager accountManager;

public void setAccountManager(AccountManager manager) {

this.accountManager = manager;

}

public void transfer(String senderId, String beneficiaryId, long amount) {

Account sender = this.accountManager.findAccountForUser(senderId);

Account beneficiary =

this.accountManager.findAccountForUser(beneficiaryId);

sender.debit(amount);

beneficiary.credit(amount);

this.accountManager.updateAccount(sender);

this.accountManager.updateAccount(beneficiary);

}}

现在我们想测试transfer方法,它内部调用的AccountManager的两个方法。但是对于AccountManager来说,它只是个接口,如下:

public interface AccountManager {

Account findAccountForUser(String userId);

void updateAccount(Account account);

}

所以现在我们必须写个MockAccountManager对象。而且里面的方法体都是非常简单的,就是假定它就返回某某值。

我们这里还有Account类。

public class Account {

private String accountId;

private long balance;

public Account(String accountId, long initialBalance) {

this.accountId = accountId;

this.balance = initialBalance;

}public void debit(long amount) {

this.balance -= amount;

}

public void credit(long amount) {

this.balance += amount;

}

public long getBalance() {

return this.balance;

}

public String getAccountId() {

return accountId;

}}

public class AccountService1Tests extends TestCase {

public void testTransfer(){

AccountService as = new AccountService();

MockAccountManager mockAccountManager=new MockAccountManager();

Account accountA = new Account("A",3000);

Account accountB = new Account("B",2000);

mockAccountManager.addAccount(accountA);

mockAccountManager.addAccount(accountB);

as.setAccountManager(mockAccountManager);

as.transfer("A","B",1005);

assertEquals(accountA.getBalance(),1995);

assertEquals(accountB.getBalance(),3005);

}}

这里我们在假定AccountManager方法都工作正常的情况下,完成了对transfer方法的测试。

从以上代码可以看出,采用Mock Object进行的单元测试基本上可以分为下面几步:

(1)基于一个接口定义Mock并实现这个接口的所有函数。

(2)创建Mock Object的一个对象

(3)设置对象内部属性

(4)告诉对象测试代码希望看到的反应

(5)进行测试

(6)检查Mock Object的确按照希望的顺序进行工作。

3.3 模拟对象的优点

3.3.1 模拟对象作为测试手段的优点

Mock Object最直接的优点在于提供单元测试的质量和覆盖率:

(1)只要在测试中对期待发生的问题指定好执行的顺序引入Mock Object对象后的单元测试就是在一个完全可控的环境里进行的。也就是说我们再也不会无法定位一个“时隐时现”的bug。相反我们可以非常迅速的将问题定位在一个类的内部,而不是一个函数调用序列。

(2)于测试人员来说,最常见的问题是测试人员提交的bug无法在开发人员那里复现。有了Mock Object这个工具测试人员可以利用Mock Object明确的指定输入和输出编写一个测试用例让开发人员修复。

(3)超过8O% 的异常处理代码没有被充分测试过。主要原因是在没有Mock Object之前很多情况是无法由人工进行控制的,例如写文件失败网络连接超时,数据库数据传输失败或者从网络接收到的数据已经损坏。通过控制Mock Object我们很容易就可以模拟上面的这些情况。

3.3.2 模拟对象作为设计手段的优点

虽然Mock Object最直接的优点在于给予测试代码更多的可控性和可操作性,它最大的优点在于对软件设计的影响[3]。

(1)测试驱动开发与Mock Object一起使用,可以写出低耦合高内聚,非常优雅干净的代码。

(2)强迫设计者放弃对第三方库的强依赖关系,取而代之的是比较弱的依赖关系。

(3)设计人员可以将更大的注意力放在商业逻辑的实现和测试.由于Mock Object的存在,我们不需要实现数据访问层就可以对商业逻辑进行测试。而商业逻辑才是任何系统中对于客户最重要的内容,它的正确与否决定了整个系统是否能完成任务,它的稳定性决定了整个系统架构的稳定性。

(4)在项目初期,甚至是中期,将设计人员解放出来,不用对系统底层的基础设施做出判断。例如,在商业逻辑并不明确,需求还不稳定的时候,我们是更多根据感觉来做出很多重要的判断的,而这些判断往往导致比较关键的决定。例如,在项目之初,谁能够明确的回答到底需要什么样的数据库?Oracle?SQL Server?还是XML文件?到底需要什么样的队列服务器 MSMQ还是IBM―MQ?由于Mock Object的引入,我们可以将这些决策推迟到商业逻辑层更加明确之后进行,从而可以获得更加准确有针对性的答案。

3.4 模拟对象的局限性

Mock Object在实际项目中的应用存在一些限制,一些是由于Mock Object本身性质决定的,有一些则是由于其它类库设计存在的缺陷导致的。

(1)一个典型的不是Mock Object的问题,而是类库设计的问题。是Mock Object无法模拟比较深的对象树。有一些第三方的类库,尤其是一些消息处理函数的参数,提供的不是接口而是一些对象。往往这些对象内部有很多子对象,也就是我们常说的一棵大的对象树。我们需要花费太多的精力去构造这些对象来进行模拟,时间消耗巨大。

(2)一般性而言,单元测试的粒度越细,功能测试的粒度就可以越粗[4]。但是引入Mock Object的单元测试仍然无法取代功能测试。一个很好的例子就是误差积累的测试,哪怕每个单元的误差都在可接收范围内,我们仍然需要一个功能测试确保整体误差也是可以接受的。

4 结束语

模拟对象解决了传统单元测试的两个问题:一是如何将需要测试的代码与相关环境隔离;二是如何创建一个快速、可控的环境辅助测试开发。随着模拟对象技术的成熟,基于模拟对象的单元测试会越来越广泛地被采用。

参考文献:

[1]Kent Beck.测试驱动开发[M].北京:中国电力出版社,2003.

[2]Myers.王峰,陈杰译.软件测试的艺术(第二版)[M]. 北京:机械工业出版社,2006.50-52.

[3]David Astels.崔凯,译.测试驱动开发实用指南[M].北京:中国电力出版社,2004.120-130.

[4]Paul C Jorgensen.韩柯,杜旭涛,译.软件测试(第二版)[M].北京:机械工业出版社,2003.

单元测试范文第4篇

关键词:飞行控制软件;单元测试;动态测试

中图分类号:TP301

文献标识码:A 文章编号:1672-7800(2015)005-0029-03

作者简介:刘思思(1985-),女,陕西商洛人,硕士,上海机电工程研究所工程师,研究方向为飞行控制软件开发、系统集成与验证;刘迪(1985-),男,黑龙江哈尔滨人,硕士,上海机电工程研究所工程师,研究方向为制导控制系统设计与仿真。

0 引言

在飞行控制软件(简称飞控软件)开发过程中,单元测试环节必不可少。其中,静态度量指标可以用专门的工具很方便得出其具体数值,而动态测试虽然也有专门的工具,但编写测试用例需要花费大量时间和精力。当前,航天多型号开发任务重,迫切需要应用自动化的测试工具软件来提高动态测试的工作效率。

本文结合飞控软件的特点,论述通过自动生成测试用例的工具软件Cantata6.2进行单元动态测试的方法。

1 飞行控制软件特点

飞控软件的主要功能是完成相关设备之间的实时信息交互与控制解算,从而实现飞行过程中姿态和位置的控制。飞控软件主要分为应用层软件、接口协议层软件和底层驱动软件3个部分,软件架构如图1所示。

应用层软件由实现姿态和位置控制的各功能模块组成;接口协议层软件主要为飞行控制设备与其它设备之间通信的协议模块;底层驱动软件主要由飞行控制设备的接口驱动模块以及硬件输入输出模块组成。

飞控软件嵌入在飞控设备中,具有实时性高、时序和逻辑复杂、可靠性高的特点。首先,要确保底层驱动软件和接口协议软件的正确性,使得各类信号得以正确传输;其次,要确保软件与控制算法模型的一致性,输入输出及解算正确;最后,要确保软件时序和逻辑的正确性。只有这样才能保证飞行控制系统正常工作。

2 飞行控制软件单元测试的意义

对飞控软件的最小组成单位――函数进行测试的目的在于检验其能否正确地实现其功能,满足性能指标和接口要求。通过语句(SC)、条件(DC)、修正条件判断(MC/DC)等覆盖率指标评价程序结构,及早发现软件代码中的编码和逻辑错误。

对控软件来说,被测函数已经完成了编码和调试,能够通过编译和链接进行单元测试。此外,不考虑每个模块与其它模块之间的关系,为每个模块设计驱动模块和桩模块,每个模块进行独立的单元测试,各模块的单元测试可以并行进行,能够提高测试效率,也较容易实现100%的覆盖率指标要求[1]。

3 Cantata6.2测试工具

3.1 Cantata6.2简介

Cantata6.2采用先进的代码分析器和AutoTest技术,智能分析被测代码,扫描代码的所有可能路径,根据选定的覆盖率标准,自动生成满足100%覆盖率的测试用例。对全局变量、返回值自动赋期望值,并包含对全局变量、返回值、调用函数参数传递等进行检查。对形参为复杂类型,如结构体指针的情况,能自动生成相应的测试对象,即构造一个结构体数组,将结构体数组的地址赋给形参。自动生成桩函数,在测试工程中替代真实的外部函数。使用Cantata6.2进行单元测试的原理如图2所示。

用户可以使用Cantata6.2工具AutoTest选择相应的覆盖率规则集,通常航天A级软件要满足修正条件判断(MC/DC)覆盖率100%,B级软件要满足分支判断(DC)覆盖率指标100%,C级软件要满足语句(SC)覆盖率指标100%。飞控软件通常均为A级软件,选择DO-178B/ED-12B Level A Coverage规则,自动生成满足SC、DC、MC/DC3个覆盖率指标要求的测试脚本文件。

3.2 含有桩函数的测试实例

本文以飞控软件的指令形成函数模块为例,检验Cantata6.2的动态测试功能。该函数模块的主要功能是形成稳定控制系统姿态控制等的指令信号。代码框架如下:

void Instruction (C_INSTRCUTION *C_)

{

……; //定义局部变量

if(C_->fInTT < t1)

{

……; //控制解算

}

else

{

……; //控制解算

Function1(C_);

……;

if(C_-> fInTT < t2) //注①

{

……;

}

else

{

……;

}

……;

}

}

利用Cantata6.2进行动态测试。自动生成10个测试用例并执行完后,语句覆盖率和分支判断覆盖率都没有达到100%,源代码中注①处标注的条件判断的假分支没有得到执行。于是,手动添加一个测试用例,使得在给定的输入条件下结构体变量C_-> fInTT的值落在[t2,∞)的区间内,接着重新执行该测试用例,结果还是执行不到该假分支。仔细分析代码后发现,该分支中的条件判断表达式中的结构体变量C_-> fInTT的值已被桩函数Function1(C_)修改。

处理方法如下:第一步,在Cantata6.2的调用接口控制界面中,为该桩函数添加一个新的桩函数实例,并手动修改结构体变量C_-> fInTT的值,该数值应大于或等于t2;第二步,在Cantata6.2测试用例界面,将调用序列更改为新的桩函数实例。至此,执行全部11个测试用例之后,满足语句和分支判断覆盖率全达到100%的指标要求。

3.3 编译器对测试结果的影响

飞行控制软件的编译器目前主要使用CCS2.2或CCS3.3,在用Cantata6.2进行单元测试时,CCS被设置为Simulator模式,Cantata6.2会自动调用CCS,执行编译好的测试中间文件,进而生成测试结果文件。测试过程中,笔者发现对于如下代码段,Cantata6.2自动生成的测试用例对X自动赋值为0.9999,调用CCS2.2执行用例后,代码运行的实际路径与期望路径不一致,测试结果不能达到100%的分支覆盖率指标要求。

#define ZEROP 0.00001

void Function2 (void)

{

if(X

{

……;

}

else

{

……;

}

……;

}

笔者分别在CCS2.2和CCS3.3编译器环境下,验证了该代码段的运行情况,最终得出结论如下:①在CCS2.2编译器下,程序执行真分支,与期望不一致,结果不正确;②在CCS3.3编译器下,程序执行假分支,与期望一致,结果正确。上述结果表明,不同的编译器版本影响程序实际执行路径的正确性。

4 基控软件的Cantata6.2使用策略

4.1 Cantata6.2使用策略

飞控软件中包含很多复杂的结构体数据类型,Cantata6.2能够对结构体类型自动赋值,不用手动一一赋值;而且飞控软件涉及大量数学计算,Catata6.2的测试脚本是开放的纯C代码,可在其脚本管理器界面或测试脚本中直接修改某个测试用例的变量值,提高测试效率。Cantata6.2测试工具是通用的,而飞控软件具有其特殊性,就二者的融合使用,笔者总结出如下经验:

(1)飞控软件中一般都包含do while(1)的死循环结构,测试时需要将这类死循环放开,测试用例才能执行完毕。

(2)飞控软件中包含有很多类似“x=x”的赋值操作,本义是在某些特定条件下,x的值不变,测试时要将这类语句注释起来,否则Cantata6.2会报错。

(3)当被测函数包含子函数时,Cantata6.2会自动作打桩处理,但桩函数有可能会修改某些全局变量的值,进而导致某个分支始终无法覆盖。这时,可以在该桩函数的调用接口添加一个桩函数实例,并手动修改该变量的值,再将调用序列更改为新的桩函数实例,如3.2小节所述实例。

(4)飞控软件作为嵌入式软件,最终是固化在飞控设备中,构成飞控系统运行。因此,软件一般都包含对硬件端口地址的操作,如果是从端口输出数据,测试时需要将这些代码注释起来,如果是读取某个地址的值,则可以自己定义一个变量代替该数值,否则将导致不能自动生成测试用例。

(5)飞控软件中的控制算法一般都包含有积分计算,开发人员一般习惯定义静态的局部变量,遇到这种情况时,应该将这些变量移到函数外部定义,否则会导致不能自动生成测试用例。

4.2 测试驱动开发

Cantata6.2测试工具能够自动生成测试用例,即使不满足语句、分支判断、修正条件判断覆盖率100%要求,测试人员也能很快根据覆盖率结果图示手动添加新的测试用例,使得该用例执行后覆盖到上一次未覆盖到的分支。但是,就笔者的使用经验而言,Cantata6.2对被测代码的要求比较高,被测代码要符合标准C要求,其头文件不能相互嵌套重复引用,否则一个.c文件和其相关的.h文件加载进去就会出现错误提示和警告,而且必须将这些错误提示解决完并通过编译后,才能进行下一步生成测试用例的工作。此外,由控软件具有逻辑复杂、运算量大的特点,要借助Cantata6.2的自动生成测试用例的功能快速完成飞控软件测试,这也对飞控软件的代码质量和框架结构提出了比较高的要求。在飞控软件框架结构和代码质量比较高的情况下,可以加载整个.c文件,一次性生成整个.c的全部测试用例,而不用单个函数去建测试工程,从而加快测试速度。笔者总结使用经验如下:

(1)飞控软件的自动驾驶仪模块根据控制系统的模型编写,模型中包含滚动、偏航、俯仰三通道控制解算算法,该模块代码最好拆成3个函数模块,单个模块代码行数要在200行以内,便于测试,代码结构也更加清晰。

(2)由控软件的特殊功能需求,同一个函数中包含多个条件表达式“与”或者“或”,再进行逻辑(即if else)判断的用法非常多,譬如if(条件表达式1&&条件表达式2||条件表达式3),开发人员在编写代码时,最好将这些条件表达式的计算在if判断之前完成,以有利于测试用例能够正常覆盖到期望的分支。

(3)依据航天软件工程化标准要求,飞控软件的安全关键性等级一般为A级,单元测试必须满足语句(SC)、分支判断(DC)、修正条件判断(MC/DC)覆盖率均达到100%。MC/DC要求每个判定中的每个条件都曾至少一次独立影响判定结果。由控系统的特殊算法需求,模型中涉及分段函数计算比较多,选择MC/DC覆盖率标准后,某些代码会覆盖不到。代码结构如下,斜体加粗部分为未覆盖到的代码:

if((x1>x2)&&(x1< (x2+const1)))

{

……;

}

else if( (x1>(x2+ const2))&&(x1< (x2+const3))) //注2:0

{

……;

}

else

{

……;

}

分析上述代码,笔者认为由于选择了修正条件判断覆盖率标准MC/DC,Cantata6.2认为第一个判断条件“x1>x2”的假分支不应再包含“x1>(x2+const2)”的判断条件。类似情况,建议控制系统设计师修改模型文件,或者软件开发人员优化程序结构。

(4)通过3.3小节中的实例,建议开发人员应该选择升级版本的编译器作为开发工具。此外,笔者尝试了将ZEROP定义为局部变量0.00001,结果程序无论在CCS2.2还是CCS3.3编译器下,均执行不到期望的正确分支,这对编码质量提出了较高要求。

5 结语

利用Cantata6.2自动生成测试用例的功能能够快速完成单元动态测试,促进开发人员提高编码质量,提高飞控软件的可移植性和可维护性,满足当前航天多型号软件开发和单元测试的工作需求。同时,工具内置的很多规则集能够帮助测试人员快速定位软件编码错误和框架问题,进而帮助开发人员更好的优化程序结构,进一步提高航天软件研制水平。

参考文献:

[1] 张猛,毛亮.航天嵌入式软件的单元测试方法探讨[J].航天器工程,2006(7):32-35.

[2] 陶幸辉,宋志刚.嵌入式飞控软件测试方法研究及实践[J].软件导刊,2011(8):14-16.

[3] 马飒飒,赵守伟,肖小峰.基于覆盖与故障注入的飞控软件测试技术研究[J].计算机测量与控制,2005,13(3):291-293.

单元测试范文第5篇

单元测试

第一单元

时间:90分钟

满分:100分

一、在括号里给加点字注音。

(5分)

1.据小斌的口供(gōng

gòng)说,他和家家乐超市这种供不应求(gōng

gòng)的危险状态已经很久了。

2.每当春天来临,燕园(yān

yàn)里就有燕子(yān

yàn)飞来飞去。

3.花园里面明晃晃(huǎng

huàng)的,红的红,绿的绿,新鲜漂亮。

二、读拼音,写词语。

(8分)

qīng

tíng

jiáo

yòu

zhì

shā

qiū

yǐn

zhěn

tóu

chú

tóu

chéng

rèn

三、写出下面词语的近义词。

(6分)

安静——(

侵犯——(

轻松——(

幼稚——(

寂寞——(

等候——(

四、把下面的诗句填写完整。

(5分)

1.昼出耕田夜绩麻,

2.

,忽作玻璃碎地声。

3.牧童归去横牛背,

4.百川东到海,

?少壮不努力,

五、写出下面句子的修辞方法。

(8分)

1.骆驼队来了,排列成一长串,沉默地站着,等候人们的安排。(

2.这巴掌大的地方什么也种不了。(

3.汉字是一些多么可爱的小精灵啊!(

4.谁能不为他的英雄行为所感动呢?(

六、按要求写句子。

(8分)

1.傻事我不会再做了。(扩句)

2.不劳动,连棵花也养不活,这是真理。(改成反问句)

3.我看骆驼咀嚼的样子:那样丑的脸,那样长的牙,那样安静的态度。(用加点的词语写句子)

4.稚子金盆脱晓冰,彩丝穿取当银铮。(写出诗句的意思)

5.祖父多次反复教育我要仔细区分谷子和狗尾巴草。(修改病句)

七、口语交际。

(5分)

童年的事情看起来微不足道,却令人难以忘怀。如果你想了解爸爸或妈妈的童年,你应该提出哪些问题?请你列个提纲,把要提问的问题写下来。

八、课内阅读。

(11分)

祖父发现我铲的那块地还留着一片狗尾草,就问我:“这是什么?”

我说:“谷子。”

祖父大笑起来,笑够了,把草拔下来,问我:“你每天吃的就是这个吗?”

我说:“是的。”

我看祖父还在笑,就说:“你不信,我到屋里拿来给你看。”

我跑到屋里拿了一个谷穗,远远地抛给祖父,说:“这不是一样的吗?”

祖父把我叫过去,慢慢讲给我听,说谷子是有芒针的,狗尾草却没有,只是毛嘟嘟的,很像狗尾巴。

1.“我”铲的地里为什么还留着一片狗尾草?(3分)

2.谷子和狗尾草的区别是什么?(4分)

3.祖父对“我”的铲苗留草的做法的态度是什么?说明了什么?(4分)

九、课外阅读。

(14分)

井里捞上来的“美食”

记得大门洞子东边那家是养猪的,一个大猪在前边走,一群小猪跟在后边。有一天一个小猪掉井了,人们用抬土的筐子把小猪从井里吊了上来。吊上来,那小猪早已死了。井口旁边围了很多人看热闹,祖父和我也在旁边看热闹。

那小猪一被打捞上来,祖父就说他要那小猪。祖父把那小猪抱到家里,用黄泥裹起来,放在灶坑里烧上了,烧好了给我吃。

我站在炕沿旁边,那整个的小猪,就摆在我的眼前,祖父把那小猪一撕开,立刻就冒了油,真香,我从来没有吃过那么香的东西,从来没有吃过那么好吃的东西。

第二次,又有一只鸭子掉井了,祖父也用黄泥包起来,烧上给我吃了。

在祖父烧的时候,我也帮着忙,帮着祖父搅黄泥,一边喊着,一边叫着,好像拉拉队似的给祖父助兴。

鸭子比小猪更好吃,那肉是不怎样肥的。所以我最喜欢吃鸭子。

我吃,祖父在旁边看着。祖父不吃。等我吃完了,祖父才吃。他说我的牙齿小,怕我咬不动,先让我选嫩的吃,我吃剩了的他才吃。

祖父看我每咽下去一口

他就点一下头

而且高兴地说

这小东西真馋

或是

这小东西吃得真快

我的手满是油,随吃随在大襟上擦着,祖父看了也并不生气,只是说:

“快蘸点盐吧,快蘸点韭菜花吧,空口吃不好,等会儿要反胃的……”

说着就捏几个盐粒放在我手上拿着的鸭子肉上。我一张嘴又进肚去了。

1.“助兴”一词的意思是

。在文中指的是

。(4分)

2.在文中的空白处加上合适的标点。(3分)

3.题目“井里捞上来的‘美食’”中的“美食”指的是

两件事。这两种“美食”中“我”最喜欢的是

。(3分)

4.在这篇文章的字里行间,你体会到作者与祖父之间怎样的感情呢?(4分)

十、作文。

(30分)

写一件自己成长过程中印象最深的一件事情,注意要把事情的经过写清楚,还要把自己的感受写明白,题目自拟,字数不少于400字。

参考答案

一、1.gòng

gōng

2.yān

yàn

3.huǎng

二、蜻蜓

咀嚼

幼稚

沙漠

蚯蚓

枕头

锄头

承认

三、宁静

侵略

轻快

天真

孤寂

等待

四、1.村庄儿女各当家

2.敲成玉磬穿林响

3.短笛无腔信口吹

4.何时复西归

老大徒伤悲

五、1.拟人

2.夸张

3.比喻

4.反问

六、1.示例:学骆驼咀嚼的傻事,我不会再做了。

2.不劳动,连棵花也养不活,这难道不是真理吗?

3.示例:我看着动物园里的大象:它的鼻子是那样长,那样灵活,那样有趣。

4.儿童早晨起来,从结成坚冰的铜盆里剜冰,用彩线穿起来当铮。

5.祖父多次教育我要仔细区分谷子和狗尾巴草。

七、略

八、1.因为“我”把狗尾草当作谷穗。

2.谷子有芒针,狗尾草却没有,只是毛嘟嘟的,很像狗尾巴。

3.祖父没有责备,还给“我”将谷子和狗尾草的区别,表现了对“我”的爱。

九、1.帮助增加兴致

“我”又喊又叫,增加祖父烤鸭子的兴致

2.,,:“,,。”

3.烧小猪

烧鸭子