자바 블랙박스 테스트 의 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
(15)기타 입력
해.
(6) 1~28
(16) day<1
(7) 29
(17)year 는 윤년 month=2 시,29
(18)year 는 비 윤년 month=2 시,28
(19)month=1,3,5,7,8,10,12 시,31
(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 함수 테스트 에 관 한 더 많은 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.