자바 블랙박스 테스트 의 nextDate 함수 테스트

실험 목적
(1)블랙 박스 테스트 기술 을 활용 하여 테스트 사례 설 계 를 한다.
(2)테스트 사례 에 대해 최적화 디자인 방법 을 파악 한다.
실험 내용
날짜 문제
테스트 다음 프로그램:이 프로그램 은 세 개의 입력 변수 month,day,year(month,day 와 year 가 모두 정수 치 이 며 만족:1≤month≤12,1≤day≤31 과 1900≤year≤2050),각각 입력 날짜 의 월,일,연도 로 프로그램 을 통 해 이 입력 날 짜 를 달력 에서 하루 간격 으로 출력 할 수 있 습 니 다.예 를 들 어 입력 이 2004 년 11 월 30 일 이면 이 프로그램의 수출 은 2004 년 12 월 1 일이 다.
(1)등가 류 를 구분 하고 등가 류 구분 법 에 따라 테스트 사례 를 디자인 한다.
(2)nextDate 함 수 를 작성 합 니 다.
(3)Junit 4 의 용법 을 파악 하고 Junit 4 를 사용 하여 nextDate 함 수 를 테스트 합 니 다.
JUnit 4 는 JUnit 프레임 워 크 가 역사상 가장 큰 개선 으로 자바 5 의 Annotation 특성 을 이용 하여 테스트 사례 를 간소화 하 는 것 이 주요 목표 입 니 다.
Junit 4 의 정 의 를 파악 하 는 흔 한 Annotations:

org.junit.Test 
org.junit.Before
org.junit.After
org.junit.BeforeClass
org.junit.AfterClass
org.junit.Ignore
org.junit.runner.RunWith
org.junit.runners.Suite.SuiteClasses
org.junit.runners.Parameterized.Parameters
3.실험 요구
(1)제목 의 요구 에 따라 테스트 용례 를 작성 한다.
(2)nextDate 함 수 를 준비 하고 Junit 4 테스트 를 사용 하여 테스트 를 수행 합 니 다.
(3)실험 보고 서 를 작성 한다.
4.실험 과정
(1)제목 에 따라 테스트 용례 작성
 1)등가 분류 및 번호 구분
입력 데이터
유효 등가 류
무효 등가 류
년.
(1)1900 년 부터 2050 년 까지 의 윤년 정수
(10) year<1900
(2)1900 년 부터 2050 년 까지 의 평년 정수
(11) year>2050
(12)기타 입력
월.
(3)1,3,5,7,8,10,12 내의 정수
(13) month<1
(4)4,6,9,11 내의 정수
(14) 12(5) 2
(15)기타 입력
해.
(6) 1~28
(16) day<1
(7) 29
(17)year 는 윤년 month=2 시,29(8) 30
(18)year 는 비 윤년 month=2 시,28(9) 31
(19)month=1,3,5,7,8,10,12 시,31(20)month=4,6,9,11 시,30<day
(21) day>31
(22)기타 입력
 2)유효 등가 류 디자인 테스트 사례
번호
테스트 데이터
기대 결과
덮어 쓰기 범위
1
2016 2 29
다음 날 은 2016 년 3 월 1 일!
(1)(5)(7)
2
2017 1 28
다음 날 은 2017 년 1 월 29 일!
(2)(3)(6)
3
2017 1 31
다음 날 은 2017 년 2 월 1 일!
(2)(3)(9)
4
2017 4 30
다음 날 은 2017 년 5 월 1 일!
(2)(4)(8)
5
2017 12 31
다음 날 은 2018 년 1 월 1 일!
(2)(3)(9)
 3)모든 무효 등가 류 를 위해 최소한 하나의 테스트 용례 를 설계 한다
번호
입력 데이터
기대 결과
덮어 쓰기 범위
6
1899 3 1
년 치 는 지 정 된 범위 내 에 있 지 않다.
(10)
7
2051 3 1
년 치 는 지 정 된 범위 내 에 있 지 않다.
(11)
8
205% 3 1
잘못된 입력 날짜!
(12)
9
1901 -1 1
달의 가 치 는 지 정 된 범위 내 에 있 지 않다.
(13)
10
1901 13 1
달의 가 치 는 지 정 된 범위 내 에 있 지 않다.
(14)
11
1901 1% 1
잘못된 입력 날짜!
(15)
12
1901 1 -1
일의 값 은 지 정 된 범위 내 에 있 지 않다
(16)
13
2016 2 30
일의 값 은 지 정 된 범위 내 에 있 지 않다
(17)
14
2017 2 29
일의 값 은 지 정 된 범위 내 에 있 지 않다
(18)
15
2017 3 32
일의 값 은 지 정 된 범위 내 에 있 지 않다
(19)
16
2017 4 31
일의 값 은 지 정 된 범위 내 에 있 지 않다
(20)
17
2017 4 32
일의 값 은 지 정 된 범위 내 에 있 지 않다
(21)
18
2017 4 3%
잘못된 입력 날짜!
(22)
(2)nextDate 함 수 를 작성 하고 Junit 4 테스트 를 사용 하여 테스트 를 수행 합 니 다.
피 측 코드

package io.shentuzhigang.demo.blackbox;

import java.util.regex.Pattern;

/**
 * @author ShenTuZhiGang
 * @version 1.0.0
 * @date 2021-05-06 15:43
 */
public class Date {
    private static final Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$");

    public static String nextDate(String s_year, String s_month, String s_day) {
        //          
        if (!(isInteger(s_year) && isInteger(s_month) && isInteger(s_day))) {
            return "       !";
        }
        //      int
        int year = Integer.parseInt(s_year);
        int month = Integer.parseInt(s_month);
        int day = Integer.parseInt((s_day));
        boolean flag = false;
        if (year < 1900 || year > 2050) {
            return ("           ");
        } else if (month > 12 || month < 1) {
            return ("           ");
        } else if (day > 31 || day < 1) {
            return ("           ");
        }

        switch (month) {
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
                if (day == 31) {
                    day = 1;
                    month = month + 1;
                } else {
                    day = day + 1;
                }
                break;
            case 4:
            case 6:
            case 9:
            case 11:
                if (day == 30) {
                    day = 1;
                    month = month + 1;
                } else if (day == 31) {
                    flag = true;
                } else {
                    day = day + 1;
                }
                break;
            case 12:
                if (day == 31) {
                    day = 1;
                    month = 1;
                    year = year + 1;
                } else {
                    day = day + 1;
                }
                break;
            case 2: {
                if (((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)) {
                    //   
                    if (day == 29) {
                        day = 1;
                        month = 3;
                    } else if (day < 29) {
                        day = day + 1;
                    } else {
                        flag = true;
                        // day  29
                    }
                } else {
                    //   
                    if (day == 28) {
                        day = 1;
                        month = 3;
                    } else if (day < 28) {
                        day = day + 1;
                    } else {
                        flag = true;
                    }
                }

            }
            break;
            default:
        }

        if (year > 2050) {
            return ("           ");
        } else if (flag) {
            return ("           ");
        } else {
            return ("    " + year + " " + month + " " + day + " !");
        }
    }

    /**
     *              
     *
     * @param str
     * @return
     */
    public static boolean isInteger(String str) {
        return pattern.matcher(str).matches();
    }
}

테스트 코드

package io.shentuzhigang.demo.blackbox;

import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

import java.util.Arrays;
import java.util.Collection;

/**
 * @author ShenTuZhiGang
 * @version 1.0.0
 * @date 2021-05-06 15:43
 */
@RunWith(Parameterized.class)
public class DateTests {
    private String input1;
    private String input2;
    private String input3;
    private String expected;

    @Parameters
    public static Collection<?> prepareData(){
        String [][] object = {
                //      
                {"2016","2","29","    2016 3 1 !"},
                {"2017","1","28","    2017 1 29 !"},
                {"2017","1","31","    2017 2 1 !"},
                {"2017","4","30","    2017 5 1 !"},
                //      
                {"1899","3","1","           "},
                {"2051","3","1","           "},
                {"205%","3","1","       !"},
                {"1901","-1","1","           "},
                {"1901","13","1","           "},
                {"1901","1%","1","       !"},
                {"1901","1","-1","           "},
                {"2016","2","30","           "},
                {"2017","2","29","           "},
                {"2017","3","32","           "},
                {"2017","4","31","           "},
                {"2017","4","32","           "},
                {"2017","4","3%","       !"}
        };
        return Arrays.asList(object);
    }
    public DateTests(String input1,String input2,String input3,String expected){
        this.input1 = input1;
        this.input2 = input2;
        this.input3 = input3;
        this.expected = expected;

    }
    @Test
    public void testDate(){
        String result = Date.nextDate(input1,input2,input3);
        Assert.assertEquals(expected,result);
    }
}

테스트 결과
在这里插入图片描述
결함 분석
1.용례?고장 이 난 이 유 는 프로그램 이 day 를 29 로 판단 하면 3 월 1 일 로 바 뀌 고 윤년 여 부 를 먼저 판단 하지 않 아 예 를 들 었 기 때문이다.의 출력 결 과 는 2007-3-1 이지 잘못된 입력 날짜 가 아 닙 니 다.
2.용례?고장 이 난 이 유 는 프로그램 이 먼저 받 은 세 개의 매개 변수 가 지 정 된 범위 내 에 있 는 지 판단 하지 않 고 먼저 month 에 따라 데이터 처 리 를 한 다음 에 처리 한 매개 변수 가 지 정 된 범위 내 에 있 는 지,사례 를 판단 하기 때 문 입 니까?의 매개 변 수 는 month 가 3 이기 때문에 직접 day+1 이 0 에서 1 로 바 뀌 고 day 가 지 정 된 범위 내 에 있다 고 판단 하기 때문에 예 를 들 면?의 출력 결 과 는 1998-3-1 이지 일의 값 이 지정 한 범위 에 있 지 않 습 니 다.
자바 블랙 박스 테스트 의 nextDate 함수 테스트 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.자바 nextDate 함수 테스트 에 관 한 더 많은 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기