单元测试过程分为哪三个阶段 单元测试过程包括哪三个阶段
本文目录导航:
单元测试过程分为哪三个阶段 单元测试过程包括哪三个阶段
第一阶段:能把计算的功能封装起来,通过测试程序和API接口测试其简单的加法功能。
第二阶段:通过测试程序和API接口测试其简单的加法、减法、乘法、除法功能。
并能看到代码覆盖率。
第三阶段:通过测试程序和API接口测试对于各种参数的支持。
并能看到代码覆盖率。
单元测试是指对软件中的最小可测试单元进行检查和验证。
对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。
单元测试是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确。
通常而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为。
例如:你可能把一个很大的值放入一个有序list中去,然后确认该值出现在list的尾部。
或者,你可能会从字符串中删除匹配某种模式的字符,然后确认字符串确实不再包含这些字符了。
总的来说,单元就是人为规定的最小的被测功能模块。
单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。

自动化单元测试工具-winAMS
适用于嵌入式目标机代码的单元测试/集成测试工具,CoverageMaster winAMS,全面支持嵌入式微机,验证嵌入式C/C++软件。
以嵌入式软件的函数为单位,实施模块单元测试以及C0/C1/MCDC覆盖率测试。
无需修改执行代码,直接使用目标机代码进行单元测试,配合静态解析工具CasePlayer2,提供C0(语句),C1(判定),MC/DC覆盖率报告,优化测试用例制作。
已取得第三方认证机构TUVSUD对适用于汽车机能安全ISO软件工具的认证。
产品特有全面支持嵌入式微机,验证嵌入式C/C++软件实施以模块为单位的自动化单元测试工具。
具备检测仅凭系统测试以及整体测试无法发现的潜在错误的单元测试方法,且在汽车控制软件等对安全性要求极高的领域中,单元测试已成为不可或缺的一部分。
直接使用通过交叉编译生成的目标机代码,在模拟处理器环境下进行单元测试,实现C语言程序的逻辑单元验证和具有高信赖度的白盒测试。
无需修改被测试对象,业界唯一的工具实现直接使用目标机代码进行单元测试。
与嵌入式开发角度考虑,避免对交叉编译所生成的经过优化处理的代码进行加工,确保最终产品质量。
单元测试能够与软件开发使用共同的交叉编译环境,不再需要对测试资源进行专门管理,也不再需要建立其他专用环境,方便程序资源管理,缩短准备测试环境所需时间。
符合汽车功能安全标准ISO要求的最佳工具,提供单元测试的环境与目标环境相同的特性。
GAIO提供的单元测试工具Coverage master winAMS具有采用全面支持嵌入式微机的微机化功能测试平台环境、不需要插入测试用代码直接使用目标机代码进行测试的特征,提供符合ISO标准要求的必须功能。
已取得第三方认证机构TUVSUD对适用于汽车机能安全ISO软件工具的认证,2012年6月28日首次获得亚洲地区认证。
通过认证,说明公司的单元测试工具以及程序分析工具在静态分析和单元测试领域,符合所有安全度水准,并得到TUVSUD认证机构的保障。
ISO 规定工具置信水平(TCL),认证适用于TCL3工具认证标准,简化认证手续与时间。
主要单元测试功能包括采用SSTManager管理单元测试project,通用便利的CSV文件管理测试数据输入输出,自动化制作C0/C1覆盖率报告,以及选项功能的MC/DC覆盖率测试功能。
联合程序解析工具CasePlayer2实现代码参照解析作业效率化,自动检索被测试函数的外部变量,根据代码解析自动化制作覆盖率测试计划。
支持MPU,并提供适用于操作PC/OS、IBM PC/AT兼容机、Pentium(相当)2GHz以上CPU、存储器512MB以上、Windows XP、Windows Vista、Windows 7(32bit/64bit)的操作环境。
嵌入式面试常见问题
分享一些嵌入式面试中的常见问题,希望这些干货对大家面试有所帮助。话不多数直接看题:
一.局部变量能否和全局变量重名?
答:能,局部会屏蔽全局。
局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。
对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。
二.嵌入式系统中经常要用到无限循环,如何用C编写死循环
答:while(1){}或者for(;;)
三.关键字static的作用是什么?
答:在C语言中,关键字static有三个明显的作用:
1) 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。
它是一个本地的全局变量。
3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。
那就是,这个函数被限制在声明它的模块的本地范围内使用。
四全局变量与普通的全局变量有什么区别?static函数与普通函数有什么区别?
答:全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。
全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。
这两者在存储方式上并无不同。
这两者的区别虽在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。
而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。
由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。
从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。
把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。
static函数与普通函数作用域不同。
仅在本文件。
只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。
对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件。
五.进程之间通信的途径有哪些?
答:进程间通信主要通过管道、消息、信号等途径进行。
1、无名管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。
进程的亲缘关系通常是指父子进程关系。
2、高级管道(popen):将另一个程序当做一个新的进程在当前程序进程中启动,则它算是当前程序的子进程,这种方式我们成为高级管道方式。
3、有名管道 (named pipe) :有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
4、消息队列( message queue ) :消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。
消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
5、信号量( semophore ) :信号量是一个计数器,可以用来控制多个进程对共享资源的访问。
它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。
因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
6、信号 ( sinal ) :信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
7、共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。
共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。
它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
8、套接字( socket ) :套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。
六.死锁的4个必要条件
答:
1、互斥:某种资源一次只允许一个进程访问,即该资源一旦分配给某个进程,其他进程就不能再访问,直到该进程访问结束。
2、占有且等待:一个进程本身占有资源(一种或多种),同时还有资源未得到满足,正在等待其他进程释放该资源。
3、不可抢占:别人已经占有了某项资源,你不能因为自己也需要该资源,就去把别人的资源抢过来。
4、循环等待:存在一个进程链,使得每个进程都占有下一个进程所需的至少一种资源。
当以上四个条件均满足,必然会造成死锁,发生死锁的进程无法进行下去,它们所持有的资源也无法释放。
这样会导致CPU的吞吐量下降。
所以死锁情况是会浪费系统资源和影响计算机的使用性能的。
那么,解决死锁问题就是相当有必要的了。
七.死锁的处理方式有哪些?
答:死锁的处理方式主要从预防死锁、避免死锁、检测与解除死锁这四个方面来进行处理。
预防死锁:
1、资源一次性分配:(破坏请求和保持条件)
2、可剥夺资源:即当某进程新的资源未满足时,释放已占有的资源(破坏不可剥夺条件)
3、资源有序分配法:系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,释放则相反(破坏环路等待条件)
避免死锁:
预防死锁的几种策略,会严重地损害系统性能。
因此在避免死锁时,要施加较弱的限制,从而获得 较满意的系统性能。
由于在避免死锁的策略中,允许进程动态地申请资源。
因而,系统在进行资源分配之前预先计算资源分配的安全性。
若此次分配不会导致系统进入不安全状态,则将资源分配给进程;否则,进程等待。
其中最具有代表性的避免死锁算法是银行家算法。
检测死锁:
首先为每个进程和每个资源指定一个唯一的号码;
然后建立资源分配表和进程等待表
解除死锁:
当发现有进程死锁后,便应立即把它从死锁状态中解脱出来,常采用的方法有:
1、剥夺资源:从其它进程剥夺足够数量的资源给死锁进程,以解除死锁状态;
2、撤消进程:可以直接撤消死锁进程或撤消代价最小的进程,直至有足够的资源可用,死锁状态.消除为止;所谓代价是指优先级、运行代价、进程的重要性和价值等。
八.进程和线程有什么区别?
答:进程是并发执行的程序在执行过程中分配和管理资源的基本单位。
线程是进程的一个执行单元,是比进程还要小的独立运行的基本单位。
一个程序至少有一个进程,一个进程至少有一个线程。
两者的区别主要有以下几个方面:
1. 进程是资源分配的最小单位。
2. 线程是程序执行的最小单位,也是处理器调度的基本单位,但进程不是,两者均可并发执行。
3. 进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。
而线程是共享进程中的数据,使用相同的地址空间,因此,CPU切换一个线程的花费远比进程小很多,同时创建一个线程的开销也比进程小很多。
4. 线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。
不过如何处理好同步与互斥是编写多线程程序的难点。
但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也跟着死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。
5. 进程切换时,消耗的资源大,效率低。
所以涉及到频繁的切换时,使用线程要好于进程。
同样如果要求同时进行并且又要共享某些变量的并发操作,只能用线程不能用进程。
6. 执行过程:每个独立的进程有一个程序运行的入口、顺序执行序列和程序入口。
但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
优缺点:
线程执行开销小,但是不利于资源的管理和保护。
线程适合在SMP机器(双CPU系统)上运行。
进程执行开销大,但是能够很好的进行资源管理和保护,可以跨机器迁移。
何时使用多进程,何时使用多线程?
对资源的管理和保护要求高,不限制开销和效率时,使用多进程。
要求效率高,频繁切换时,资源的保护管理要求不是很高时,使用多线程。
九. 线程是否具有相同的堆栈?
答:真正的程序执行都是线程来完成的,程序启动的时候操作系统就帮你创建了一个主线程。
每个线程有自己的堆栈。