Profiel van summergroup2008软件实现技术小组WeblogLijstenNetwerk Extra Help

Weblog


    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

    其他测试

     

     

    用例编号

    Test case19

    测试优先级

    测试类型

    特殊需求测试

    用例设计者

    余大江

    设计日期

    2008-6-30

    测试描述

    测试电梯停在一层按向上按钮,人2秒后按关门按钮,门是否关闭

    涉及需求编号

    46

    输入

    1层按下上升键,按下关门键

    执行步骤

    11层按下上升按钮

    2、等待2

    3、按下关门键

    期望输出

    电梯状态为停止,门的状态为closing,电梯所在楼层为1

    实际结果

    与期望输出相同

    测试日期

    2008-7-2

    测试结果

    Passed

     

    用例编号

    Test case20

    测试优先级

    测试类型

    特殊需求测试

    用例设计者

    余大江

    设计日期

    2008-6-30

    测试描述

    测试电梯在开门状态中再次按开门键,忽略响应

    涉及需求编号

    9

    输入

    1层按下上升键,按下关门键

    执行步骤

    11层按下上升按钮

    2、等待0.5

    3、按下开门键

    4、等待0.6

    期望输出

    电梯状态为停止,门的状态为opened,电梯所在楼层为1

    实际结果

    与期望输出相同

    测试日期

    2008-7-2

    测试结果

    Passed

     

    用例编号

    Test case21

    测试优先级

    测试类型

    特殊需求测试

    用例设计者

    余大江

    设计日期

    2008-6-30

    测试描述

    测试电梯在上升状态中按开门键,忽略响应

    涉及需求编号

    4

    输入

    1层按下上升键,按下关门键,按下2层按钮,按下开门按钮

    执行步骤

    11层按下上升按钮

    2、等待3

    3、按下关门键

    4、按下2层按钮

    5、等待1

    6、按下开门按钮

    7、等待0.5

    期望输出

    电梯状态为上升,门的状态为closed,电梯所在楼层为1

    实际结果

    与期望输出相同

    测试日期

    2008-7-2

    测试结果

    Passed

    电梯系统测试部分7

    用例编号

    Test case16

    测试优先级

    较高

    测试类型

    状态转换测试

    用例设计者

    陈旭明

    设计日期

    2008-6-25

    测试描述

    Test case15基础上,测试当请求下到1层的过程中,在3层是否会停(3层有向上的请求)

    涉及需求编号

    7

    输入

    按下关门键

    执行步骤

    1、  按下关门键

    2、  按下1层按钮

    3、等待关门

    4、等待18

    期望输出

    电梯状态为下降,门的状态为closed,电梯所在楼层为3

    实际结果

    与期望输出相同

    测试日期

    2008-7-14

    测试结果

    Passed

     

    用例编号

    Test case17

    测试优先级

    较高

    测试类型

    状态转换测试

    用例设计者

    陈旭明

    设计日期

    2008-6-25

    测试描述

    Test case16基础上,测试1层是否正常停止

    涉及需求编号

    7

    输入

    按下关门键

    执行步骤

    1、  按下关门键

    2、等待关门

    3、等待6

    期望输出

    电梯状态为停止,门的状态为opening,电梯所在楼层为1

    实际结果

    与期望输出相同

    测试日期

    2008-7-14

    测试结果

    Passed

     

    用例编号

    Test case18

    测试优先级

    较高

    测试类型

    状态转换测试

    用例设计者

    陈旭明

    设计日期

    2008-6-26

    测试描述

    Test case17基础上,测试3层请求是否相应

    涉及需求编号

    7

    输入

    按下关门键

    执行步骤

    1、  按下关门键

    2、等待关门

    3、等待6

    期望输出

    电梯状态为停止,门的状态为opening,电梯所在楼层为1

    实际结果

    与期望输出相同

    测试日期

    2007-7-14

    测试结果

    Passed

     

     

    电梯系统测试部分6

    用例编号

    Test case13

    测试优先级

    较高

    测试类型

    状态转换测试

    用例设计者

    陈旭明

    设计日期

    2008-6-26

    测试描述

    测试多个请求的处理功能,2层同时有到达10层和5层的请求

    涉及需求编号

    7

    输入

    按下10层和5层按钮,按下10层和5层按钮

    执行步骤

    1、  按下10层和5层按钮

    2、  按下关门键

    3、等待关门

    4、等待9

    期望输出

    电梯状态为停止,门的状态为opening,电梯所在楼层为5

    实际结果

    与期望输出相同

    测试日期

    2008-7-14

    测试结果

    Passed

     

    用例编号

    Test case14

    测试优先级

    较高

    测试类型

    状态转换测试

    用例设计者

    陈旭明

    设计日期

    2008-6-25

    测试描述

    测试在从5层上升到10层的过程中有来自3层向上和9层向下的请求

    涉及需求编号

    7

    输入

    执行步骤

    1按下关门键

    2、等待关门

    3、等待9.5

    43层外按向上的按钮

    59层外按向下的按钮

    6、等待8.5

    期望输出

    电梯状态为停止,门的状态为opening,电梯所在楼层为10

    实际结果

    与期望输出相同

    测试日期

    2008-7-14

    测试结果

    Passed

     

    用例编号

    Test case15

    测试优先级

    较高

    测试类型

    状态转换测试

    用例设计者

    陈旭明

    设计日期

    2008-6-26

    测试描述

    Test case14基础上,测试9层的请求是否响应

    涉及需求编号

    7

    输入

    按下关门键

    执行步骤

    1、按下关门键

    2、等待关门

    3、等待3

    期望输出

    电梯状态为停止,门的状态为opening,电梯所在楼层为9

    实际结果

    与期望输出相同

    测试日期

    2008-7-14

    测试结果

    Passed

    电梯系统测试部分5

    用例编号

    Test case10

    测试优先级

    较高

    测试类型

    状态转换测试

    用例设计者

    陈旭明

    设计日期

    2008-6-26

    测试描述

    测试门的状态从closing转化为closed

    涉及需求编号

    48

    输入

    执行步骤

    等待1.5

    期望输出

    电梯状态为停止,门的状态为closed

    实际结果

    与期望输出相同

    测试日期

    2008-7-12

    测试结果

    Passed

     

    电梯的状态转换的综合测试

    用例编号

    Test case11

    测试优先级

    较高

    测试类型

    状态转换测试

    用例设计者

    陈旭明

    设计日期

    2007-6-26

    测试描述

    测试当电梯上升到两层中间,电梯显示是否正确

    涉及需求编号

    3

    输入

    在第二层外按下向上请求按钮

    执行步骤

    1、  在第二层外按下向上请求按钮

    2、  等待1

    期望输出

    电梯状态为上升,门的状态为closed,电梯所在楼层为1

    实际结果

    与期望输出相同

    测试日期

    2008-7-14

    测试结果

    Passed

     

    用例编号

    Test case12

    测试优先级

    较高

    测试类型

    状态转换测试

    用例设计者

    陈旭明

    设计日期

    2008-6-25

    测试描述

    Test case11的基础上,测试请求功能,在2层是否能停下

    涉及需求编号

    3

    输入

    执行步骤

    等待2

    期望输出

    电梯状态为停止,门的状态为opening,电梯所在楼层为2

    实际结果

    与期望输出相同

    测试日期

    2008-7-14

    测试结果

    Passed

    电梯系统测试部分4

    用例编号

    Test case07

    测试优先级

    较高

    测试类型

    状态转换测试

    用例设计者

    陈旭明

    设计日期

    2008-6-25

    测试描述

    测试门的状态从opened转化为closing和电梯自动关门

    涉及需求编号

    48

    输入

    执行步骤

    等待5.5

    期望输出

    电梯状态为停止,门的状态为closing

    实际结果

    与期望输出相同

    测试日期

    2008-7-12

    测试结果

    Passed

     

    用例编号

    Test case08

    测试优先级

    较高

    测试类型

    状态转换测试

    用例设计者

    陈旭明

    设计日期

    2008-6-25

    测试描述

    测试门的状态从closing转化为openning

    涉及需求编号

    468

    输入

    按下开门按钮

    执行步骤

    1、按下开门按钮

    2、等待0.2

    期望输出

    电梯状态为停止,门的状态为opening

    实际结果

    与期望输出相同

    测试日期

    2008-7-12

    测试结果

    Passed

     

     

    用例编号

    Test case09

    测试优先级

    较高

    测试类型

    状态转换测试

    用例设计者

    陈旭明

    设计日期

    2008-6-25

    测试描述

    测试门的状态从openning转化为closing

    涉及需求编号

    468

    输入

    按下关门键

    执行步骤

    1、  按下开门按钮

    2、  等待0.2

    期望输出

    电梯状态为停止,门的状态为closing

    实际结果

    与期望输出相同

    测试日期

    2008-7-12

    测试结果

    Passed

    电梯系统测试部分3

    用例编号

    Test case04

    测试优先级

    测试类型

    基本测试

    用例设计者

    陈旭明

    设计日期

    2008-6-25

    测试描述

    Test case03的基础上,测试是否停在1

    涉及需求编号

    124

    输入

    执行步骤

    等待3

    期望输出

    电梯到达1层状态为停止,门的状态为opening

    实际结果

    与期望输出相同

    测试日期

    2008-7-12

    测试结果

    Passed

     

     

    门的状态转换的综合测试

    用例编号

    Test case05

    测试优先级

    较高

    测试类型

    状态转换测试

    用例设计者

    陈旭明

    设计日期

    2008-6-25

    测试描述

    测试门的状态从closed转化为openning

    涉及需求编号

    468

    输入

    1层外按下请求按钮

    执行步骤

    11层外按下请求按钮

    2、等待0.5

    期望输出

    电梯状态为停止,门的状态为opening

    实际结果

    与期望输出相同

    测试日期

    2008-7-12

    测试结果

    Passed

     

     

    用例编号

    Test case06

    测试优先级

    较高

    测试类型

    状态转换测试

    用例设计者

    陈旭明

    设计日期

    2008-6-25

    测试描述

    测试门的状态从openning转化为opened

    涉及需求编号

    48

    输入

    执行步骤

    等待0.5

    期望输出

    电梯状态为停止,门的状态为opened

    实际结果

    与期望输出相同

    测试日期

    2008-7-12

    测试结果

    Passed

    电梯系统测试部分2

    测试用例:

    基本测试:测试电梯运行时的显示和停止时的显示,从1层到10层,又从10层下到1

    用例编号

    Test case01

    测试优先级

    测试类型

    基本测试

    用例设计者

    陈旭明

    设计日期

    2008-6-25

    测试描述

    测试从1层到9层运行中的电梯状态及表示楼层是否正确

    涉及需求编号

    12456

    输入

    1层外按下请求按钮、1层内按关门按钮、1层内按10层按钮

    执行步骤

    11层外按下请求按钮

    2、等待开门

    31层内按关门按钮

    4、等待关门

    51层内按10层按钮

    6、循环等待38

    期望输出

    每过3秒电梯的状态为上升,门的状态为closed,所到楼层为1+i(每过3i1),直到电梯到达9层。

    实际结果

    与期望输出相同

    测试日期

    2008-7-12

    测试结果

    Passed

     

    用例编号

    Test case02

    测试优先级

    测试类型

    基本测试

    用例设计者

    陈旭明

    设计日期

    2008-6-25

    测试描述

    Test case01的基础上,测试是否停在十层

    涉及需求编号

    124

    输入

    执行步骤

    等待3

    期望输出

    电梯到达10层状态为停止,门的状态为opening

    实际结果

    与期望输出相同

    测试日期

    2008-7-12

    测试结果

    Passed

     

    用例编号

    Test case03

    测试优先级

    测试类型

    基本测试

    用例设计者

    陈旭明

    设计日期

    2007-6-25

    测试描述

    测试从10层到2层运行中的电梯状态是否正确

    涉及需求编号

    1246

    输入

    10层内按关门按钮、10层内按1层按钮

    执行步骤

    110层内按关门按钮

    2、等待关门

    310层内按1层按钮

    期望输出

    每过3秒电梯的状态为下降,门的状态为closed,所到楼层为10-i(每过3i1),直到电梯到达2层。

    实际结果

    与期望输出相同

    测试日期

    2008-7-12

    测试结果

    Passed

    电梯系统测试部分1

    测试的设计

    测试目标为一个类,并且这个类有多个状态和状态转换,所以按照三部分来测试:

    1、  基本接口(方法)的测试:根据接口的前置条件执行基本的功能测试。

    2、  状态转换测试:每一个状态转换应该有至少一个测试用例去覆盖。本类中的状态转换包括电梯的状态转换和门的状态转换。

    3、  其他测试:特殊需求和没有覆盖到的需求的测试。

    测试结果评估

    1 、测试覆盖

    (1)       基于需求

             覆盖率100% ,即所有的测试用例覆盖了所有的需求。

    (2)       基于代码

             语句覆盖率100% ,即每一个语句都至少执行一次。

             路径覆盖率约70%

    2 、测试用例通过率

             第一次测试通过12个测试用例,通过率为57% ,最后一次测试通过21个测试用例,通过率为100% ,中间测试过程测试通过率不断增长。

    3 、局限性

             由于测试的工作量较大,使用尽可能少的测试用例去覆盖尽可能多的需求,再加上自动化测试的要求,有的测试用例就覆盖多个需求点,如果这个测试用例没有通过,有可能是几个功能中的某一个或几个有问题,不便于定位错误来源。

             由于程序中有的地方是用软件去模拟硬件,所以在硬件中不会出现的异常情况没有进行测试。

    电梯系统用例分析

    图片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、  电梯门状态分为openclosedopeningclosing。电梯运行时电梯门状态始终保持为closed(即电梯上升和下降状态下,开门请求被拒绝),电梯到达某一层停止后立即开门。

    5、  电梯负责层数为10的楼房的运营,每层有一个上升和下降的按钮(底层和顶层除外,底层只有上升按钮,顶层只有向下按钮),请求电梯停止。

    6、  电梯内部有代表10层的10个按钮,以及一个开门键,一个关门键

    7、  电梯在上升状态中,会在上升途中每个具有“上升请求”(上升请求的层数大于电梯当前所在楼层)层停下,直到上升到所有请求中最高层为止。下降的情况相反。

    8、  电梯门正常关闭和开启的时间为1秒,开门状态(等待乘客进入)默认保持5秒钟。但是如果用户按下电梯内的关闭(或开启)按键的话,就要立即关闭(或开启),时间为1秒。

    当电梯在开门中状态时,用户按下开门按钮将被忽略,按下关门按钮将立即响应,状态变为关门中;反之亦然。
     
    二、电梯响应策略回顾
    未命名
    三、主程序流程于开关门程序流程设计
    图片1               图片2
    四、测试规则
     测试目标惟一个类,并且这个类有多种状态和状态转换。所以三种策略测试:

    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
    第九类问题,网络中有潜在拒绝服务攻击。例如
    邮件服务器和域名服务器。
    第十类问题,管理问题。资产、策略、负责人,
    没有明确的安全管理策略。
     
     
     
                                       --------------------------------------------陈旭明
     


     
     
     
    26 juni

    测试部分的一点资料和总结

    http://msdn.microsoft.com/zh-cn/library/aa292191(VS.71).aspx(来源:msdn visual studio开发中心)
    这个链接的内容和老师介绍的部分很一致,提供了一些详细信息。 为了节省时间,我们采取一人阅读、搜索和整理相关资料。然后对全组讲述,和对于不清楚或者存在问题的部分全组讨论的形式进行学习。
    时间:6月25日 参加人员:全组  讲述:陈旭明  记录:孙文晶
    1、基于需求的测试
    对需求提出了三点要求:A、明确的,只能用一种方式解释。B、必须可以以一种确保程序编译的方式来测试。 C、所有要求都应该是绑定的
    对于绑定的理解:有人认为是需求要绑定到特定的代码实现逻辑, 有人认为需求要和测试用例一一对应。我们在这一项的理解上存在一些不一致,并不能互相说服,暂时认为两者均可
    根据A B 两项重新核查了我们之前定义的需求, 认为第7项:合法的开关门响应时间为一秒。存在二义性,即响应时间,指的是接到指令到开始执行开关门动作的时间,还是接到指令,到开关门动作完成的时间。  经讨论,将其明确定义为前者。
    2、测试方法
    对于单元测试和集成测试。我们相对比较熟悉,有比较多的了解,对于老师上课时也讲到的回归测试,大多数成员相对比较陌生。根据我们对课程讲解的总结,回归测试指修改了旧代码后,重新进行测试,来确认修改有没有造成新的错误或者为其他代码引入错误。根据网页中列出的策略和内容,进行了进一步的理解。理解了有效的回归测试十以测试库为基础,我们总结回归测试的基本过程:
    • 识别被修改的代码
    • 从原有测试用例库中排除所有不再适合的用例,形成新的用例库
    • 在新用例库中选择测试用例来测试修改后的软件
    • 生成新的测试用例来测试修改后的程序 在原用例库中无法得到测试的部分
    • 用最终的用例库测试修改后的软件

    之后,我们回到电梯系统的test plan 部分的讨论,准备以测试优先级、测试类型、输入、执行步骤、期望输出为主要的字段、来设计和规划测试用例。 并形成初步文档。

     

     
     
     

    由Test专题课程想到的~

        之前对Test过程的了解比较简单和片面。当郁老师提出关于Test概念问题的时候,还真的有些茫然。其实,如今人们对软件的质量越来越重视,就必然导致软件测试的地位越来越重要,毕竟测试是用来验证软件是否能够实现所期望功能的主要途径。在软件工程中,为测试规定了一个明确独立的阶段,而这使得我们产生了一个误解,认为测试是在软件开发后期才开始。是一个单独的阶段。而这次课通过郁老师的讲解,给我印象很深的是:测试贯穿于软件生命周期的每一个阶段。并且初步了解了在各个阶段中的测试应用。产品定义阶段的test plan. 设计阶段的test spec,开发阶段的测试工具开发和用例实现,检查阶段的Test passes check,还有发阶段的一些涉及到测试的工作。
       老师还介绍了好多测试方法,还对其中一些举例和进行比较。
       课后我们希望将这次了解到的测试知识有选择的深入讨论,并把它运用到这次电梯模拟的项目中来。并进行了初步的讨论。初步结果如下:
     

    项目的测试目标为一个类,并且这个类有多个状态和状态转换,所以按照三部分来测试:

    1、  基本接口(方法)的测试:根据接口的前置条件执行基本的功能测试。

    2、  状态转换测试:每一个状态转换应该有至少一个测试用例去覆盖。本类中的状态转换包括电梯的状态转换和门的状态转换。

    3、  其他测试:特殊需求和没有覆盖到的需求的测试。

    先发上来,我们还希望根据各自对这部分知识的深入,进一步的讨论确定test plan.

    电梯响应请求策略的讨论

       之前我们的场景描述中,乘客可以通过两种方式与电梯系统交互。即:
    1、通过电梯内部的控制面板设定目标楼层
    2、通过每个楼层的上、下呼叫按钮 进行呼叫
    电梯系统将按照一定的策略处理这些用户输入,我们对电梯的响应策略作了讨论, 讨论总结如下:
    我们大致认为电梯可以有三种策略来处理用户的目标和呼叫请求:
    1、先请求的先得到服务
    这个策略主要是从实现简单出发而提出的。将所有呼叫和目标按到达时间排队,然后一一完成,这只需要设计一个将目标排队的数据结构。但是由于这不符合显示系统的运行策略。大多数组员,不同意这个方案。
    2、按方向服务
    这个策略是指在安全的前提下,一次将一个方向上的所有呼叫和目标全部完成,然后调转运行方向完成另一个方向上的呼叫和目标。
    3、响应时间最短
    我们希望电梯系统对所有的请求,能够做到在最短的时间内响应。
     
      对于方案3,我们所想到的算法,都会引起频繁调转电梯方向。我们认为实现比较复杂,同时也不符合实际电梯系统的应用。所以经过讨论,我们决定采用方案2
    从这个策略出发,讨论了可能出现的所有分支情况:
      未命名
     

    关于需求

         我们初步讨论的电梯系统的需求如下:
    一、场景描述
    1、楼层数设为10。(为了简化测试用例的编写)
    2、电梯的初始状态:停在一层,所有按钮未按下
    3、乘客可通过电梯内部的控制面板选择要去的楼层,这里将这个选择叫做目标楼层
    4、乘客也可通过外面的向上或者向下两个按钮呼叫电梯,这里将这个交互叫做呼叫
    5、乘客还可以通过电梯内的开门关门按钮控制电梯的开关门状态
     
    二、按优先级定义的需求
     
    未命名
     
     
    三、需求规约
    1、电梯具有上升、下降、停止三种状态。
    2、电梯在上升和下降过程中视为匀速运动,相邻层之间的运行时间设为3秒
    3、一次将一个方向上的所有呼叫和目标全部完成、再调转方向完成另一个方向上的所有目标和呼叫
    4、设置安全策略: 如果电梯正向第I层驶来,位于I层和相邻层之间,则出于安全考虑,忽略I层的请求或目标
    5、电梯门状态为open,closed,opening,closing.电梯运行时电梯门始终保持为closed(即电梯上升和下降状态下,开门请求被拒绝)
    6、电梯门正常开启时间为1秒,状态保持时间(即等待乘客上下时间)为5秒
    7、合法请求下的开、关门响应时间为1秒
    8、电梯门处于opening或者closing状态时,开关门请求被忽略
     
    四、电梯系统功能定义
    未命名

            类成员说明

    成员

    类型

    说明

    arrivedFloor

    int

    记录电梯当前所在楼层

    elevatorDirection

    ELEVATORDIRECTION

    ELEVATORDIRECTION是一个枚举类型,包括ED_UP, ED_DOWN, ED_STOP,表示电梯上升、下降和停止三种状态

    elevatorState

    ELEVATORSTATE

    ELEVATORSTATE是一个枚举类型,包括ES_OPENED,  ES_CLOSED, ES_OPENNING, ES_CLOSING,表示电梯门开、关、正在打开和正在关闭四种状态

    initTime

    DWORD

    电梯类的初始化构造时间

    stopDownTime

    DWORD

    电梯在该时间点停止向下运行

    stopUpTime

    DWORD

    电梯在该时间点停止向上运行

    stopTime

    DWORD类数组

    记录电梯在每层停留的时间点

     
    23 juni

    一些疑问

    这门课对我而言,就像刚刚接触许多其他课程一样,一些疑问会一直在我脑子里打转:这到底是门什么样的课程?什么叫软件实现技术?这门课的意义在哪里?其实,这些比较“白痴”的问题,对我而言,不是很好回答。我往往是在一门课快结束的时候,才体会到这门课真正的意义,才知道自己通过这门课学到了什么。

    从小到大上过太多标准的lecture式的课程,对这些发自本能的问题甚至都已经失去了思考的动力,只知道遵照别人的安排,努力去让自己适应。从本科开始,互动式的课程慢慢从无到有,从少到多。到了研究生阶段,发现授课的过程基本都有了相当的互动。好多东西,需要自己从头去搞明白了。 软件实现技术,就跟景阳老师所传达给我们的,是一种优秀、高效的工程实践和习惯,是一种对技术的新的体验和理解。这是所有涉足技术领域并想有所深入的人都必须面对的。虽然只上了几次课,但是我已经发现我们所有的组员都对这次合作、领悟、交流的机会有很高的期待。相信这会是一次十分令人期待的发现过程。

    16 juni

    编程之美!

    不要误会,这里不是长篇讨论各种高深技术问题,只是谈一下自己的一些体会。
    通过老师对这次PHONE类的点评,突然想到一句话:优秀是一种习惯,这种习惯一旦养成,想做一只快乐的小猪都很难。
    诚然,编程是一件很枯燥的事情,那么如何从中找到乐趣,那就是不断使其优秀。所谓学为止境,编程也是没有止境的。
    把编程当作一件美好的事物,一件你手底下的工艺品,当你完成的作品能拿到高分,能得到别人的认可,这何尝不是一件兴奋的事情呢!
    很遗憾这次没有拿到一个满意的分数,但至少学到一件事情,优化永无止境。
    再说说这次小组项目,我们选的电梯类,从我们比较熟悉的应用来做。
    就想景阳老师说的,重在体验整个过程,这个例子只要是学计算机方面出身的即使没动手编过,至少也听过不下几次。
    但用微软的项目步骤来进行整个项目的定义,开发和测试,我们都是第一次。
    首先我觉得一个重要的方面就是进度,微软非常的注重项目的进度控制,一个产品需要在合适的时间推出,才能赢得市场和客户。
    当编程不再那么玄妙了时候,那时间变的尤为重要,这就要协调好各成员间的进度。
    当一个人用心血完成一件作品的时候是多么的兴奋呢,当一个团队凝结六个人心血的作品出来的时候又会是如何的场面呢。
    这编程美妙的时刻,让我们一同完成和分享吧!

    小组会议纪要

    日期

    200861621:05-22:35

    53

    与会者

    倪宇林、孙文晶、余大江

    主持人

    孙文晶

    记录人

    孙文晶

     

    616软件实现技术会议记录

    概要记录

     

    议程:

    使用文档

    发言人 /  主持人

    讨论项目选择

    PKU Microsoft Project Camp.pptx

    倪宇林、孙文晶、余大江

    需求详细程度

    倪宇林、孙文晶、余大江

    下一步工作计划

    PKU Microsoft Project Camp 2.pptx

    倪宇林、孙文晶、余大江

     

     

     

     

     

     

     

     

     

     

     

     

    决议:

    1、以下问题需要和所有成员确认:

             1选择电梯为模拟对象

             2需要建立开会缺席惩罚制度(吃饭、雪糕~====

         3Blog的撰写负责制

    2孙文晶(PM)负责撰写需求,之后发给每个成员修改并汇总整理

    3周二之前形成简单的初稿,供上课时讨论。

    4、孙文晶排好blog负责表,发到各位油箱。负责人在该周必须整理发表blog ,其他成员自愿发表。

     

     

    下周待办事项

    负责人

    完成时间

    ü  需求初步设计

    孙文晶

    615

    ü  需求讨论修改

    全体

    616

      617日上课前Blog撰写

    倪宇林、孙文晶

    617

      617日上课后blog撰写

    肖栋鑫、余大江

    621

     

     

     

     

     

     

     

     

     

     

     

     

     
    *