조건을 걸고 해당 조건에서만 실행되는 로직이 있는 경우 사용한다.
if-else
if(조건){
로직 A
} else if (조건 2){
로직 B
}
if문은 위와 같이 사용된다. 위에서 아래로 판단하며 조건 1을 만족하면 로직 A 조건 1을 만족하지 않고
조건 2를 만족하면 로직 B 를 실행
else if 를 계속 사용하여 추가가 가능하다.
switch-case
if-else문에서는 조건문을 직접 설정할 수 있어서 특정 변수의 값의 범위를 지정할 수도 있지만 switch문은 그럴수 없다.
switch문에서는 변수나 조건문의 결과가 case문에서 지정한 값과 같은지 동등비교만 할 수 있다.
break 코드를 사용해 로직 실행을 종료할 수 있으며 switch문이 종료되거나 break 코드를 만날때까지 실행된다.
int grade = 1
switch(grade) {
case 1: System.out.println("a"); break;
case 2: System.out.println("b"); break;
case 3: System.out.println("c"); break;
default: System.out.println("f");
}
}
로직을 조건문에 맞게 반복 해주는것
for
for(statement1 ; statement2 ; statement 3){
로직
}
statement1: 로직이 실행되기 전 한번 실행
statement2: 로직 실행되는 조건
statement3: 로직이 실행되고 매번 실행
for-each
for(타입 변수명: 배열){
로직
}
배열을 인덱스가 아닌 요소로 접근이 가능하다.
while
while(조건){
로직
}
조건문 판단 후 조건문이 true인 경우 로직을 실행
ex.
int i = 0;
while(i < 3) {
i++;
if(i==2) continue;
System.out.println(i);
}
i가 3미만인 경우 while 문 내부 로직을 실행한다.
만약 2인 경우 continue 키워드를 만나 아래 로직을 실행하지 않고 while문 조건문부터 다시 시작한다.
do-while
do{
로직
} while(조건문);
로직을 먼저 실행 한 후 조건문을 판단한다. 조건문이 true 인경우 do 블럭을 실행한다.
따라서 조건문과 상관없이 로직은 반드시 한 번 이상 실행된다.
Junit 5란
크게 세가지 서브 프로젝트의 여러 모듈로 구성되어 있다.
JUnit 5 = Platform + Jupiter + Vintage
Platform
Jupiter
Vintage
JUnit 5를 사용하기 위해서는 런타임에 Java 8 이상이 필요하다.
나는 Java 11을 사용하여 구현해 보았다.
기본 테스트
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class MainTest {
@Test
public void testAddition() {
int result = 2 + 2;
assertEquals(4, result);
}
}
실패시
@Test
public void testAddition() {
int result = 2 + 3;
assertEquals(4, result);
}
result 값에는 2+3 인 5가 입려되어있다.
하지만 assertequals 사용하여 두 객체의 값이 같은지의 여부를 확인하였다.
그 결과 예측 값과 실제 값이 다르다는 오류메세지를 보여준다.
자바에서 어노테이션은 사전적 의미로는 주석이라는 뜻을 가지고 있다. 자바의 어노테이션은 소스코드에 추가해서 사용할 수 있는 메타 데이터의 일종이다.
자바의 어느테이션은 보통 '@'기로흘 앞에 붙여서 사용하며. JDK 1.5 버전 이상에서부터 사용가능하며, 클래스파일에 임베드되어 컴파일러에 의해 생성된 이휴 JVM에 포함되어 동작한다.
JUnit5 어노테이션
@AfterAll
현재 테스트 클래스의 모든 테스트 후에 주석이 달린 메서드가 실행되어야 함을 알리는 데 사용됩니다 .
@AfterEach
현재 테스트 클래스의 각 , , , 및 메서드 다음 에 주석이 달린 메서드가 실행되어야 함을 알리는 데 사용됩니다 . @Test@ RepeatedTest @ParameterizedTest @TestFactory @TestTemplate
@BeforeAll
현재 테스트 클래스의 모든 테스트 전에 주석이 달린 메서드가 실행되어야 함을 알리는 데 사용됩니다 .
@BeforeEach
현재 테스트 클래스의 각 , , , 및 메서드 보다 먼저 주석이 달린 메서드가 실행되어야 함을 알리는 데 사용됩니다 . @Test@RepeatedTest@ParameterizedTest@TestFactory@TestTemplate
@Disabled
테스트 클래스 또는 테스트 메서드가 현재 비활성화 되어 실행되어서는 안 된다는 신호를 보내는 데 사용됩니다.
@DisplayName
테스트 클래스 또는 테스트 메서드에 대한 사용자 지정 표시 이름 을 선언하는 데 사용됩니다
@DisplayNameGeneration
테스트 클래스에 대한 사용자 지정 표시 이름 생성기를 선언하는 데 사용됩니다.
@IndicativeSentencesGeneration
DisplayNameGenerator.IndicativeSentences표시 이름 생성기를 등록하고 구성하는 데 사용됩니다
@Nested
클래스가 둘러싸는 클래스 의 인스턴스와 설정 및 상태를 공유할 수 있는 중첩된 비정적 테스트 클래스(즉, 내부 클래스 )임을 알리는 데 사용 됩니다.
@Order
필드, 메서드 또는 클래스가 동일한 범주의 다른 요소에 대해 평가되거나 실행되어야 하는 순서 를 구성하는 데 사용되는 주석입니다 .
@RepeatedTest
지정된 횟수만큼 반복되어야 하는 테스트 템플릿 방법이라는 신호를 보내는 데 사용됩니다 .
@Tag
A는 반복 선언하는 데 사용되는 주석 태그 주석 테스트 클래스
@Tags
하나 이상의 @Tag선언을 위한 컨테이너입니다 .
@Test
테스트 방법 이라는 신호를 보내는 데 사용됩니다 .
@TestClassOrder
테스트 클래스 ClassOrderer를 구성하는 데 사용되는 유형 수준 주석입니다 .@Nested
@TestFactory
메서드가 테스트 팩토리 메서드 라는 신호를 보내는 데 사용됩니다 .
@TestInstance
테스트 클래스 또는 테스트 인터페이스에 대한 테스트 인스턴스 의 수명 주기 를 구성하는 데 사용되는 유형 수
준 주석입니다 .
@TestMethodOrder
테스트 클래스 또는 테스트 인터페이스 MethodOrderer의 테스트 메서드 를 구성하는 데 사용되는 유형 수준 주석입니다 .
@TestTemplate
주석이 달린 메서드가 테스트 템플릿 메서드 라는 신호를 보내는 데 사용됩니다 .
@Timeout
한 클래스 및 해당 클래스 내에서 메서드 또는 모든 테스트 가능한 메서드에 대한 시간 초과를 정의하는 데 사용됩니다 @Nested.
Assert 메소드
프로그래밍 관점에서 해석하면 표명, 가정 설정문으로 할 수 있으며, 이를 통해 자신의 로직이 정확한지 테스트 해 보는 것이다.
assertArrayEquals(a, b)
배열 A와 B가 일치함을 확인한다.
assertEquals(a, b)
객체 A와 B가 같은 값을 가지는지 확인한다
assertEquals(a, b, c)
객체 A와 B가 값이 일치함을 확인한다 ( a: 예상값, b:결과값, c: 오차범위)
assertSame(a, b)
객체 A와 B가 같은 객체임을 확인한다
assertTrue(a)
조건 A가 참인지 확인한다
assertNotNull(a)
객체 A가 null이 아님을 확인한다
래퍼런스
https://hbase.tistory.com/169
https://dev-jj.tistory.com/entry/JUnit이란-JUnit5-Assertion-어노테이션
https://github.com/jongnan/java-study-with-whiteship/blob/master/week4/week4_0.md#annotations