文档库 最新最全的文档下载
当前位置:文档库 › 程序调试黑宝书

程序调试黑宝书

程序调试黑宝书
程序调试黑宝书

单片机程序调试黑宝书

一、前言:

1.1 你离高手有多远?

首先我必须放下架子,因为本文的读者中很大一部分在不久的将来都会超越我。而且我

也100%不能自诩为高手,我不过是比本文的部分读者碰的钉子多些罢了。再退一步讲,即

使你请了一位“高手”帮忙,如果他不是对你的具体系统十分了解,也只能给你一些原则上的建议罢了。

?结论:没有绝对的高手,高手是积累出来的,程序调试

靠自己。

1.2 谁应该读这篇文章?

我们经常在论坛看到类似这些主题的帖子“I2C 程序怎么调为什么我的程序不对?”,

然后贴一堆代码上来;“为什么我这样写对,那样写不对”。如果你提过类似问题,或者不知

道程序该怎么Debug,就请读本文了。

如果你刚开始学习单片机,可能觉得本文不着边际,那么请先死记这些结论,待到3

年后再从头读一遍,一定会和我发生共鸣。

1.3 这篇文章针对哪种单片机或者哪种语言?

这篇文章不涉及任何具体单片机型号和任何具体语言,你可以把他理解为凌驾在具体嵌

入式技术之上的技术,就像哲学那样。

1.4 这篇文章有版权吗?

有的!但是我不准备出版,也不准备收费。

因为我国99.99%的高校毕业生(甚至读完研究生)都不曾看到这样专业化的程序调试

教程,如果按大家为高等教育付出的几万元代价计算,这篇文章我起码会卖到10 万/人,太天价了!这篇文章的目的是总结、提高,并在21IC(https://www.wendangku.net/doc/506493509.html,)上提供免费下载,你转

载的时候只要保证本文的完整性,并注明出处就可以了。

作为免费的等价条件,我也不承担读者因为本文造成的任何损失,请保持独立思考的习

惯,并不要轻易使用本文中的代码,这些代码有的是伪语句,这些代码只是为了配合文字说明问题用。

1.5 这篇文章所列举的事例和 BUG 真实吗?

孙子云:兵不厌诈。这些例子不一定是我所在公司所遇到的,也有我经过组装修饰的,

也得给我点隐私权嘛,鉴于本文的非商业化目的,我不对文中任何所提及的产品和技术负责。

二、该如何写程序:

我们不怕得罪“Coder”但是需要首先建立一个观点——程序是电子技术里面最最简单,

的东西,因为程序的确定性比起硬件大得多。处理器的行为是认为设计的数字逻辑行为,不

存在硬件上得容差问题。

话说硬件设计需要很多数据库型的知识支撑,高频还需要黑色艺术细胞,学写程序除了

背点语句,掌握一些基本技巧外加做好规划之外,不需要其他东西,会说话就会写程序!

?结论:程序的确定性比硬件大,不要害怕程序

问题。

2.1 什么是程序?

“程序就是为了让处理器做某件事情而编写的有序汇编代码集合”。

这里要注意两件事情,一是“做某件事情”,说明程序是为需求服务的,只有把需求搞

清楚了,程序才能写得出来;二是“汇编代码集合”,所有计算机只认识一种语言——机器

码,也就是汇编所对应的机器语言,其他再华丽的高层语言(例如C)最终都会成为汇编指

令供机器执行,只是这个过程被编译器(例如 C 编译器)自动执行罢了。

从这个角度来说,无论你掌握了多少种语言,例如C、C++、汇编,也无论你可以在计

算机二级 C 语言考试得多高分,都不等于你会写程序。

?结论:写程序,最重要的不是学会某种语言,而是会分析问题并提出解决问题的方法。

2.2 顺序程序

如果当一个程序编写好后,所有语句被执行的先后顺序已经确定下来,这就是一个顺序

程序。

这种程序通常有如下特征:

1)不使用中断系统(当然也就包括了不使用操作系统)

2)不与操作者发生交互,或者在交互时,死等操作者指令

顺序程序可以用流程图非常明确地描述出来,例如非常经典的

“如何把大象放进冰箱”问题,可以用右边的流程图【1】表达

虽然把大象放进冰箱只是一个笑话,但是说明了这个过程是由3

个动作组成的,并且这 3 个动作之间的顺序是不可颠倒的。任何初学

打开冰箱门把大象放进去关上冰箱门

者,只要能够理解“如何把大象放进冰箱”的奥妙,就能开始写程序

图【1】

了!

作为一个特例,在程序中有等待用户操作环节的,只要在等待时不进行其他操作,同样也是顺序程序。

2.3 含有中断的程序

如果一个程序使用了中断,无论这个中断是用硬件中断(例如外中断INT,串口接收中

断等)直接操作,还是通过定时器切换的操作系统,都统称为含有中断的程序。这种程序的特点是:

1)含有多个并行运行的代码(例如主循环和中断服务程序)

2)这些并行代码间运行的先后顺序错综复杂

我们继续用“如何把大象放进冰箱”问题,来描述。

金黄色部分流程线描述了在放大象的过

程中接电话的“中断”。一旦程序加入了中断的环节,就会变得复杂起来,因为接电话这个事情可能发生在任何时候——打电话的人不

可能知道你在放大象嘛。

另外,加入了中断环节的程序可能出现

很多意想不到的事情,比如接电话期间,大象

可能跑掉,或者冰箱门被加上了“不允许打开超过 1 分钟”的限制条件。

对于复杂的中断,还可能存在着“接到

打开冰箱门

接电话把大象放进去

关上冰箱门

电话,要求把大象红烧吃了”的情况,这样接

完电话以后就没有大象可放了,这就是中断和操作系统中经常遇到的“临界资源”问题。

图【2】

?结论:含有中断的程序较为复杂,需要编写者清楚同一时刻,我在做什

么,其他人在做

什么,用“并发”的方式思考问题,才能写好。

2.4 程序模块化

首先说明,程序模块化是为了提高编程效率,扩大编程者对程序的掌握能力,便于程序

维护而产生的,对计算机本身而言,程序是没有工整和杂乱的区别的。

程序模块化的基本任务就是将复杂的设计任务划分为若干个功能明确,出入口简单的功

能块。

?结论:程序模块化是为了编写而不是为了运行,模块化和函数是两个不同的概念,函数

是为了将需要多次使用的代码统一编写,以便减少程序代码量,便于维护;模块化是指将复

杂的程序功能化整为零而成的功能块,一个模块可能由多个函数组成,也可能就是一个函数,

还有可能只是一段紧密相连的代码块。

我们继续用大象的例子来示范,这里的 3 个动作都可以看成模块。假设我们由一个机器

人来做这件事,机器人不能理解“打开冰箱门”“把大象放进去”“关上冰箱门”这 3 个步、、

骤,那么就要用更基础的语言来为机器人编程。

【模块——打开冰箱门】

1. 抬起右手,移动到 冰箱门把中心右侧 1cm 处

2. 弯曲右手手指,勾住冰箱门

3. 以 2kg 的力量向后拉

4. 完成

当然,站在不同的角度来看,模块的定义可能将发生变化。比如任务整体扩大到“红烧

大象”的级别,“买大象”“把大象放进冰箱”“把大象取出冰箱”和“烹饪大象”将成为、、

模块。在很多时候,模块的划分仁者见仁,但是总的原则要求是功能内聚、接口简洁,如果

某种划分方式使得模块间到处都是接口,那么这个划分肯定是不好的。

?结论:好的模块化设计,模块间的接口简单明了。总的来说,好看好改的程序就是好程

序。

2.5 程序编写

我们来看一个21ICBBS 上的实例:

#include

sbit latch1=P2^1;

sbit latch2=P2^2;

void delay(unsigned int t);

unsigned char weima[8]= {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

unsigned char duanma[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

unsigned char LED[]={0xcf,0xf3,0xfc,0xf3};

unsigned char tempdata[10];

void delay(unsigned int t);

void display(unsigned char firstbite,unsigned char num);

main(void)

{

unsigned int m=30,n,i=0;

P1=0xcf;

TMOD=0x10;

TH1=0x3c;

TL1=0xb0;

TR1=1;

while(1)

{

if(TF1==1)

//等待定时器溢出中断标志{

TF1=0;

n++;//软件定时器

TH1=0x3c;

TL1=0xb0;

if(n==20)

{

n=0;

if(m>0)

m--;

if(m==0)

{

i++;

P1=LED[i];

if(i==3)

i=0;

m=30;

}

}

}

tempdata[0]=duanma[m/10];

tempdata[1]=duanma[m%10];

display(3,2);

}

}

void delay(unsigned int t)

{

while(t--);

}

//重载定时器//End Of if(n==20)

//End Of if(TF1==1)

//End Of While(1)

//End Of main()

void display(unsigned char firstbite,unsigned char num) {

unsigned int i;

for(i=0;i

{

P0=0;

latch2=1;

latch2=0;

P0=weima[i+firstbite];

latch1=1;

latch1=0;

P0=tempdata[i];

latch2=1;

latch2=0;

delay(200);

}

}

这个求助帖的原文是“这个程序的定时不准 我本来定的间隔是 1s 结果运行时是 1.04s

左右,通过改初值也无法精确到一秒,总会多或少 0.0 几秒,请高手给看看是怎么回事?晶

振是 12MHz 的 谢谢”

很明显这是一个初学者写出来的程序。请注意,程序里的注释是我加上去的,因为程序

实在太乱了,我用 UE 才排出现在大家看到的缩进。抛开程序里的其他设计问题不说,仅讨

论楼主的问题——为何定时不准,老实说我也不知道!!

因为我根本就不会把程序写到这个程度再来调试!很明显这个程序由 3 个模块组成—

—基础定时模块(由 Timer 实现)、软件定时模块(由 m 和 n 组成的计数器实现)、显示模

块(由函数 display 实现)。定时准确的核心是基础定时模块的溢出频率准确,所以在编写程

序的时候先要对其进行测试。例如基础定时模块的设计中断周期是 1mS ,我会在程序写到这

个程度的时候停下来:

_isr_timer_ovf()

{

timer_reload();

P0^=0x01;

}

main()

{

init_device();

while(1);

}

假设设计的定时器溢出周期是 T ,这段代码将在端口 P0.0 上产生一个以 2T 为周期(2mS )

的方波,用示波器或者频率计对这个方波进行测量,就可以知道基础定时器模块工作是否正

常。接下来再编写软件定时模块。

unsigned int timer;

_isr_timer_ovf()

{ //Init Timer, IO and Interrupt //测试代码

timer_reload(); timer--;

if(timer == 0)

{

timer = 1000;

P0^=0x01;

}

}

main()

{

init_device();

timer = 1000;

while(1);

}

//测试代码

//Init Timer, IO and Interrupt

在这一步,我们再一次用P0.0 上的方波对软件定时器产生的2S 周期定时进行检验,最

后我们加入显示部分。

unsigned int timer;

_isr_timer_ovf()

{

timer_reload();

timer--;

if(timer == 0)

{

timer = 1000;

display(timer);

}

}

main()

{

init_device();

timer = 1000;

while(1);

}

如果这样写程序,即使有设计失误导致定时不准,在编写显示程序前已经被发现了。与

//Init Timer, IO and Interrupt

哲学的观点相同,事物是相互联系的,一个程序中包含的所有代码间都将相互关联,由于设

计不当,显示程序可能侵占软件定时器所使用的内存空间,造成定时不准确。只有将这些代

码从程序中去掉,才能彻底洗掉他们的嫌疑,使编写者集中精力调试要调试的模块。

?结论:编写程序的好习惯是分模块编写,边写边测试,在通过测试的模

块基础上编写下

一个模块,可以减少程序出现问题的可能性,快速排查与问题相关的模块并定位到程序语句。

对例子程序另外一个需要注意的地方是——作者完全没有写注释。注释是给人看的,编

译器(IDE 环境,例如Keil、ICC AVR 等)和目标CPU(运行该程序的单片机)是完全不看注

释行的,但是注释行能够理清编写者的思路,也方便日后修改维护的人(90%的可能是编写

者自己)。

?结论:注释不是程序,但可以帮助编写者提高编写的正确性,也可以大

大提高程序的可

维护性。建议 C 语言程序注释到函数,一些重要的操作至少要注释;汇编语言程序,至少注

释 70%的语句行,建议一行一注。

三、Debug:

3.1 BUG 无处不在

写程序不出BUG 是每个设计者的追求,但往往事与愿违,就连软件大鳄微软也在天天

写补丁。当然我们的程序规模远不如操作系统那么巨大,但即使是做了多年单片机程序的开

发人员也几乎不可能做到程序一次通过无BUG。

?结论:程序有BUG 是很正常的,要学会找 BUG 的方法。

3.1.1 硬故障和软故障

从表现方式上,故障分为硬故障和软故障两大类。我们先来讲一下什么叫软故障。

比如某个顾客投诉说:我买的电视开不了机了。这就是一个“硬”故障,因为他是不可

以自动恢复的,无论维修人员什么时候上门查看,故障的现象完全一致。

当另一个顾客投诉说:我买的电视有时候喇叭里有噪声。这就是一个“软”故障了,因

为故障的现象不是随时都存在的,当维修人员上门查看时,有可能电视工作得好好的。

软故障是维修人员最头疼的,同时也是最容易引发消费者投诉和纠纷的地方。

从技术的层面来分析,硬故障可以称为“无条件故障”,他们的出现多是由于元器件不

可逆转性的彻底损坏造成,比如保险管烧断了,芯片烧了。这种故障现象明确,容易查找,

只要按照设备的工作条件逐个模块检查就可以发现。

软故障可以称为“条件故障”他们的出现多是由于设计时考虑不周,,工作条件临界(时

序临界、电压临界、信号电平临界、热设计临界等),他们的出现多依赖于特定条件,比如

打开电视 1 小时后出现死机,有可能是热设计不良导致;又比如在晚上8 点左右出现显示扭

曲甚至无法收看,有可能是电源适应性不足导致(晚8 点为用电高峰,电网电压略低)。

?结论:故障分软硬,软故障最难找。软故障多源于设计临界所导致,在一定触发条件下

发生,当条件被破坏时,故障可能消失得无影无踪。

软故障经常误导维修人员。我们来看一个例子。

一款使用 51 单片机的读卡器,操作逻辑加密 IC 卡时经常出现不识卡的故障。市场维修

人员认为是 IC 卡插座接触不良,更换 IC 卡插座后,故障消失,但过段时间后顾客又反映其

不识卡,更换卡座后又好了,几年下来换了一大堆卡座,故障就是从来没有消失过。后来产

品升级换代,开发人员发现软件中对卡的复位时间短于卡片数据手册要求值,修正后不识卡

的故障再也没有出现过。

软故障的误导性来源于对硬故障的经验积累。硬故障因为无需触发条件,人们往往用

尝试——判断——再尝试

(请注意,这行文字在后面蛮重要的,所以我加黑了)

的思维方式查找问题,比如维修完全没有声音和图像的电视机,会尝试更换保险管,如果可

以开机了,那么就判断为保险管烧毁。但是这种思维方法换到处理软故障的时候就行不通了,

因为软故障有出现的条件,更换了某个元件,故障不再出现,并不代表是这个元件引起的。

软件对IC 卡的复位时间过短,是一个设计上的失误,但是通常IC 卡的生产厂家在写数

据手册时,也同样留有余量,例如当数据手册指明复位时间需要5mS 时,当读卡器复位时

间为4mS 时,80%的卡片可能能够成功复位。再者,设计例如读卡器这类低成本简单产品时,

单片机的时钟源很可能是RC 振荡器而非石英晶振,在温度发生变化时,其时钟频率将发生

显著改变(例如5%),这就导致了不识卡的故障在维修人员面前很难表现出来。

当一个维修人员来到现场,“卡座接触不良导致不识卡”按照的经验为用户更换了卡座,

并抽出一张随身携带的测试卡插入读卡器后,凭其“可以识卡”的现象判断自己的判断和维

修手段是正确的,然后到下一个顾客那里去继续加深自己对“卡座接触不良导致不识卡”的

错误认识,并继续循环下去。

现代电子产品的基本模式是软件+硬件,任何人所做的事情都可能存在错误,所以软件

和硬件都有出现问题的可能性,从上面的例子可以看出:在没有分清软硬件故障时盲目下手,

可能将进一步误导自己。从另一个方面看,由于驱动层软件与硬件密切相关,当驱动软件存

在问题,特别是边界性的软故障时,很容易造成误判。

3.1.2 软件和硬件

这是不团结的开发部最容易发生矛盾的地方——当产品遇到BUG 时,硬件开发人员说

是软件引发的,软件开发人员说是硬件造成的。

其实无论软件硬件,寻找BUG 的方法大同小异。对一个开发人员来说,只有同时掌握

了软件和硬件设计技术,才能合理分配软硬件资源,做出最优的方案。上面的案例已经说明,将软件问题误判为硬件问题,只会南辕北辙。

想区分硬件和软件BUG,就要先知道硬件和软件各自的特点。

硬件最大的特点是离散性,跟达芬奇画鸡蛋的故事一样,简单说就是世界上没有两个完

全一样的电阻。硬件设计的重要任务就是让图纸上的数值包容工业化生产可以容忍的误差范围。

软件最大的特点就是一致性好,由同一个HEX 文件烧写出来的单片机,他们所包含的

程序都是一致的。

硬件所引发的问题一般特征是:故障集中表现在某一台或某几台机器,而其他机器根本

没有发生过这种故障;与温度、电压等工作环境密切相关;随着更换某个器件,故障消失。但是需要注意的是,芯片,特别是新取出的芯片,其损坏的概率是很低的(除非设计不当,上一个坏一个)。

软件所引发的问题一般特征是:故障随机表现在所有机器上,或至少绝大部分机器都出

现这种故障;与工作环境关系不大;随着更换备份软件,故障消失。(在软件开发过程中,开发人员一般将备份很多个中间版本的备份软件)

由于单片机系统中,软件和硬件紧密结合,硬件的工作依赖于底

层硬件的驱动,所以上面所说的判断方法仅供大致判断,更多时候应注意

该将硬件和软件看做一个整体。

一个使用外部 E2 存储器的单片机系统,在硬件系统已经开发定型的情况下,分别由 2

人进行软件开发, 1 人在完成整个程序后离职, 2 人使用其所遗留的样机继续进行软件第第维护。维护后发现,将软件下载到新生产出的若干台机器中发现均无法工作,而将软件下载到样机中即可以运行。由于该软件规模较大,开发文档不完善,通读一次需花费很大精力,急需尽快确定是软件问题还是硬件问题,以便查找问题。

这个问题乍一看很像硬件问题,因为在样机上可以正常工作的软件在新硬件上出问题了。

首先初步查找这个问题,发现系统在向 E2 写入某个数据时流程无法完成,导致程序停

止不前(由于原程序设计不当,并未给出出错提示)。可能导致这个故障的现象有:新机器

E2 故障、程序问题。

深入来想这个问题,首先硬件系统已经定型很久,且并没有进行修改;其次,新机器中

每个 E2 存储器都损坏的概率几乎为 0,故从其他方向分析新机器和样机有什么不同。我们

注意到新出厂的 E2 存储器内的所有数据一般均为 0xFF,而样机 E2 中有工作数据,遂怀疑

软件会使用其中的工作数据,但没有做异常处理,所以出现了流程锁定。

验证这个问题,交换样机和新机器的 E2,样机变得无法工作,新机变得可以工作。用

万用烧写器拷贝样机 E2 数据到空白 E2 后安装在新机器上,新机器可以工作。证实了上面推

论的正确性。集中精力寻找该流程所需的 E2 中的工作数据,找到该数据,并修改相应流程,

完整地处理了该 BUG。

?结论:单片机软件和硬件密不可分,查找问题时要两者并重,不可死认一方。

3.2 故障的查找

既然BUG 无法避免,咱就必须练就一身找BUG 的神功。找BUG 的功力没有绝对,正如

前面所说,一个“高手”在对你的具体系统没有任何经验的基础下,DeBug 能力可能远不如

一个亲自编写这个程序的毕业生。

但是一般来说,我们可以总结出一些常用的技巧来加速推理过程。

?结论:Debug 高手和新手间的区别在于,高手知道该如何去找,而新手会迷茫。

3.2.1 故障查找的基本理论

故障查找的基本理论是通过对故障现象的分析推理出故障所在。

现象1

BUG 所在现象2推理能力强

推理能力弱

现象3

现象4

上面的图给出了故障查找的基本模型。我们首先要相信,当一个BUG 发生时,除非是

非常明确的故障(比如看到保险管爆裂烧毁),无论“新手”还是“高手”都不知道这个BUG

是如何发生的,摆在他们面前的是平等的事实——这个BUG 所带来的现象。

现象 1:一台 POS 机,在打印发票时总金额显示为乱码

现象 2:该现象在以管理员身份登录时不会发生

现象 3:该现象仅发生在每天 21 点以后

现象 4:该现象仅发生在当日自动日结报表运行后,该用户将自动日结报表时间设置为

21 点,以管理员身份登录时不运行该程序。

这个案例模拟了一个因为POS 机“自动日结报表”程序模块漏洞导致的发票金额乱码

问题,“现象1”描述了最直白的故障现象,这个现象是最容易发现而且无需任何专业知识

的,但是也是对BUG 分析最无帮助的。现在你相信了,任何“高手”在“现象1”面前都将

束手无策。

“现象2”提供了一个特例,这个点将严重区别出新手和高手,新手的脑袋里一团浆糊:

“管理员登录和发票乱码咋可能有联系呢?”高手将换一种思维方法——拿过一张草稿纸,,开始罗列管理员登录和普通登录间的区别。

“现象3”与“现象2”相似,新手继续浆糊,高手继续找区别。

“现象4”的层次属于真相大白,但是需要积累更多的经验,这种经验可能是通过一群

焦头烂额的程序员围在收银员旁边观察一整晚,突然有人看到屏幕提示“自动日结报表运行中”而灵光闪现发觉的。

其实一个推理能力强的“高手”,用“现象2”已经排除了一大部分程序模块,再利用

“现象3”联想到21 点前后程序运行了什么操作,就很可能已经怀疑到“自动日结报表”

功能上来了。相反,如果新手没有机会在收银员身边发现屏幕提示,这个BUG 的查找可能

会拖上几个月之久。

注意另一个事实:如果一个抽调过来的顶级Debug 高手,连POS 机是什么,“自动日结

报表”是什么都不知道的情况下,最多得到下列结论——该BUG 与管理员登录有关,与特

定时间执行的操作有关。

3.2.2 柯南肯定是找 BUG 的高手

由于目前主要的单片机设计者都是80 后,柯南是谁就不需要我多解释了。不过如果有

一天,柯南愿意一改侦探职业来搞单片机开发的话,可以断定他肯定是个找BUG 的高手。

我们先来看下柯南到底在哪些方面强于那些佩服他的人:

a. 知识面丰富,例如258 集中,知道英国人把警车称为“熊猫”,在57 集中知道升高

外界温度可以加速尸僵的软化,这些都是一般人不知道的知识。

b. 善于注意细节,这个例子就太多了,柯南查看现场的时候从进门的那一刻起就在注

意各种细节,甚至很多罪犯自己不留神说出来的疑点都不会被他放过。例如52 集

中仅凭几个庙里的师兄说有橡皮艇可以出去玩就联想到作案工具。

c.当有提示时迅速联想,做这个工作的多是步美或者小兰,通常是她们无意间说了什

么或玩了什么,引起柯南的联想,找出破案的关键。例如479 集从小兰玩的风车推

出榻榻米可以旋转摆放。

d. 有推理后努力找证据证明,这个太多了。很多时候柯南自己推测到了罪犯的手段,

但是没有找到关键性证据前,不敢说出来,这时候说“破案”只能说是直觉,知道

找到证据,才把毛利放翻后公布答案。

如果把柯南的侦探经验翻译成找BUG 经验的话,就是这样——

a. 知识面丰富,包括硬知识(对所用芯片、开发环境、操作系统等本身的经验)和软

知识(具体到系统本身的特殊点,例如前面POS 机例子中日结报表的信息)

b. 善于注意细节,当一个BUG 放在大家面前时,谁先收集到足够多的细节信息,就意

c.

味着他所掌握的推理资源越多,推理越容易。

当有提示时迅速联想,BUG 经常会一筹莫展,找这时你的大脑里存储了大量的信息,却找不到推理的头绪,这时候就需要最后一点提示来捅破窗户纸,当这种提示(可

能是一个很重要,但是原来忽略了的现象)偶然到来时,你有准备的头脑才能灵光

闪现。

d. 有推理后努力找证据证明,80%的时候,靠着猜和直觉找到了BUG 所在,但是要将

所有的现象关联到这个BUG 上,才算确认,如果其中有任何一个现象无法用BUG

来解释,或者与之矛盾,这个推理都可能是错误的或者不完善的。

?结论:平时就要注意积累。学习软硬件知识,还要熟悉自己的实际应用,包括应用条件,

否则会对放在面前,对推理极有价值的关键现象视而不见。找 BUG 可以用“猜”的方法,但

是“猜”完了要推理到所有的现象上去“验证”。所以我们说“怀疑——否定——再怀疑—

—再否定,知道找到真理所在”(前面所提到的“尝试——判断——再尝试”)是找 BUG 的基

本方法。

3.2.3 以论据支持的方式寻找 BUG

请刚看完上一章节的读者们一定记住:在柯南刚踏入案发现场的时候,他跟其他人一样

是晕的——对犯罪过程一无所知,他与别人的差距出现在整个侦查过程中。

同样,当一个BUG 出现时,在场的新手和“高手”都是一头雾水。随着找BUG 工作的

展开,“高手”做一些有目的的测试,并且在有意和无意中发现一些现象。“高手”将这些现

象加以推理,就可以找出BUG 所在,这些现象就是我们说的“论据”。

?结论:在BUG 面前,新手和高手的初始化状态是一样的,只是高手有意识去找现象用于

分析,新手看着现象发呆罢了。

其实我们前面例举的定时器的例子就说明了新手和高手认识问题的区别——新手在已

经发现BUG 的程序上继续找问题,高手则告诉你,将无用的部分全部屏蔽掉,从调试最核

心的定时器部分开始。

这是一个用 51 单片机从 DS18B20 读取温度值并在 LED 上显示的程序。遇到的 BUG 是,

无论外界温度如何变化,LED 始终显示“00”。

char temp;

main()

{

init_device();

temp = 0;

while(1)

{

temp = get_temp();

cal_temp(temp);

disp(temp);

}

} //Init Timer, IO and Interrupt //修正温度值 //显示温度值

新手在遇到问题的时候可能采用的方法就是发到 BBS 上寻求“高手”的帮助。在场的

高手可能会要求先做一个这样的测试程序:

while(1)

{

temp = get_temp();

cal_temp(temp);

temp = 12;

disp(temp);

}

这样做所想找的论据是——显示函数 disp();是否工作正常,因为 temp = 12;已经对读取

到的温度值做了硬赋值,即使前面的读取函数和修正函数存在问题,也不会影响显示。如果

这个测试使得 LED 正确显示 12,那么可以证明显示函数基本正常,转而去找读取函数和修

正函数的问题;如果仍然显示 00,那么应该首先解决 disp();函数本身的问题,再继续调试。 //修正温度值 //显示温度值

?结论:论据有两种获得方式——寻找和傻等,高手以寻找为主,新手以傻等为主。

当然,即使是高手,也可能遇到束手无策的时候,这时候闲着也是闲着,他可能会做一

些看似不相关的测试,从而发现一些新的论据,从而促使对 BUG 更深的分析。在后面我们

将介绍一些常用的论据寻找方法,帮助大家快速掌握足够支持推理的论据。

3.2.4 以推理的方式确认 BUG

正如我们再 3.1.1 例子中看到的一样,BUG 常常被误判,可以从这个换卡座的例子可以

看出误判所带来的不良后果。很多时候,我们和柯南一样,找到问题关键的时候是靠“灵光

一闪”,带有“猜”的性质,没有把整个 BUD 的来龙去脉想清楚,这就需要我们再“灵光” 过后,再以推理的方式确认 BUG 是否找准了。

一般来说,确认 BUG 找的是否准确可以用下面这些方法:

a. BUG 和现象具有明确的对应关系。

b. 能够清晰地理出从BUG 所在位置出发,直到现象发生的完整线条。

c.所发现的现象中,没有用该BUG 无法解释的现象,或至少没有与之矛盾的现象。

明确的对应关系,是指将改正了的BUG 改回去,现象还能重现。例如我们发现一个LED

数码管显示错误的程序是由于将循环体for(i=0;i<=4;i++)不慎写成了for(i=0;i<=3;i++)导致最后

一个数码管没有显示,那么应该在找到BUG 的根源后故意将i<=4 再改回i<=3,如果<=3 时

必然出错,而<=4 时正确,则说明我们找到的BUG 位置正确,与所观察到的现象是明确对应

的。

在确认BUG 时,不能像找论据那样天马行空,而需要理清条理,一板一眼地说明这个BUG 是如何一步一步引起这个现象的。比如上面这个循环的问题,应该推断出循环少执行了

一次,然后跟着程序流程来清理,说明这少循环的 1 次是如何影响显示效果的。

至于无法解释的现象,例如for 循环是这样编写的:

for(i=0;i

错误写成了i

在某些时候,引起一个现象的BUG 还可能不止一处,当发生无法解释的现象时,一定

不要放松对“不止一个BUG”的怀疑。

3.2.5 随机对随机的方式确认 BUG

这是一种很极端的情况,由于程序引发的软故障现象,随机地出现在产品中,且概率不

高。我们用“猜”的方式似乎找到了问题所在,但是又暂时无法理出从BUG 到现象的完整

路线,这时你可能就需要用随机对随机的方式来处理了。

随机对随机是基于小概率事件难得一见的原则来思考的,例如:

你敲开一个鸡蛋——一个双黄蛋,恭喜你中奖了!

你又敲开了一个鸡蛋,还是双黄蛋,你手气这么好?

你再敲开了一个鸡蛋,还是双黄蛋,昨天买彩票的时候咋没这么好手气?

当你连续敲开了 6 个双黄蛋——赶紧给电视台打电话吧,你要红了!

我确实见过新闻报道连敲 6 个双黄蛋的,但那个已经成为国际新闻,一般来说你不会有

这么好的手气。

某个批量生产中的使用干电池供电的设备,由于进行了一次技术升级而造成偶发性故

障,表现为上电后某个芯片偶然性初始化失败。通过技术人员反复阅读该芯片的数据手册,

发现该芯片的使能引脚是没有内部上下拉的,在单片机复位期间,由于 I/O 处于高阻输入状

态,可能使该使能端悬浮,但是无法将使能端悬浮和初始化失败联系起来,只能知道“输入

端悬浮”是违反设计规则的。

故障现象中,上电初始化失败的概率大约在 1%左右(平均每做 100 次上电,有 1 次失

败,但每 100 次内不一定有 1 次)当加入使该芯片处于非使能状态的下拉电阻后,设计人员

在 1 小时内都没有做出上电初始化失败的现象。

因为故障现象出现的概率很低,这个问题到底解决了没有呢?开发人员也不是很肯定。

为了在短时间内确认 BUG 寻找是否准确,开发人员从生产线找来了 10 台曾经被测出过

上电复位失败现象的“样机”,选取了其中 5 台加装了下拉电阻,记录了产品编号,装回原

样交给生产线测试,要求他们将测出故障现象的样机单独放在一边。

半小时后,5 台没有装下拉电阻的样机被“准确”地筛选了出来。由于生产线并不知道

10 台样机中只有 5 台进行了改装,所以对所有样机的测试强度和认真程度完全一致,排除

了人为因数。在这个前提条件下,5 台改装的样机齐刷刷地“不出问题”是非常小概率的事

件,几乎不可能发生,倒过来说就是——下拉电阻真的解决了这个问题。

在随后的数天里,开发人员找到了上电期间由于该使能端悬浮所引起问题的确实线索。

?结论:随机对随机的方法是一种在查找小概率软故障时用的极端确认方法,需要使用者

对故障的基本特征熟练掌握,明确“小概率事件很少发生”的原理。

其实前面的例子里,我们已经贯穿了“小概率事件很少发生”的思想,例如说新取出的

芯片很少损坏,说找到了BUG 以后再改回去看故障现象是不是随之发生。

3.3 查找故障的常用方法

现在我们已经知道,找BUG 需要现象支持,高手用一些总结出来的方法去尝试寻找现

象,这些方法在90%的情况下都是奏效的,所以我们来总结一下这些方法。

3.3.1 替换法

替换法是最基本的故障查找方法,也是最不需要技术水平的方法。

替换法使用的前提是:

有 2 台以上的整机,且有的整机有故障,但有的整机能正常工作。

比如发现

电脑显示器没

有显示时,马上

换一个显示器

看看有没有显示,如果有,就是刚才的显示A

C

B A

C

B

器故障;如果也

没有,就可能是电脑主机故障;如果换下来的显示器在其他电脑上有显示,而新换来的显示器变得没有图像了,那么更加可能是主机坏了。

例如在上面的图中,每个系统由ABC 三个部分组成,任何一个部分故障都将造成系统

功能异常,带红框的 A 部分是故障系统,当左右两个系统交换 A 部分后,原本存在功能异

常的右侧系统恢复正常,原本正常工作的左系统变得异常,且现象和原来的右系统一样,这

就可以怀疑,是否是 A 部分出现了异常。

进一步确认这个问题,将刚才所做的交换动作撤销,左系统变得正常,右系统变回原来

的样子,这就符合了我们“故障现象随着该部分迁移”的判据,故障确实源于 A 部分。

替换法即可用于查找硬故障,也可以用于查找软故障,但在使用的时候必须观察足够久,

以便确保引发故障的条件出现(例如对开机 1 小时后显示器没有显示的电脑,更换一个显示

器后应该观察至少 1 个小时)。

?结论:当一个系统由若干个部分组成时,寻找故障的时候可以将怀疑引

起故障的部分更

换到其他系统上,通过观察故障现象是否随该部分迁移来判断 BUG 所在。

对替换法的理解不应僵化在对已有系统的硬件问题查找上,例如当我们改动了若干个软

件模块,但没有改动这些模块的输入输出接口,程序运行却不正常了。此时,可以从备份程

序中,将这些改动过的程序模块一一替换回“老样子”,从现象的改变来帮助我们快速判断

是什么改动带来了异常。

3.3.2 模块隔离法

模块隔离法的理论依据是程序的模块化编写,每个模块有明确的功能分工,有明晰的输

入输出接口。模块隔离法就是出现问题的模块单独出来调试,可以让调试的精力集中,目标

明确,提高调试的效率。

某网友提问,自己做的 ARM 系统通过 U 盘进行软件升级,但是最后写到 FLASH 中的程序

代码有错,他已经确认过从 U 盘读出的文件是正确的,实在找不到原因,所以来论坛求助。

分析这个问题,完成软件升级有 2 个步骤——从U 盘读出和写入到FLASH。FLASH 是不

会“挑食”的,不管写入的数据是什么,都将照抄照考。既然作者已经确定了从U 盘读出

的文件是正确的,那么问题很可能就在FLASH 写上了。

再者,既然写什么数据进去都可以,那么跳过U 盘读出部分,自己用测试程序生成一

个自加的序列写入FLASH,用开发工具直接读出FLASH 中的数据,就很容易检查写入部分是

否正确了,这比起面对扑朔迷离的程序代码检查写入问题要简单得多了。

?结论:将精力集中在需要查找的部分,排除其他模块的影响,用最简单

的方法去判断,

这就是模块隔离法的价值所在。

使用模块隔离法时不能忘记模块间是相互联系的,当被隔离

出的模块单独测试无法发现问题时,就要考虑是否是模块间的相注意互影响导致了故障现象了。极端地,当模块内和模块间都存在问

题时,这种怀疑精神更为重要!

3.3.3 出入口检查和变量跟踪

出入口检查的基础也是程序模块化,该方法的基本理论是——模块设计是正确的,每个模块又是正常工作的,那么系统就应该正常工作,反之,肯定能找到不符合设计要求的位置。这句话倒过来说就是——只要检查每个模块的出入口上是否正常就OK 了。

3.3.2 中的例子本身就是一个出入口检查的例子,这个作者还是有检查的意识来判断“从

U 盘读出的文件是正确的”,这也是我们在论坛上答问题时初学者常犯的错误。比如在上面的例子中,如果作者问的是“写入FLASH 的数据就是不对,请问怎么回事”,那么回帖必然是“能确认读出的文件是正确的么?”

出入口检查,使用的方法多种多样——

对纯的计算类模块,最简单的方法是用IDE 提供的软件仿真功能,直接输入入口数据,

在出口处设断点检查。

当系统有显示、按键时,可以通过这些资源写测试程序,控制程序流向和执行条件,输

出变量数据,还可以在程序中设置测试代码输出来跟踪程序的运行流程。

3.3.4 区分时间和空间相关性

我们前面已经说过,程序分为顺序程序和含有中断的程序两大类。顺序程序在BUG 查

找上相对简单,因为各模块的前后衔接顺序清楚明了;含有中断的程序在BUG 查找的时候

需要多动一个脑筋——BUG 发生在时间上还是空间上?

有很多时候,在含有中断的程序中,我们把各个模块独立开来测试,他们的运行都正确,

当组装到一起后,就是要出问题,这时候就应该考虑是否是时间上存在问题了。我们来举一个简单的例子说明什么时程序的时间相关性

有这样一个串口接收程序,作者的原意是建立单片机系统和上位机之间的交互通道,在

单片机向上位机发送数据包的同时,如果收到上位机新发来的数据包,通过发送 0xEE 向上位机标明单片机正在忙碌,请求上位机暂停发送。

unsigned char flag_uart_tx_ing=0;//串口发送中标志

_isr_uart_rec()//串口接收数据包中断程序

{

if(flag_uart_tx_ing)

uart_byte_send(0xEE);

else

......

}

void uart_send(unsigned char *p)

{

...... //数据包接收和处理

//串口数据包发送程序 uart_tx_buffer = *p;

p++;

while(!uart_tx_i); //等待串口发送完成中断标志

uart_tx_i = 0;

......

}

void uart_byte_send(unsigned char a)

{ //串口发送单个字节程序 //清除串口发送完成中断标志

uart_tx_buffer = a;

while(!uart_tx_i);//等待串口发送完成中断标志

uart_tx_i = 0;//清除串口发送完成中断标志

}

这个代码将导致当机。

当单片机正在执行“串口数据包发送程序”过程中收到上位机来的数据包,且不说这将 导致正在发送的数据包中断,而且可能导致当机的严重后果。很明显这个程序的发送基于查 询方式进行,如果 uart_tx_i 标志不为 1,程序将始终在 while 循环处死等。对顺序程序而 言,没有其他程序流程干扰的情况下,在填充了串口发送缓冲区 uart_tx_buffer 后,数据 最终会被发送完毕,该标志置 1,但在有接收中断内发送 0xEE 的条件存在时,uart_tx_i

标志可能被发送 0xEE 程序“抢先” 0,清 从而导致中断外的发送程序永远等不到该标志置 1, 造成死机。

如果不从时间上并行的方式思考问题,而是单独测试每个程序模块,很难联想到标志被 意外清除这个问题。这就是程序的时间相关性。

至于空间相关性就好理解了:顺序运行的程序间,程序的运行条件被改变的情况就是程 序的空间相关性。比如有一个全局变量 a ,初始化值为 0,本来是留给第二段程序使用的, 但是第一段程序误将其赋值为 1,那么第二段程序只要使用了初始化值 0,就必将出错。 ?结论:发生时间相关性 BUG,其分开测试正确,合并测试出错的特性往往让初学者抓狂, 在调试含有中断的程序时,一定要多条思路,怀疑程序的时间相关性。

严格来说,一切出现的 BUG 都是由于没有遵守一些基本规则而造成(虽然有时候是粗心 和笔误),常见的例如:

【a】【b】【c】中断现场保护有遗漏,常见于汇编编写的程序,例如PIC16 单片机的DPTR 间址指针,用 C 语言编程时,中断内外使用了相同的全局变量等。

使用了临界资源而没有采取任何保护措施,例如前面串口的例子中,发送完成中断标志就是一个临界资源。

硬件上有严格时序要求,软件虽实现了算法,却没有配上时序的情况,例如打印头控制。

找时间相关性BUG 可以从两个方向入手——正向清理自己在上面 3 个方面有没有失误,反面通过“时间整垫”的方式来寻找更多的现象支持推理。

所谓“时间整垫”是指用没有(或尽量没有)空间相关性的代码插入到被测代码中,以

测试所发生的故障现象是否发生改变的方法。这里又可以将时间相关性程序区分为两类:

【a】【b】自相关类时间相关性,与外部事件无关的时间相关性,程序不等待某个外部中

断或按键等外部指令,例如由内部相关的定时器之类触发中断。

外部相关类时间相关性,与外中断或按键等人机交互环节相关,例如打印头同步信号控制的打印针动作。

对于自相关类时间相关性,由于程序执行和定时器运行实质上都是由主时钟(通常是晶

体)驱动的,所以定时器发生中断的时间点实际上是确定的,通过“时间整垫”可以方便地

改变中断发生的位置。

func_a();

delay_ms(1);

func_b();

通过在出现问题的a、b 两个函数之间加入延时函数,“错开”发生BUG 的位置,如果

BUG 消失或者现象发生变化,那么就要注意是否是时间相关性问题,并且可以进一步确定

BUG 的位置。

对于外部相关类时间相关性,由于外部事件和程序运行不可能精确同步,故障现象也往

往是“偶发性”的。这种程序可以通过时间整垫的方式进行测试,但效果不佳,这时可以考

虑尽量排除相关因素来缩小查找范围。

//时间整垫

?结论:因为只有在实际运行时才能表现出来,时间相关性BUG 比较难于查找,

这也就是

我们建议程序在实际环境中调试,而不是仿真环境下调试的原因之一。遵守基本规则编写程

序是避免时间相关性 BUG 甚至所有 BUG 的根源。多观察现象,积累判断依据是找时间相关性

黑盒测试实验报告

实验报告书 课程名称:软件测试 实验题目:黑盒测试报告 专业:教育技术学 班级:教技142 学生姓名:安卓 指导老师:郭小雪 所属学期:2017-2018学年第二学期

一、引言 1.1目的 测试报告为三角形问题和找零钱最佳组合问题项目的黑盒测试报告,目的在于总结测试阶段的测试以及分析测试结果。 实验环境 在Windows 2000(SP2) 或Windows XP 操作系统上,使用C++语言,工具作为开发环境(IDE) 实验要求 1.根据给出的程序分别使用等价类划分法、边界值分析法、判定表 方法、因果图法、正交试验法、功能图法、错误推测法来设计相应的测试用例。 2.输入数据进行测试,填写测试用例。 二、实验原理 黑盒测试原理:已知产品的功能设计规格,可以进行测试证明每个实现了的功能是否符合要求。软件的黑盒测试意味着测试要在软件的接口处进行。这种方法是把测试对象看作一个黑盒子,测试人员完全不考虑程序内部的逻辑结构和内部特性,只依据程序的需求规格说明书,检查程序的功能是否符合它的功能说明。因此黑盒测试又叫功能测试。 从理论上讲,黑盒测试只有采用穷举输入测试,把所有可能的输入都

作为测试情况考虑,才能查出程序中所有的错误。实际上测试情况有无穷多个,人们不仅要测试所有合法的输入,而且还要对那些不合法但可能的输入进行测试。这样看来,完全测试是不可能的,所以我们要进行有针对性的测试,通过制定测试案例指导测试的实施,保证软件测试有组织、按步骤,以及有计划地进行。黑盒测试行为必须能够加以量化,才能真正保证软件质量,而测试用例就是将测试行为具体量化的方法之一。具体的黑盒测试用例设计方法包括等价类划分法、边界值分析法、错误推测法、因果图法、判定表驱动法、正交试验设计法、功能图法等。 等价类划分的办法是把程序的输入域划分成若干部分(子集),然后从每个部分中选取少数代表性数据作为测试用例。每一类的代表性数据在测试中的作用等价于这一类中的其他值。该方法是一种重要的,常用的黑盒测试用例设计方法。 1 划分等价类 划分等价类:等价类是指某个输入域的子集合。在该子集合中,各个输入数据对于揭露程序中的错误都是等效的,并合理地假定:测试某等价类的代表值就等于对这一类其它值的测试。因此,可以把全部输入数据合理划分为若干等价类,在每一个等价类中取一个数据作为测试的输入条件,就可以用少量代表性的测试数据。取得较好的测试结果。等价类划分可有两种不同的情况:有效等价类和无效等价类。 有效等价类:是指对于程序的规格说明来说是合理的,有意义的输入数据构成的集合。利用有效等价类可检验程序是否实现了规格说明中

软件测试实验一

内蒙古工业大学信息工程学院实验报告 课程名称:软件测试 实验名称:“爱米云网盘”黑盒测试设计用例 实验类型:验证性■综合性□设计性□ 实验室名称:软件实验室 班级:软件12-2 学号: 姓名:张贺组别: 同组人:成绩: 实验日期: 2015年6月14日 实验报告成绩:指导教师审核(签名):年月日 实验报告 一.实验目的 ①理解黑盒测试的概念。 ②理解测试用例的重要性。 ③掌握黑盒测试技术设计测试用例的方法。 二.实验环境 Windows7操作系统爱米云服务器爱米云客户端 三.实验内容 应用黑盒测试技术,对“爱米云网盘客户端”登录功能进行测试用例设计。四.实验要求 ①根据《软件需求规格说明书》了解登录功能的测试需求。 ②重点针对账号、密码和登录流程进行测试用例设计。 ③应用黑盒测试技术进行测试用例设计,写出等价类表、边界值分析结果、用

例场景图等测试设计文档。 五.实验步骤 1、通读“爱米云网盘”的《软件需求规格说明书》,重点阅读登录功能的需求。 登陆时,用户名由3~20个字母、数字或“_”组成,密码由6~16个字符组成,不能是8位以下纯数字。登陆时,可以设置为“保存密码”或“自动登陆”。登陆成功的账号记录在账号输入框和下拉列表中,下拉列表最多记录5个账号。下拉列表中可以删除历史账号。登陆成功后可从主窗口菜单中,进行切换账号和修改密码。 2、针对登录功能,应用适当的黑盒测试技术的等价类划分法、边界值分析法、场景法等 测试方法,进行测试用例设计,列出每个测试子项对应的等价类表、边界值、用例场景图等。 账号和密码等价类划分法 测试点 用户名由3~20个字母、数字或“_”组成,密码由6~16个字符 下拉列表等价类划分法 账号和密码边界值分析法

调节阀操作说明书

气缸直行程控制阀 使用说明书 成都欧浦特控制阀门有限公司 ChengDu OPTIMUX Control Valves Co.,Ltd

一、 概述 OPGL 气缸直行程控制阀是成都欧浦特控制阀门有限公司引进美国先进技术,集多年成功的专业制造经验而生产的产品。该系列控制阀采用高刚性、大推力的气缸式执行机构,气源压力可达1.0MPa,气缸强大的推力可克服很高的介质流体压力。(OPGL 电动控制阀所配用的电动执行机构,根据用户要求确定)。自动对中心无螺纹连接卡入式阀座,使维修工作轻而易举,简单快捷。粗壮的阀杆及与其一体式的阀芯,能够承受高压差而阀芯不致脱落。另外它还综合了传统的单座控制阀、双座控制阀和笼式控制阀的优点,泄漏量小、稳定性好、允许压差高,使OPGL 气缸直行程控制阀充分显示出其独有的特点,它代表了国际九十年代末控制阀最先进的主流,我们相信广大客户在使用OPGL 气缸直行程控制阀时很快会发现其越来越多的优点。 在安装使用和维护OPGL气缸直行程控制阀前阅读本说明书将会给你很大的帮助。安装、操作或维修阀门时,使用和维修人员一定要充分地阅读安装说明,了解它的结构特点和拆装方法步骤,才能保证其安全运行。 OPGL 电动控制阀的用户请阅读本说明书和相应配套的电动执行机构的说明书。 OPGL 气缸直行程控制阀国内独家生产,具有国家发明专利的高科技产品。 二、 结构特点 1、OPGL 气缸直行程控制阀技术先进,性能卓越。具有调节、切断、切断压差大、泄漏量小等全部功能,特别适用于允许泄漏量小、而阀前后压差较大的自控系统,可同时替代薄膜式单座阀、双座阀及笼式阀。 2、标准化、模块化设计,库存备件少、维修更方便。 3、带弹簧的双作用气缸式执行机构,材质为压铸铝合金,体积小、重量轻,配双作用阀门定位器,动作灵敏、定位精度高,活塞的上部和下部同时接受纯净的压缩空气,气缸内部免受腐蚀。气源压力最高可达1.0MPa,推力大、行程速度快、使用寿命长。气源故障时弹簧可使阀门自动关闭或打开,保证了系统的安全。特殊设计的气缸卡环结构可使气关、气开方式在现场很方便地更换。同时具备了单作用执行机构和双作用执行机构的功能和优点。 4、自动调准中心插入式无螺纹连接阀座,通过阀盖和阀笼固定在阀体内,易于拆出、维修方便,控制阀可以在线检修,阀芯阀座密封面的优化设计和超精加工无需研磨就可以达到极小的泄漏量。 5、阀芯和阀杆为一体式,阀杆较传统类型阀杆粗3~4倍,可承受高压差并消除了阀芯脱落、阀杆弯曲断裂的事故隐患。 6、双顶式导向结构,阀芯与阀笼无接触,彻底消除了阀笼导向所引起的阀芯擦伤、阀笼卡死等阀门应用问题。 7、阀笼有多种设计:分别用于一般工况和高温高压差的严酷工况。如:消除气蚀型、降噪型,保护阀芯和阀体免受气蚀的损坏,大幅度降低噪音。 8、维修简单、快捷、经济,阀体不必从管线上拆下来,只需拧下阀盖法兰上的螺母,阀盖、阀芯、阀座零件就可很方便的依次取出检查,反之亦然。

软件测试实验报告(测试计划+黑盒测试+白盒测试)

河北民族师范学院 软件测试课程设计报告 题目:NextDate函数 姓名: 班级: 学号: 指导老师: 2014.10.9 目录 第1章软件测试的概念和设计要求 (3) 1.1 测试目的 (3) 1.2 测试选题 (4) 1.3测试人员 (4) 1.4测试方法 (4) 1.5 测试资料及参考书 (4) 1.6关于黑盒测试 (4) 1.7 关于白盒测试 (5) 1.8、黑盒测试与白盒测试的比较 (6) 1.9 软件测试过程 (6) 1.10数据整理 (7) 第2章NextDate函数问题 (8) 2.1NextDate函数的黑盒测试 (8) 2.1.1.问题描述: (8) 2.1.2.程序代码(开发环境:Windowsxp xp、java): (8) 2.1.3.测试方法 (9) 2.1.4.测试用例设计 (9)

2-2NextDate函数的白盒测试 (11) 2.2.1核心程序代码 (11) 2.2.2程序流程图 (12) 2.2.3 测试用例 (12) 2.2.4程序控制流图 (14) 设计心得与体会 (14) 第1章软件测试的概念和设计要求 1.1 测试目的 1.练习和掌握软件测试管理的一般过程与步骤; 2.掌握测试管理的人工过程和能够通过相关管理软件实现以下工作: a)配置软件资产信息、软件需求、软件模型和缺陷数据库; b)创建和管理多个测试组和用户; c)配置测试环境、编写详细测试计划、安排测试进度; d)设计测试脚本、测试用例; e)实施测试、执行测试和评估测试。 1.2 测试选题 NextDate函数; 1.3测试人员 张@@:软件测试计划及相关资料的编写与收集。 李@@:对特定问题编写程序代码,并对其进行黑盒测试。 王@@:对特定问题编写程序代码,并对其进行白盒测试。 1.4测试方法 对于选题,使用黑盒测试技术,测试内容包括等价类划分测试、边界值分析测试、决策表方法使用。 使用白盒测试技术,测试内容包括语句覆盖测试、分支覆盖测试、条件覆盖测试、分支/条件覆盖测试、条件组合覆盖测试及基本路径测试。

实验3、黑盒测试:决策表测试方法

20 15 — 20 16 学年第 2 学期 软件测试技术课程 实验报告 学院:计算机科学技术 专业:软件工程 班级:软件二班 姓名:吴德宁 学号:041340217 任课教师:刘玉宝

实验日期:2016年 5 月 17 日实验题目实验3、黑盒测试:决策表测试方法 实验目的 1、掌握决策表的概念 2、掌握决策表测试用例设计法。 实验内容 1、对NextDate问题运用决策表法设计测试用例,并执行测试,撰写实验报告。 NextDate (int month, int day, int year)函数规定:输入三个整数:month、day 和year,函数的输出为输入日期后一天的日期。例如,输入为2006年3月7日,则函数的输出为2006年3月8日,year满足1920≤year≤2050。 实验步骤: 1)构造决策表 ●M1={月份:30天/月}, M2={月份: 31天/月,12月除外}, M3={月份: 12月},M4={月份: 2月} ●D1={日期:1<=日<=27}, D2={日期:日=28}, D3={日期:日=29} , D4={日期:日=30}, D5={日期:日=31} ●Y1={年:闰年},Y2={年:平年} 注:二月:平年28天,闰年29天 条件桩: ●C1:月份在{M1,M2,M3,M4}中之一 ●C2:日期在{D1,D2,D3,D4 ,D5}中之一 ●C3:年在{Y1,Y2}中之一 动作桩: ●A1:不可能 ●A2:日期增1 ●A3:日期复位(置1) ●A4:月份增1 ●A5:月份复位(置1) ●A6:年增1 1 2 3 4 5 6 7 8 9 10 C1:月M1 M1 M1 M1 M1 M2 M2 M2 M2 M2

黑盒测试软件测试实验报告2

软件测试与质量课程实验报告实验2:黑盒测试法实验

缺席:扣10分实验报告雷同:扣10分实验结果填写不完整:扣1 – 10分其他情况:扣分<=5分总扣分不能大于10分 参考代码如下: (1)程序参考答案: #include double main() { int hours; double payment,wage; wage=20; cout<<"please input hours:"; cin>>hours; if(hours>=0&&hours<=168){ if (hours<40) payment=hours*wage ; else if ((hours>=40) && (hours<=50)) payment=40*wage+(hours-40)*1.5*wage; else if (hours>50) payment=40*wage+10*1.5*wage+(hours-50)*3*wage; cout<<"The final payment are:"< void main() { int year; int month,maxmonth=12; int day,maxday; printf("请输入年份:(1000~3000)"); scanf("%d",&year); if(year<1000 || year>3000) { printf("输入错误!请从新输入!\n");

软件测试黑盒测试实验

实验报告 课程名称软件测试 专业 班级 学号 姓名 指导教师

2018年6 月7日 实验四黑盒测试 等价类划分、边界值分析、决策表方法 一、问题描述:完成一段程序,要求实现这样的功能。输入三个整数a,b,c,分别作为三角形的三条边,取值范围为1-100,判断由三条边构成的三角形类型为等边三角形、等腰三角形、一般三角形以及不构成三角形。判断结果打印输出。 程序代码(开发环境:Windows7、Eclipse): import java.util.Scanner; public class Triangle { public static void main(String[] args) { double a, b, c; Scanner input = new Scanner(System.in); System.out.println("输入三角形的三边:"); a = input.nextDouble(); b = input.nextDouble(); c = input.nextDouble(); input.close(); if (a > 0 && b > 0 && c > 0) { if (a + b > c && a + c > b && b + c > a) { System.out.println("能构成三角形."); if (a * a + b * b == c * c || a * a + c * c == b * b || b * b + c * c == a * a) { if (a == b || a == c || b == c) { System.out.println("为等腰直角三角形."); } else { System.out.println("一般直角三角形."); } } else if (a == b && b == c && a == c) { System.out.println("为等边三角形."); } else if ((a == b && a != c) || (a == c && a != b) || (b == c && a != c)) { System.out.println("为等腰三角形."); } else { System.out.println("为一般三角形."); }

白盒测试和黑盒测试实验报告

软件质量保证与测试 实验指导 计算机工程学院

测试环境配置 1.setting Junit (1) start Eclipse Select windows-preferences-java-build path –class path variables (2) click new, the figure of new variable entry is shown. (3) name JUNIT_LIB

select file-选择JUnit 插件所对应的JAR文件所在地,在Eclipse的安装目录的plugins目录中 2.JUNIT的组成框架 其中,junit.framework 和junit.runner是两个核心包。 junit.framework 负责整个测试对象的框架 junit.runner 负责测试驱动 Junit的框架又可分为: A、被测试的对象。 B、对测试目标进行测试的方法与过程集合,可称为测试用例(TestCase)。

C、测试用例的集合,可容纳多个测试用例(TestCase),将其称作测试包(TestSuite)。 D、测试结果的描述与记录。(TestResult) 。 E、每一个测试方法所发生的与预期不一致状况的描述,称其测试失败元素(TestFailure) F、JUnit Framework中的出错异常(AssertionFailedError)。 JUnit框架是一个典型的Composite模式:TestSuite可以容纳任何派生自Test 的对象;当调用TestSuite对象的run()方法是,会遍历自己容纳的对象,逐个调用它们的run()方法。 3.JUnit中常用的接口和类 Test接口——运行测试和收集测试结果 Test接口使用了Composite设计模式,是单独测试用例(TestCase),聚合测试模式(TestSuite)及测试扩展(TestDecorator)的共同接口。 它的public int countTestCases()方法,它来统计这次测试有多少个TestCase,另外一个方法就是public void run(TestResult ),TestResult是实例接受测试结果,run方法执行本次测试。 TestCase抽象类——定义测试中固定方法 TestCase是Test接口的抽象实现,(不能被实例化,只能被继承)其构造函数TestCase(string name)根据输入的测试名称name创建一个测试实例。由于每一个TestCase在创建时都要有一个名称,若某测试失败了,便可识别出是哪个测试失败。 TestCase类中包含的setUp()、tearDown()方法。setUp()方法集中初始化测试所需的所有变量和实例,并且在依次调用测试类中的每个测试方法之前再次执行setUp()方法。tearDown()方法则是在每个测试方法之后,释放测试程序方法中引用的变量和实例。 开发人员编写测试用例时,只需继承TestCase,来完成run方法即可,然后JUnit获得测试用例,执行它的run方法,把测试结果记录在TestResult之中。 Assert静态类——一系列断言方法的集合 Assert包含了一组静态的测试方法,用于期望值和实际值比对是否正确,即测试失败,Assert类就会抛出一个AssertionFailedError异常,JUnit测试框架将

软件测试——实验1

淮海工学院(计算机工程学院)课内实验报告实验名称:黑盒测试 专业名称:软件工程 班级:Z软件161 姓名:陈真杰 学号:2018140539 指导教师:陈艳艳 实验日期:2019年3月13

一、实验目的与环境 1.实验目的: (1)理解黑盒测试的含义以及基本的测试方法。 (2)采用等价类划分法设计测试用例。 (3)掌握用等价类划分法设计测试用例的方法。 (4)掌握用因果图设计测试用例的方法。 (5)掌握用边界值分析法设计测试用例的方法。 2.实验环境:C语言、Java语言、Python语言等。 二、实验内容 1.三角形问题:输入3个整数a、b、c,分别作为三角形的3条边,通过程序判断由 3条边构成的三角形的类型为等边三角形、等腰三角形、一般三角形或者3条边不构成三角形。 2.现有一个学生标准化考试批阅试卷、产生成绩报告的程序。其规格说明为:程序的 输入文件有80个字符的记录组成,分为试题部分和学生答卷部分,具体内容如图所示。 试题部分包括如下内容: (1)标题。这一组只有一个记录,其内容为输出成绩报告的名字。 (2)标准答案。每个记录在第80个字符处标以数字2。第一个记录的第1~3个字符为“试题数”,用于标示题目编号;第10~59个字符给出第1~50题的答案,以此类推。 学生答卷部分包括内容:每个记录的第80个字符均为数字3。第1~9个字符给出学号,第10~59字符给出第1至第50题的答案,以此类推。 程序的输出有4个报告: (1)按学号排列的成绩单,列出每个学生的成绩、名次。 (2)按学生成绩排序的成绩单。 (3)平均分数及标准偏差的报告。 (4)试题分析报告。按试题号排序,列出各题学生答对的百分比。

调节阀手册

调节阀手册第一章概述 O.P.小洛维特 在现代化工厂的自动控制中,调节阀起着十分重要的作用,这些工厂的生产取决于流动着的液体和气体的正确分配和控制。这些控制无论是能量的交换、压力的降低或者是简单的容器加料,都需要靠某些最终控制元件去完成。最终控制元件可以认为是自动控制的“体力”。在调节器的低能量级和执行流动流体控制所需的高能级功能之间,最终控制元件完成了必要的功率放大作用。 调节阀是最终控制元件的最广泛使用的型式。其他的最终控制元件包括计量泵、调节挡板和百叶窗式挡板(一种蝶阀的变型)、可变斜度的风扇叶片、电流调节装置以及不同 于阀门的电动机定位装置。 尽管调节阀得到广泛的使用,调节系统中的其它单元大概都没有像它那样少的维护工作量。在许多系统中,调节阀经受的工作条件如温度、压力、腐蚀和污染都要比其它部件更为严重,然而,当它控制工艺流体的流动时,它必须令人满意地运行及最少的维修量。 调节阀在管道中起可变阻力的作用。它改变工艺流体的紊流度或者在层流情况下提供一个压力降,压力降是由改变阀门阻力或"摩擦"所引起的。这一压力降低过程通常称为“节流”。对于气体,它接近于等温绝热状态,偏差取决于气体的非理想程度(焦耳一汤姆逊效应)。在液体的情况下,压力则为紊流或粘滞摩擦所消耗,这两种情况都把压力转 化为热能,导致温度略为升高。 常见的控制回路包括三个主要部分,第一部分是敏感元件,它通常是一个变送器。它是一个能够用来测量被调工艺参数的装置,这类参数如压力、液位或温度。变送器的输出被送到调节仪表一一调节器,它确定并测量给定值或期望值与工艺参数的实际值之间的偏差,一个接一个地把校正信号送出给最终控制元件一一调节阀。阀门改奕了流体的流量,使工艺参数达到了期望值。 在气动调节系统中,调节器输出的气动信号可以直接驱动弹簧-薄膜式执行机构或者活塞式执行机构,使阀门动作、在这种情况下,确定阀位所需的能量是由压缩空气提供的,压缩空气应当在室外的设备中加以干燥,以防止冻结,并应净化和过滤。 当一个气动调节阀和电动调节器配套使用时,可采用电-气阀门定位器或电-气转换器。压缩空气的供气系统可以和用于全气动的调节系统一样来考虑。 在调节理论的术语中,调节阀既有静态特性,又有动态特性,因而它影响整个控制回路成败。静态特性或增益项是阀的流量特性,它取决于阀门的尺寸、阀芯和阀座的组合结构、执行机构的类型、阀门定位器、阀前和阀后的压力以及流体的性质。第5章中将详细地介绍这些内容。 动态特性是由执行机构或阀门定位器-执行机构组合决定的。对于较慢的生产过程,如温度控制或液位控制,阀的动态特性在可控性方面一般不是限制因素。对于较快的系统,

软件测试实验报告一

广东*融学院实验报告 课程名称:软件测试 」、实验目的及要求 1、理解测试用例的重要性。 2、熟练掌握等价类划分、边界值方法、决策表和因果图法设计测试用例。 二、实验环境及相关情况(包含使用软件、实验设备、主要仪器及材料等) 1. 使用软件:装有QTP功能测试软件 2 .实验设备:装有Windows的联网的个人计算机 三、实验内容及步骤(包含简要的实验步骤流程) 1、实验题目:登陆框测试 在各种输入条件下,测试程序的登录对话框功能。 用户名和密码的规格说明书如下:(密码规则同用户名规则。) 用户名长度为6至10位(含6位和10 位); 用户名由字符(a-z、A-Z)和数字(0-9)组成; 不能为空、空格和特殊字符。 要求:按照规格说明书,分别用等价类划分和边界值方法设计测试用例。 步骤:(1)分析规格说明书,确定输入条件、输出条件的有效等价类、无效等价类以及各个边界条件;(2)第二步:填表格并编号;(3)第三步:设计测试用例;(4)第四步:执行测试用例。 2、员工薪制冋题。 (1)年薪制员工:严重过失,扣年终风险金的4%,过失,扣年终风险金的2%。 (2)非年薪制员工:严重过失,扣月薪资的8%,过失,扣月薪资的4%。 步骤:(1)分析程序的规格说明,列出原因和结果;(2)找出原因与结果的因果关系、原因与原因之间的约束关系,画出因果图;(3)将因果图转化成决策表;(4)根据决策表,设计测试用例的输入数据和预期输出。

四、实验结果(包括程序或图表、结论陈述、数据记录及分析等,可附页) 等价类划分方法: 五、实验总结(包括心得体会、问题回答及实验改进意见,可附页) 通过本次实验,我理解了测试用例的重要性。熟练掌握了等价类划分、边界值方法、决策表和因果图法设计测试用例。 六、教师评语 1、完成所有规定的实验内容,实验步骤正确,结果正确; 2、完成绝大部分规定的实验内容,实验步骤正确,结果正确; 3、完成大部分规定的实验内容,实验步骤正确,结果正确; 4、基本完成规定的实验内容,实验步骤基本正确,所完成的结果基本正确; 5、未能很好地完成规定的实验内容或实验步骤不正确或结果不正确。 评定等级: 签名:

软件测试实验报告

本科实验报告 课程名称:软件测试技术 实验项目:软件测试技术试验实验地点:实验楼211 专业班级:软件工程学号: 学生姓名:戴超 指导教师:兰方鹏 2015年10月7 日

太原理工大学学生实验报告

一、实验目的和要求 (1)熟练掌握白盒测试方法中的逻辑覆盖和路径覆盖方法。 (2)通过实验掌握逻辑覆盖测试的测试用例设计,掌握程序流图的绘制。 (3)运用所学理论,完成实验研究的基本训练过程。 二、实验内容和原理 测试以下程序段 void dowork(int x,int y,int z) { (1)int k=0,j=0; (2)if((x>0)&&(z<10)) (3){ (4)k=x*y-1; (5)j=sqrt(k); (6)} (7)if((x==4)||(y>5)) (8)j=x*y+10; (9)j=j%3; (10)} 三、主要仪器设备

一、实验目的和要求 (1)熟练掌握黑盒测试方法中的等价类测试方法和边界值测试方法。 (2)通过实验掌握如何应用黑盒测试用例。 (3)运用所学理论,完成实验研究的基本训练过程。 二、实验内容和原理 (1)用你熟悉的语言编写一个判断三角形问题的程序。 要求:读入代表三角形边长的三个整数,判断它们能否组成三角形。如果能够,则输出三角形是等边、等腰或者一般三角形的识别信息;如果不能构成三角形,则输出相应提示信息。 (2)使用等价类方法和边界值方法设计测试用例。 三、主要仪器设备 四、操作方法与实验步骤 (1)先用等价类和边界值方法设计测试用例,然后用百合法进行检验和补充。 (2)判断三角形问题的程序流程图和程序流图如图1和图2所示。用你熟悉的语言编写源程序。 (3)使用等价类方法设计测试用例,并填写表2 和表3。

阀门使用说明书

阀门安装使用说明书 1、阀门的安装及拆卸的注意事项 1.1维护保养和安装使用注意要点 一).阀门应放在干燥通风的室内,通径两端须密封防尘; 二).长期存放应定期检查,并在加工表面上涂油,防止锈蚀; 三).阀门安装前应仔细核对标志是否与使用要求相符; 四).安装时应清洁内腔和密封面,检查填料是否压紧,连接螺栓是否均匀拧紧; 五).阀门应按照允许的工作位置安装,但须注意检修和操作的方便; 1.2其他注意事项: 1)阀门一般应在管路安装之前定位。配管要自然,位置不对不能硬扳,以免留下预应力; 2)低温阀门在定位之前应尽量在冷态下(如在液氮中)做启闭试验,要求灵活无卡壳现象; 3)液体阀应配置成阀杆与水平成10°倾斜角,避免液体顺着阀杆流出,冷损增加;更主要的是要避免液体触及填料密封面,使之冷硬而失去密封作用,产生泄漏; 4)安全阀的连接处应有弯头,避免直接冲击阀门;另外要保证安全阀不结霜,以免工作时失效; 5)截止阀的安装应使介质流向与阀体上标示的箭头一致,使阀门关闭时压力加在阀顶的锥体上,而填料不受负荷。但对不经常启闭而又需要严格保证在关闭状态下不漏的阀门(如加温阀),可有意识地反装,以借助介质压力使之紧闭; 6)大规格的闸阀、气动调节阀应该竖装,以免因阀芯的自重较大而偏向一方,增加阀芯与衬套之间的机械磨损,造成泄漏; 7)在拧紧压紧螺钉时,阀门应处于微开状态,以免压坏阀顶密封面; 8)所有阀门就位后,应再作一次启闭,灵活无卡住现象为合格;

9)天气寒冷时,水阀长期闭停,应将阀后积水排除。汽阀停汽后,也要排除凝结水。阀底有如丝堵,可将它打开排水。 10)非金属阀门,有的硬脆,有的强度较低,操作时,开闭力不能太大,尤其不能使猛劲。还要注意辟免对象磕碰。 11)新阀门使用时,填料不要压得太紧,以不漏为度,以免阀杆受压太大,加快磨损,而又启闭费劲。 确认管道上的盲板是否拆掉,以及施工时操作过的阀门要恢复施工前的启闭状态。 1.3阀门安装的注意事项 1.3.1阀门安装之前,要确认阀门符合设计要求和有关标准。 1.3.2在搬运和安装阀门时,要谨防磕碰划伤的事故 1.3.3安装阀门前,管道内部要清洗,除去铁屑等杂质,防止阀门密封座夹杂异物。另外,安装时的阀门应是关闭状态。 1.3.5在安装阀门时,要确认介质流向、安装形式及手轮位置是否符合规定。

实验二 黑盒测试方法

实验二:黑盒测试 一、实验目的 (1)能熟练应用黑盒测试技术进行测试用例设计; (2)对测试用例进行优化设计; (3)思考如何执行测试; 二、实验内容: 从问题一或问题二中选一个或可自定测试的内容进行测试。 问题一:日期问题描述 程序有三个输入变量month、day、year(month、day和year均为整数值,并且满足:1≤month≤12、1≤day≤31、1900≤year ≤2050。),分别作为输入日期的月份、日、年份,通过程序可以输出该输入日期在日历上下一天的日期。例如,输入为2005年11月29日,则该程序的输出为2005年11月30日。请用黑盒测试方式设计测试用例。请选择适当的黑盒测试方法设计出相应的测试用例。 程序界面 问题二描述: 有一个处理单价为5角钱的饮料的自动售货机,相应规格说明如下: 若投入5角钱或1元钱的硬币,按下〖橙汁〗或〖啤酒〗的按钮,则相应的饮料就送出来。(每次只投入一个硬币,只按下一种饮料的按钮) 如投入5角的硬币,按下按钮后,总有饮料送出。

若售货机没有零钱找,则一个显示〖零钱找完〗的红灯会亮,这时再投入1元硬币并按下按钮后,饮料不送出来而且1元硬币也退出来。 若有零钱找,则显示〖零钱找完〗的红灯不会亮,若投入1元硬币及按饮料按钮,则送出饮料的同时找回5角硬币。 请选择适当的黑盒测试方法设计出相应的测试用例。 【实验步骤】 (1)根据题目要求设计编写程序代码,编程语言不限。 (2)与其它同学交换代码,即每位同学测试其它同学的程序。 (3)使用等价类法或边界值法或判定表法或几种方法综合使用来设计测试用例。 (4)考虑如何执行测试。 (5)撰写测试分析报告。 三、实验要求 (1)根据题目要求编写测试用例; (2)撰写实验报告,在实验报告中写下你的问题; 四、思考与讨论 (1)在实际的测试中,如何设计测试用例才能达到用最少的测试用例检测出最多 的缺陷; (2)在进行用例设计时,如何考虑软件测试用例的充分性和减少软件测试用例的 冗余性; (3)如何组织实施测试? 五、其它说明: 1、实验结束上交资料包括:被测程序、设计的测试用例(包括划分的等价类或判 定表等)、错误记录,可参考用例模板(网络课堂的教学资料中或 ftp://172.31.214.12/pub/海辉/实验资料/有下载)。

“SD”调节阀使用说明书

COPES-VULCAN 带快速更换 内部部件的单座“SD”调节阀 安装、运行、维护使用说明书 SINGLE WEB “SD” TYPE CONTROL VALVE WITH QUICK CHANGE TRIM

目录 引言 (4) 第一部分安装 (6) 1.1 验收 (6) 1.2 储存 (6) 1.3 安装 (6) 1.4 调试前复检 (9) 1.5 执行机构及配件 (10) 1.6 运行要求 (10) 第二部分维护 (11) 2.1 注意事项 (11) 2.2 例行检查 (11) 2.3 从调节阀上拆卸执行机构 (14) 2.4 解体调节阀 (15) 2.5 装配调节阀 (20)

2.6 装配执行机构 (28) 2.7 研磨阀塞及套筒 (31) 图1 调节阀剖面图 (33) 图2 螺栓紧固顺序 (36) 表1 紧固力矩 (37) 表2 阀塞和阀杆组件紧固力矩 (38)

引言 SD型调节阀是用于高温高压工况下的调节阀,其尺寸范围为3/4”、1”、1.5”、2”、3”、6”、8”、10”、12”、14”和16”(20mm、25 mm、40 mm、50 mm、80 mm、150 mm、200 mm、250 mm和300 mm、350 mm、400 mm),ANSI压力磅级由150磅级到2500磅级。每个阀门由几个分项组件组成。例如在图一中,阀体组件包含阀体〔1〕、阀盖螺栓〔13〕及阀盖螺母〔14〕和阀盖/阀体密封垫圈〔15〕。 阀盖组件包含阀盖〔2〕、盘根螺栓及螺母〔11〕和〔12〕,及根据阀门与执行机构的几种不同连接方式所需要配备的零件:压块连接包含压块〔22〕及内六角螺栓〔23〕;螺杆连接包含螺纹环〔32〕;螺栓连接包含螺栓〔33〕和螺母〔34〕。 盘根组件包含支撑环〔7〕、盘根〔8〕、盘根压盖或盖圈〔9〕及盘根紧固件〔10〕组成。如果采用双盘根自然就包含两套盘根〔8〕及一个隔离套环〔24〕。 阀塞组件的构成取决于种类及尺寸,阀塞有平衡及非平衡式之分,尺寸有全尺寸及变径之分。 非平衡单座阀塞包含阀塞〔3〕、阀座〔5〕、套筒〔4〕、阀杆〔6〕、阀杆固定销〔17〕、和阀塞密封垫圈〔16〕。 平衡单阀座阀塞包含阀塞〔3〕、阀座〔5〕、套筒〔4〕、阀杆〔6〕、阀杆固定销〔17〕、和阀塞密封垫圈〔16〕及阀塞密封,也就是通常所称的”U”杯型密封圈〔18a〕其耐温范

实验1 利用黑盒测试技术设计测试用例

14级本科《软件测试技术》实验指导书 实验1 利用黑盒测试技术设计测试用例 【实验目的】 1、熟悉并掌握黑盒测试的方法:等价类划分法、边界值分析法、错误推测法、场景法。 2、了解待测的功能,灵活应用黑盒测试方法中的等价类划分法、边界值分析法、错误推测法以及场景法,设计测试用例,掌握正面测试和负面测试。 【实验内容】 【1】应用等价类划分法进行测试。 用户注册功能,要求用户密码必须满足两个条件: ?长度为6到8位。 ?必须是字母和数字的组合。 (1)请分析等价类,填写表1-1。 表1-1 等价类表 (2)根据表1-1的等价类设计测试数据,填写表1-2。 表1-2 根据等价类划分法设计的测试数据 【2】应用等价类划分法和边界值分析法进行测试。 在教务系统中进行课程成绩录入,要求0≤成绩≤100,且成绩为整数。 (1)请分析等价类,填写表1-3。 表1-3 等价类表

(2)根据表1-3的等价类设计测试数据,填写表1-4。 表1-4 根据等价类划分法设计的测试数据 (3)根据边界值分析法设计测试数据,填写表1-5。 表1-5 根据边界值分析法设计的测试数据 阅读附录A.9的功能描述,了解借书功能。设计借书功能的测试用例。(1)首先按照场景法来分析借书功能的基本流和备选流,见表2-12。 表2-12 借书功能的基本流和备选流 (2)设计借书功能的场景,见表2-13。 表2-13 借书功能的场景设计

I(Invalid,无效的)表示无效数据,“n/a”表示这个条件不适用于测试用例。 表2-14 测试用例表 【4】设计修改产品功能的测试用例。 阅读附录A.3、A.4的功能描述,了解添加产品、修改产品功能,分析添加产品功能的测试用例的设计思路,如表2-4所示,参考添加产品功能的测试用例(如表2-5所示),设计修改产品功能的测试用例,填写表2-6。 表2-4 添加产品功能的测试用例的设计思路

黑盒测试实验报告记录

黑盒测试实验报告记录

————————————————————————————————作者:————————————————————————————————日期:

黑盒测试实验报告 一实验内容 1、系统地学习和理解黑盒测试的基本概念、原理,掌握黑盒测试的基本技术和方 法; 2、对一个已知的程序进行测试。 3、通过试验和应用,要逐步提高和运用黑盒测试技术解决实际测试问题的能力; 4、完成实验并认真书写实验报告(要求给出完整的测试信息,如测试程序、测试 用例,测试报告等) 二实验原理 黑盒测试原理:已知产品的功能设计规格,可以进行测试证明每个实现了的功能是否符合要求。软件的黑盒测试意味着测试要在软件的接口处进行。这种方法是把测试对象看作一个黑盒子,测试人员完全不考虑程序内部的逻辑结构和内部特性,只依据程序的需求规格说明书,检查程序的功能是否符合它的功能说明。因此黑盒测试又叫功能测试。 从理论上讲,黑盒测试只有采用穷举输入测试,把所有可能的输入都作为测试情况考虑,才能查出程序中所有的错误。实际上测试情况有无穷多个,人们不仅要测试所有合法的输入,而且还要对那些不合法但可能的输入进行测试。这样看来,完全测试是不可能的,所以我们要进行有针对性的测试,通过制定测试案例指导测试的实施,保证软件测试有组织、按步骤,以及有计划地进行。黑盒测试行为必须能够加以量化,才能真正保证软件质量,而测试用例就是将测试行为具体量化的方法之一。具体的黑盒测试用例设计方法包括等价类划分法、边界值分析法、错误推测法、因果图法、判定表驱动法、正交试验设计法、功能图法等。 等价类划分的办法是把程序的输入域划分成若干部分(子集),然后从每个部分中选取少数代表性数据作为测试用例。每一类的代表性数据在测试中的作用等价于这一类中的其他值。该方法是一种重要的,常用的黑盒测试用例设计方法。 1 划分等价类 划分等价类:等价类是指某个输入域的子集合。在该子集合中,各个输入数据对于揭露程序中的错误都是等效的,并合理地假定:测试某等价类的代表值就等于对这一类其它值的测试。因此,可以把全部输入数据合理划分为若干等价类,在每一个等价类中取一个数据作为测试的输入条件,就可以用少量代表性的测试数据。取得较好的测试结果。等价类划分可有两种不同的情况:有效等价类和无效等价类。 有效等价类:是指对于程序的规格说明来说是合理的,有意义的输入数据构成的集合。利用有效等价类可检验程序是否实现了规格说明中所规定的功能和性能。 无效等价类:与有效等价类的定义恰巧相反。 设计测试用例时,要同时考虑这两种等价类。因为,软件不仅要能接收合理的数据,也要能经受意外的考验。这样的测试才能确保软件具有更高的可靠性。 2 边界值分析 边界值分析是通过选择等价类边界的测试用例。边界值分析法不仅重视输入条件边界,而且也必须考虑输出域边界。它是对等价类划分方法的补充。 (1)边界值分析方法的考虑:

风量调节阀使用说明书

风量调节阀CVD 安装指导手册

风量调节阀CVD安装指导手册 1.CVD风量调节阀简介 CVD型风量调节阀是妥思公司为中国市场推出的空调通风系统中风量调节和压力控制的阀门。 CVD型调节阀为用户提供方形和圆形阀门,可选配手动机构、电动弹簧复位、电动双位、电动连续调节执行器等,形式多样能满足用户不同要求。 CVD型风量调节阀根据用户要求,叶片可做成平行叶片、对开叶片形式。圆形阀门也可做成碟阀。 (1)手动风量调节阀示意图 (2)电动风量调节阀示意图

2. 风量调节阀安装指导说明 风量调节阀的选用与安装依据下列国家规范与标准以及建筑标准设计图集执行《采暖通风与空气调设计规范》GB50019-2003 《通风与空调工程施工质量验收规范》GB50423-2002 《洁净室施工及验收规范》JGJ71-90 《风量调节阀》JB/77228-94 《通风管道技术规程》JGJ141-2004 《薄钢板法兰风管制作及安装》07K133 《风管支吊架》03K132 《管道与设备保温》98R418 《管道与设备保冷》98R419

风量调节阀安装,依据国家建筑标准设计图集07K120《风阀选用与安装》进行。说明如下: 1.运到施工现场的风阀产品,安装单位应报监理验收,根据装箱清单开箱查验合格证、检测报告和安装指导说明文件等,逐个校验产品的型号、规格、材质、标识及控制方式是否符合设计文件的规定,并应做好记录和各方签字确认。 2.风阀在就位安装之前应逐个检测其结构是否牢固、严密,进行开关操作试验,检查是否灵活可靠;对电动风阀要逐个通电试验并检测,做好试验记录。3.风阀就位前必须检查其适用范围、安装位置、气流方向和操作面是否正确。4.风阀的开闭方向、开启角度应在可视面有准确的标识。 5.安装在高处的风阀,其手动操纵装置宜距露面或操作平台1.5-1.8m。 6.风阀的操作面距墙、顶和其他设备、管道的有效距离不得小于200mm,且风阀不应安装于结构层或孔洞内。阀周边缝宽度宜大于150mm。 7.检查连接风管预留的法兰尺寸、配钻孔径与孔距、法兰面的平整度和平行度、垫片材质和厚度、非金属风管的连接方式等是否符合要求。 8.检查支、吊架位置及做法是否符合规范或设计文件要求。单件风阀重量大于50kg的应设单独的支、吊架;电动风阀一般宜设单独支、吊架;用于软质非金属风管系统的风阀一般也宜设单独支、吊架。 9.用于洁净通风系统的风阀安装前必须按要求清洁阀体内表面,达到相应的洁净标准后封闭两端,封装板在就位后方可去除。擦洗净化空调系统风阀内表面应采用不掉纤维的材料,擦洗干净后的风阀不得在没有做好墙面、地面、门窗的房间内存放,临时存放场所必须保持清洁。 10. 输送介质温度超过80℃的风阀,除按设计要求做好保温隔热外,还应仔细核 对伸缩补偿措施和防护措施。 11. 设于净化系统中效过滤器后的调节风阀叶片轴如有外露,则应对其与阀间的缝隙进行密封处理,确保不泄露。 12. 连接风阀与风管法兰、薄钢板法兰或无法兰连接的紧固件均应采用镀锌件。除镀锌板材料的风阀外,不锈钢、铝合金材料的风阀连接件均应同材质,且其支、吊架如是钢质,还应采用厚度不小于60mm的防腐木垫或5mm橡胶板垫,使之与阀体绝缘。 13. 法兰垫片厚度设计无规定时,一般不小于3mm;垫片不应凸入阀内,不宜突出法兰外,净化系统的法兰垫片应选用弹性好、不透气、不产尘的材料,如橡胶板或硅胶板等,严禁采用泡沫塑料、厚纸板、石棉绳、铅油麻丝及油毡纸等含开孔孔隙和易产尘的材料。密封垫厚度根据材料弹性大小决定,一般为4-6mm,一对法兰的密封垫规格、性能及垫层厚度应相同。严禁在密封垫上涂刷涂料,法兰密封尽量减少接头,做接头时要采用阶梯形或企口形,并涂密封胶,如下图所示:14. 风阀安装的水平度误差不大于3%,垂直度误差不大于2%,不单独设支、吊架的风阀安装公差随风管一起控制精度。采用薄钢板法兰风管连接应符合下列规定: 14.1 连接完整无缺损,表面应平整,无明显扭曲。 14.2 弹簧夹或紧固螺栓的间隔不应大于150mm,且分布均匀,无松动现象。 15. 风阀安装后一般与风管系统一同进行严密性检测与试验,但为了减少风阀的调整试验次数,应对电动风阀和洁净系统、实验室风系统的风阀单独进行安装完

相关文档
相关文档 最新文档