| Profiel van summergroup2008软件实现技术小组WeblogLijstenNetwerk | Help |
|
|
20 juli 主要测试用例代码及注释1#include "Elevator.h"
#include <stdio.h> const int count=21; //the number of test cases
bool testcases[count]; //record whether every test case is passed or failed void main()
{ /********************************************************* basic testing according to some functions 测试电梯运行时的显示和停止时的显示 从1层到10层,又从10层下到1层 **********************************************************/ Elevator elevator; Elevator *ep=&elevator; //test case1 cout<<"test1:测试从1层到9层运行中的电梯状态是否正确"<<endl; elevator.RequireUp(1); elevator.mysleep(ONESEC*3); //3s开门等待乘客进入 elevator.CloseDoor(); elevator.mysleep(ONESEC); //等待关门 elevator.RequireGetOff(10); //请求上到10层 int num1=0; for(int i=1;i<=8;i++) { elevator.mysleep(ONESEC*3); //3s上升一层 cout<<"第"<<i+1<<"层"; if(elevator.GetElevatorState()==::ES_CLOSED&&elevator.GetElevatorDirection()==::ED_UP&&elevator.GetArrivedFloor()==i+1) { cout<<"passed"; num1++; } else cout<<"failed"; cout<<endl; } if(num1==8) testcases[0]=true; 电梯程序模拟部分代码#include "stdafx.h"
#include "Elevator.h" //: Construction function
Elevator::Elevator() { curDir=::ED_STOP; curState=::ES_CLOSED; curFloor=1; //lastTime=0; for(int i=0;i<11;i++) { up[i]=false; down[i]=false; } trend=0; tenthNum=0; thirtiethNum=0; } Elevator::~Elevator()
{ cout << "destruct" << endl; } ELEVATORDIRECTION Elevator::GetElevatorDirection() { return curDir; } //电梯的状态,确切的说是门的状态
ELEVATORSTATE Elevator::GetElevatorState() { return curState; } //: User send requirement to mount the elevator to go up /* * @parameter * floor: the floor which the user on */ void Elevator::RequireUp(int userfloor) { //if(userfloor==MAXFLOOR) return; if(userfloor==curFloor&&curDir==::ED_STOP) { OpenDoor(); trend=1; } else { if(up[userfloor]==false) up[userfloor]=true; } if(trend==0) { int internalFloor=userfloor-curFloor; if(internalFloor>0) {trend=1;curDir=::ED_UP;} else if(internalFloor<0) {trend=-1;curDir=::ED_DOWN;} } } //: User send requirement to mount the elevator to go down
/* * @parameter * floor: the floor which the user on */ void Elevator::RequireDown(int userfloor) { //if(userfloor==1) return; if(userfloor==curFloor&&curDir==::ED_STOP) { OpenDoor(); trend=-1; } else { if(down[userfloor]==false) down[userfloor]=true; } } //: User send selection on which floor they will get off
/* * @parametr * floor: the dismount floor */ void Elevator::RequireGetOff(int userfloor) { if(trend==0) { int internalFloor=userfloor-curFloor; if(internalFloor>0) trend=1; else if(internalFloor<0) trend=-1; } if(trend==1) RequireUp(userfloor); else if(trend==-1) RequireDown(userfloor); } //: Open the door
void Elevator::OpenDoor() { if(curDir==::ED_STOP) { if(curState==::ES_CLOSED||curState==::ES_CLOSING) { curState=::ES_OPENNING; } } } //: Close the door void Elevator::CloseDoor() { if(curDir==::ED_STOP) { if(curState==::ES_OPENED||curState==::ES_OPENNING) { curState=::ES_CLOSING; } } } int Elevator::GetArrivedFloor() { return curFloor; } void Elevator::mysleep(DWORD internalTime)
{ if(curState==::ES_CLOSED) { int num=internalTime/1500; int remainder=internalTime%1500; for(int i=0;i<num;i++) { Sleep(ONEHALFSEC); if(trend==1) { curDir=::ED_UP; thirtiethNum=thirtiethNum+15; if(up[curFloor]==true) { curDir=::ED_STOP; curState=::ES_OPENNING; up[curFloor]=false; down[curFloor]=false; int j; for(j=curFloor;j<=MAXFLOOR;j++) { if(up[j]==true||down[j]==true) break; } if(j==MAXFLOOR+1) { for(j=curFloor;j>0;j--) { if(up[j]==true||down[j]) break; } if(j==0) trend=0; else trend=-1; } } else { if(i%2==0) { curFloor++; if(thirtiethNum>30) thirtiethNum=15; } } } else if(trend==-1) { curDir=::ED_DOWN; thirtiethNum=thirtiethNum-15; if(down[curFloor]==true) { curDir=::ED_STOP; curState=::ES_OPENNING; up[curFloor]=false; down[curFloor]=false; int j; for(j=curFloor;j>0;j--) { if(up[j]==true||down[j]==true) break; } if(j==0) { for(j=curFloor;j<=MAXFLOOR;j++) { if(up[j]==true||down[j]==true) break; } if(j==MAXFLOOR+1) trend=0; else trend=1; } } else { if(i%2==0) { curFloor--; if(thirtiethNum<0) thirtiethNum=15; } } } } //Sleep(remainder); int numS=remainder/100; int remainderS=remainder%100; for(int k=0;k<numS;k++) { Sleep(ONESEC/10); if(curDir==::ED_UP) thirtiethNum++; else if(curDir==::ED_DOWN) thirtiethNum--; else { if(trend==-1) curDir=::ED_DOWN; else if(trend==1) curDir=::ED_UP; } } Sleep(remainderS); if(thirtiethNum>=30) { if((trend==1&&up[curFloor]==true)||(trend==-1&&down[curFloor]==true)) { curDir=::ED_STOP; curState=::ES_OPENNING; if(up[curFloor]==true) up[curFloor]=false; if(down[curFloor]==true) down[curFloor]=false; thirtiethNum=0; } } else if(thirtiethNum<=0) { if((trend==1&&up[curFloor]==true)||(trend==-1&&down[curFloor]==true)) { curDir=::ED_STOP; curState=::ES_OPENNING; if(up[curFloor]==true) up[curFloor]=false; if(down[curFloor]==true) down[curFloor]=false; thirtiethNum=0; } } } else { int num=internalTime/1000; int remainder=internalTime%1000; int done=0; if(num>0) { for(int i=0;i<num;i++) { Sleep(ONESEC); if(curState==::ES_OPENNING) { curState=::ES_OPENED; tenthNum=10; } if(curState==::ES_CLOSING) { curState=::ES_CLOSED; tenthNum=0; } if(curState==::ES_OPENED) { if(num-i>=5) done=1; } } if(done==1) curState=::ES_CLOSING; int numS=remainder/100; int remainderS=remainder%100; for(int k=0;k<numS;k++) { Sleep(ONESEC/10); if(curState==::ES_OPENNING) tenthNum++; if(curState==::ES_CLOSING) tenthNum--; } Sleep(remainderS); if(tenthNum>=10) { curState=::ES_OPENED; tenthNum=10; } if(tenthNum<=0) { curState=::ES_CLOSED; tenthNum=0; } } else if(num==0) { int numS=internalTime/100; int remainderS=internalTime%100; for(int k=0;k<numS;k++) { Sleep(ONESEC/10); if(curState==::ES_OPENNING) tenthNum++; if(curState==::ES_CLOSING) tenthNum--; } Sleep(remainderS); if(tenthNum>=10) { curState=::ES_OPENED; tenthNum=10; } if(tenthNum<=0) { curState=::ES_CLOSED; tenthNum=0; } } } } 电梯系统测试部分8其他测试
电梯系统测试部分7
电梯系统测试部分6
电梯系统测试部分5
电梯的状态转换的综合测试
电梯系统测试部分4
电梯系统测试部分3
门的状态转换的综合测试
电梯系统测试部分2测试用例:基本测试:测试电梯运行时的显示和停止时的显示,从1层到10层,又从10层下到1层
电梯系统测试部分1测试的设计测试目标为一个类,并且这个类有多个状态和状态转换,所以按照三部分来测试: 1、 基本接口(方法)的测试:根据接口的前置条件执行基本的功能测试。 2、 状态转换测试:每一个状态转换应该有至少一个测试用例去覆盖。本类中的状态转换包括电梯的状态转换和门的状态转换。 3、 其他测试:特殊需求和没有覆盖到的需求的测试。 测试结果评估1 、测试覆盖 (1) 基于需求 覆盖率100% ,即所有的测试用例覆盖了所有的需求。 (2) 基于代码 语句覆盖率100% ,即每一个语句都至少执行一次。 路径覆盖率约70% 。 2 、测试用例通过率 第一次测试通过12个测试用例,通过率为57% ,最后一次测试通过21个测试用例,通过率为100% ,中间测试过程测试通过率不断增长。 3 、局限性 由于测试的工作量较大,使用尽可能少的测试用例去覆盖尽可能多的需求,再加上自动化测试的要求,有的测试用例就覆盖多个需求点,如果这个测试用例没有通过,有可能是几个功能中的某一个或几个有问题,不便于定位错误来源。 由于程序中有的地方是用软件去模拟硬件,所以在硬件中不会出现的异常情况没有进行测试。 电梯系统用例分析电梯类涉及到的用户只有乘客(Passenger),他与电梯类发生的交互包括:请求上升(Require Up)、请求下降(Require Down)、输入所要到达楼层(Input Floor No.)、请求开门(Open Door)、请求关门(Close Door)。下面将对各个用力进行具体说明。 1、 请求上升用例(Require Up) 前置条件: 乘客在电梯间外等待电梯在其所在楼层停止,并载其上升。 基本流程: 用户按下墙面上的请求上升按钮,电梯控制器收到请求,并根据乘客所在具体楼层进行计算,将用户所在楼层添加入停留楼层记录,并确定停留策略。 可选流程: 如果该楼层的上升请求按钮已被按下,则不需重新计算。 后置条件: 电梯停留策略更新。 2、 请求下降(Require Down) 前置条件: 乘客在电梯间外等待电梯在其所在楼层停止,并载其下降。 基本流程: 用户按下墙面上的请求下降按钮,电梯控制器收到请求,并根据乘客所在具体楼层进行计算,将用户所在楼层添加入停留楼层记录,并确定停留策略。 可选流程: 如果该楼层的下降请求按钮已被按下,则不需重新计算。 后置条件: 电梯停留策略更新。
3、 输入所要到达楼层(Input Floor No.) 前置条件: 用户进入电梯间,需要按下楼层按钮指示电梯其所要到达的楼层 基本流程: 用户按下电梯间壁上的特定楼层按钮,电梯控制器收到请求,并根据乘客许到达的楼层进行计算,将新楼层添加入停留楼层记录,并确定停留策略。 可选流程: 如果该楼层的下降请求按钮已被按下,则不需重新计算。 后置条件: 电梯停留策略更新。
4、 请求开门(Open Door) 前置条件: 用户在电梯间内,需要按下开门按钮使电梯门打开。 基本流程: 重新计算其它楼层的到达时间及电梯门的状态。 可选流程: 如果电梯在运行状态下,则该请求不予处理。 后置条件: 电梯门状态相应改变。
5、 请求关门(Close Door) 前置条件: 用户在电梯间内,需要按下关按钮使电梯门关闭。 基本流程: 重新计算其它楼层的到达时间及电梯门的状态。 可选流程: 如果电梯在运行状态下,则该请求不予处理。 后置条件: 电梯门状态相应改变。
电梯系统设计部分根据需求,进行电梯系统的设计
一、具体需求回顾
1、 电梯具有上升、下降、停止三种状态。 2、 电梯在上升和下降过程中作匀速运动,从第n层运行到达第n+1层(或n-1层)的时间为3秒。 3、 电梯上升时,当运行到达或超过半层时(即到达或超过1.5秒)就更改电梯所在楼层为上一层,否则算下一层。下降时,到达或超过半层时(即1.5秒)就算下一层,否则算上一层。 4、 电梯门状态分为open,closed,opening,closing。电梯运行时电梯门状态始终保持为closed(即电梯上升和下降状态下,开门请求被拒绝),电梯到达某一层停止后立即开门。 5、 电梯负责层数为10的楼房的运营,每层有一个上升和下降的按钮(底层和顶层除外,底层只有上升按钮,顶层只有向下按钮),请求电梯停止。 6、 电梯内部有代表10层的10个按钮,以及一个开门键,一个关门键 7、 电梯在上升状态中,会在上升途中每个具有“上升请求”(上升请求的层数大于电梯当前所在楼层)层停下,直到上升到所有请求中最高层为止。下降的情况相反。 8、 电梯门正常关闭和开启的时间为1秒,开门状态(等待乘客进入)默认保持5秒钟。但是如果用户按下电梯内的关闭(或开启)按键的话,就要立即关闭(或开启),时间为1秒。 当电梯在开门中状态时,用户按下开门按钮将被忽略,按下关门按钮将立即响应,状态变为关门中;反之亦然。
二、电梯响应策略回顾
三、主程序流程于开关门程序流程设计
四、测试规则
测试目标惟一个类,并且这个类有多种状态和状态转换。所以三种策略测试:
1、 基本接口(方法)的测试:根据接口的前置条件执行基本的功能测试。 2、 状态转换测试:每一个状态转换应该有至少一个测试用例去覆盖。本类中的状态转换包括电梯的状态转换和门的状态转换。 3、 其他测试:特殊需求和没有覆盖到的需求的测试。
11 juli 网络与系统安全 上节课程老师讲了关于安全方面的内容。因为自己是信息安全专业的,所以对于这方面比较感兴趣。
记得网络攻防的文老师曾经这么说过,没有一个软件是绝对安全的,理论上它是可破解的,只有和硬件结合起来 才可能是软件作到不可破解。
但是虽然软件是可破解的,但是还存在破解的代价问题,如果代价超出了破解软件所带来的利益那么这个破解其实也没有意义的。
因此我们要做的其实就是使自己的软件和系统的安全性高到对方要付出极大的代价才能破解。
根据IDC最新的调查结果,如今计算机用户面临的三项最严重的安全威胁依次是垃圾邮件、Ddos攻击和网上欺诈。与前些年安全威胁大多来自
病毒和蠕虫等的大规模猛烈爆发不同,近年来各种各样的“谍件”或者恶意代码开始在网上肆虐,其疯狂程度已超过了传统的病毒威胁。
如今IT技术面临的安全问题主要有:
1。复杂性增加,软件错误上涨
估计1000行代码中有5大15个错误。
软件复杂----软件代码量多-----软件错误增加----安全缺陷
WINDOWS 3。1 300W行
WINDOWS NT 400w行
WINDOWS NT 4。0 1650w行
WINDOWS 95 1120W行
WINDOWS 98 1500W行
WINDOWS XP 3500W行
VISTA 5000w行
2。操作系统的系统调用数目变化
UNIX 1ed (1971) 33
UNIX 2ed (1979) 47
SunOS 4.1 (1989) 171
4.3 BSD Net 2 (1991) 136
Sun OS 4.5 (1992) 219
HP UX 9.05 (1994) 163
Linux 1.2 (1996) 211
Sun OS 5.6 (1997) 190
Linux 2.0 (1998) 229
Windows NT 4.0 SP3 (1999) 3433
3。 安全漏洞
WINDOWS 十大安全隐患
(1)WEB 服务器和服务
(2)工作站服务
(3)WINDOWS 远程访问服务
(4)微软SQL服务器
(5)windows 认证
(6)WEB浏览
(7)文件共享
(8)LSASS Exposures
(9)电子邮件客户端
(10)即时信息
来自 SANS研究报告
4。漏洞攻击的发展趋势
利用漏洞发动攻击的速度加快
Symantec统计,2004年上半年,漏洞公布到攻击 代码出现时间:5.8天 威胁程度不断增加 2004年1-6月,有攻击代码的漏洞中64%属于高度 危险,36%属于中度危险 漏洞利用分析人员兴趣的变化 Web应用的漏洞越来越多 Symantec统计,2004年上半年公布了479个与Web 应用有关的漏洞,占总数的39% 5。 安全管理上常见安全问题:
第一类问题,用户网络安全防范意识弱。如选取
弱口令,使得从远程直接控制主机。 第二类问题,主机的网络服务配置不当,开放有 漏洞的网络服务。 第三类问题,安装有漏洞的网络服务软件包。 第四类问题,网络边界没有过滤掉恶意数据包或 切断网络连接;例如 允许外部网络的主机直接 ping内部网主机,允许 建立空连接。 第五类问题, 网络主机安全策略配置不当及使用
有漏洞的服务软件,可能导致本地用户获取超 级用户。缺省配置,不打补丁!!! 第六类问题,网络安全敏感信息泄漏。 第七类问题,存在网络病毒。RedCode Nimda 第九类问题,网络中有潜在拒绝服务攻击。例如 邮件服务器和域名服务器。 第十类问题,管理问题。资产、策略、负责人, 没有明确的安全管理策略。 --------------------------------------------陈旭明
|
|
|