【软件测试】黑盒测试方法——决策表

1.地位:
决策表法被称为“最严格、最具有逻辑性”的黑盒测试方法,能够复杂逻辑关系和多条件组合情况表达的较为明确。适用于:输入输出较多且相互制约条件较多的问题。

2.决策表:
由条件桩、动作桩、条件项、动作项四个部分组成
条件桩是指问题中的限制条件;
动作桩是指要执行的操作;
条件项其中条件桩中各个条件组合;
动作项是一个条件组合的特定取值后相应要执行的动作;
规则: 任何一个条件组合的特定取值及相应要执行的操作称为一条规则;

3.规则合并(判定表的简化)
有两条或多条规则具有相同动作且他们的条件项之间存在可化简关系就可以将规则合并。
那么,什么是可化简关系?
即条件桩中仅有一个条件的值不一样,而执行的动作却是一致的。

4.总结
决策表的适用范围:程序中,输入输出较多,而且相互制约条件较多;如,if_then_else逻辑很突出——输入变量间存在逻辑关系——设计输入变量子集的计算——输入和输出之间存在因果关系。
优点:决策表可以把复杂的问题按各种可能的情况一一列举出来,简单明了,避免遗漏。
缺点:不可以表达重复执行的动作,如循环结构。

5.实例分析——preDate
题目:前一日函数 PreDate 是 NextDate 的逆函数,即给定一个月份、日期、年,会返回前一天的日期。
年的取值在 1812 年到 2017 年。日的取值在 1 日到 31 日之间。月的取值在 1 到 12 月之间。

条件:
M1:{月份:上一月份有30天}
M2:{月份:上一月份有31天,1月份除外}
M3:{月份:上一月是2月}
M4:{月份:本月是1月}
Y1:{年:年是闰年}
Y2:{年:年是平年}
D1:{日:当天是该月的第一天}
D2:{日:当天不是该月的第一天}

源程序:

package main;

import java.text.DateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Scanner;

/*
 * code by diudiu,2017-03-21
 *
 * */

public class PreDate {
    private int year;
    private int month;
    private int day;
    Calendar date=java.util.Calendar.getInstance();

    public int getYear() {
        return year;
    }

    public void setYear(int year) {
        this.year = year;
    }

    public int getMonth() {
        return month;
    }

    public void setMonth(int month) {
        this.month = month;
    }

    public int getDay() {
        return day;
    }

    public void setDay(int day) {
        this.day = day;
    }
//用户输入
public void Input(){        
        String s1="2017-03-21 09:25:10";

        Calendar st=java.util.Calendar.getInstance();

        int year,month,day;
        while(true){
        @SuppressWarnings("resource")
        Scanner s11=new Scanner(System.in);
        s1=s11.nextLine();  
        DateFormat df=new java.text.SimpleDateFormat("yyyy-MM-dd");
          String[] s1Arr=s1.split("-");
          year=Integer.parseInt(s1Arr[0]);
          month=Integer.parseInt(s1Arr[1]);
          day=Integer.parseInt(s1Arr[2]);

          if(year<1812||year>2017){
            System.out.println("输入年份错误,范围为1812<=year<=2017,请重输入年份");     
            }
             else if(month<1||month>12){
            System.out.println("输入月份错误,范围为1<=month<=12,请重输入月份");
            }
            else if(day<1||day>31){
            System.out.println("输入日错误,范围为1<=day<=31,请重输入日"); 
            }
            else if(M2(month)&&day>30){
                System.out.println("输入日错误,当月的天数范围为1<=day<=30,请重输入日"); 
            }
            else if(Y1(year)&&M3(month)&&day>29){
            System.out.println("当年是闰年,二月的天数范围为1<=day<=29,请重输入日");
            }
            else if(Y2(year)&&M3(month)&&day>28){
            System.out.println("当年是平年,二月的天数范围为1<=day<=28,请重输入日");
            }
            else {
                 try
                 {
                    st.setTime(df.parse(s1));
                 }catch(java.text.ParseException e){
                System.err.println("日期格式输入不正确,程序终止!");
                System.exit(0);
                }
            break;
            }
        }//输入时间合法
        //System.out.print(s1);
        System.out.println(year+"-"+month+"-"+day);
        date=st;
        setYear(year);
        setMonth(month);
        setDay(day);
    }

//条件判断
boolean M1(int month){//输入月份的上一月份有30天
    if(month==4||month==6||month==9||month==11)return true;
    return false;
}
boolean M2(int month){//输入月份的上一月份有31天,除了1月
    if(month==12||month==3||month==5||month==7||month==10)return true;
    return false;
}
boolean M3(int month){//输入月份的上一月份是2月
    if(month==2)return true;
    return false;
}
boolean M4(int month){//输入月份的上一月份是1月
    if(month==0)return true;
    return false;
}

boolean D1(int day){
if(day==1)return true;
return false;
}
boolean D2(int day){
if(day!=1)return true;
return false;
}


boolean Y1(int year){//闰年,2月份是29天
    if((((year%4==0&&year%100!=0)||year%400==0)))return true;
    return false;
}
boolean Y2(int year){//平年,2月份是28天
    if(!((year%4==0&&year%100!=0)||year%400==0))return true;
    return false;
}

//已知date,year,month,day,计算上一天
public Calendar rPreDate(){
    Calendar pd=java.util.Calendar.getInstance();
    //判断前一天的计算方式
    //pd.setWeekDate(year-1, month-1, day-1);
    int yearp = year,monthp = month-1,dayp=0;
    if(D1(day)){
        if(M1(month-1)){monthp=month-1;dayp=30;}
        if(M2(month-1)){monthp=month-1;dayp=31;}
        if(M3(month-1)){
            if(Y2(year)){
            monthp=month-1;dayp=29;
            }else{
                monthp=month-1;
                dayp=28;
            }
        }

        if(M4(month-1)){//1月1号
            yearp=year-1;
            monthp=12;
            dayp=31;
        }
}else{
        yearp=year;
        monthp=month;
        dayp=day-1;
    }
    System.out.println();
    System.out.println(yearp+"-"+monthp+"-"+dayp);
    pd.set(yearp, monthp, dayp);    
    return pd;  
}

//主方法
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        PreDate pdate=new PreDate();
        pdate.Input();
        Calendar predate=pdate.rPreDate();
        System.out.print(pdate.date.getTime());
        System.out.println();
        System.out.print(predate.getTime());
    }
}

你可能感兴趣的:(软件测试,Java)