# Junit Test
#### Reference
- [junit : https://junit.org/junit4/](https://junit.org/junit4/)
- [junit cook book : http://junit.sourceforge.net/doc/cookbook/cookbook.htm](http://junit.sourceforge.net/doc/cookbook/cookbook.htm)
- [junit tutorial : https://www.tutorialspoint.com/junit/junit_ignore_test.htm](https://www.tutorialspoint.com/junit/junit_ignore_test.htm)
- [Junit 설정 : http://kamang-it.tistory.com/110](http://kamang-it.tistory.com/110)
- [JUnit으로 유닛 테스팅하기(2) : http://kamang-it.tistory.com/305](http://kamang-it.tistory.com/305)
- [assertThat : http://sejong-wiki.appspot.com/assertThat](http://sejong-wiki.appspot.com/assertThat)
- [JUnit 정리 & 기본 사용법 : http://jkonury.tistory.com/196](http://jkonury.tistory.com/196)
- [hamcrest 로 가독성있는 jUnit Test Case 만들기 : https://www.lesstif.com/pages/viewpage.action?pageId=18219426](https://www.lesstif.com/pages/viewpage.action?pageId=18219426)
- [java main assert : https://www.google.co.kr/search?q=java+main+assert&safe=off&lr=lang_ko&sa=X&ved=0ahUKEwjNt4L9ma3cAhXRNpQKHR23ANYQuAEIIw&biw=1745&bih=861](https://www.google.co.kr/search?q=java+main+assert&safe=off&lr=lang_ko&sa=X&ved=0ahUKEwjNt4L9ma3cAhXRNpQKHR23ANYQuAEIIw&biw=1745&bih=861)
#### assert란?
가정 설정문(假定設定文) 또는 어서션(영어: assertion)은 프로그램 안에 추가하는 참·거짓을 미리 가정하는 문이다.
개발자는 해당 문이 그 문의 장소에서 언제나 참이라고 간주한다. 런타임 중에 표명이 거짓으로 평가되면
표명 실패(assertion failure)를 초래하며 이 상황에서는 일반적으로 실행이 중단된다.
참고 : (https://ko.wikipedia.org/wiki/%ED%91%9C%EB%AA%85)
#### assertThat 사용법
assertThat은 assertThat(T actual, Matcher super T> matcher)
#### JUnit Assertions
==== ==== ==== ==== ==== ==== ==== ==== ==== ==== ==== ==== ==== ==== ==== ====
code 설명
==== ==== ==== ==== ==== ==== ==== ==== ==== ==== ==== ==== ==== ==== ==== ====
assertEquals([message], expected, actual) 두 값이 같은 지 비교
assertSame([message], expceted, actual) 두 객체가 동일한 객체인지 비교
assertNotSame([message], expceted, actual) 두 객체가 동일한 객체인지 비교
assertTrue([message], expceted) 참/거짓 판별
assertFalse([message], expceted) 참/거짓 판별
assertNull([message], expceted) null여부 판단
assertNotNull([message], expceted) null여부 판단
fail([message]) 테스트 실패로 판단
assertArrayEquals 두 배열이 똑같은 값을 가진 똑같은 크기의 배열인지 확인
assertThat 해당 개체가 특정 상황을 만족하는지 확인
==== ==== ==== ==== ==== ==== ==== ==== ==== ==== ==== ==== ==== ==== ==== ====
import static org.junit.Assert.*;
으로 static import 하여 쉽게 사용할 수 있음.
#### JUnit4의 특징
1. Java5 애노테이션 지원
2. test라는 글자로 method 이름을 시작해야 한다는 제약 해소
Test 메소드는 @Test를 붙인다
3. 좀 더 유연한 픽스처
@BeforeClass, @AfterClass, @Before, @After
4. 예외 테스트
@Test(expected=NumberFormatException.class)
5. 시간 제한 테스트
@Test(timeout=2000)
6. 테스트 무시
@Ignore(“”)
7. 배열 지원
assertArrayEquals([message], expected, actual);
8. @RunWith(클래스 이름.class)
JUnit Test 클래스를 실행하기 위한 러너(Runner)를 명시적으로 지정한다.
@RunWith는 junit.runner.Runner를 구현한 외부 클래스를 인자로 갖는다.
9. @SuiteClasses(Class[]) 보통 여러 개의 테스트 클래스를 수행하기 위해 쓰인다. @RunWith를 이용해 Suite.class를 러너로 사용한다.
10. 파라미터를 이용한 테스트
@RunWith(Parameterized.class)
@Parameters
public static Collection data() {
}
#### Junit4 애노테이션
@BeforeClass : 테스트 클래스 내에서 수행 전 한 번만 실행, static method 여야 함
@AfterClass : 테스트 클래스 내에서 수행 후 한 번만 실행, static method 여야 함
@Before : 테스트 케이스 수행 전 반복실행
@After : 테스트 케이스 수행 후 반복실행
@Test : 테스트 메소드 지정
==== Example ==== ==== ==== ==== ==== ==== ==== ==== ==== ==== ====
1. JUnit 메소드 실행 순서 Example
```java
/** Junit4Test.java **/
import org.junit.*;
public class Junit4Test {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
System.out.println("@BeforeClass");
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
System.out.println("@AfterClass");
}
@Before
public void setUp() throws Exception {
System.out.println("@Before");
}
@After
public void tearDown() throws Exception {
System.out.println("@After");
}
@Test public void testCase1() throws Exception {
System.out.println("testCase1");
}
@Test public void testCase2() throws Exception {
System.out.println("testCase2");
}
}
```
2. JUnit @Test @Ignore Example
```java
/** Junit4Exam.java **/
import org.junit.Ignore;
import org.junit.Test;
import static org.junit.Assert.*;
public class Junit4Exam { // 예외 테스트
// @Test(expected = NumberFormatException.class)
@Ignore
public void testException() throws Exception {
System.out.println("start-testException()");
String str = "hello";
try {
int intValue = Integer.parseInt(str);
System.out.println(intValue);
} catch ( NumberFormatException ex ) {
throw ex;
}
}
// 테스트 시간 제한
// @Test(timeout = 10000)
@Ignore
public void testTimeout() throws Exception {
System.out.println("start-testTimeout()");
long sum = 0;
for (int i = 0; i < 10000; i++) {
for (int j = 0; j < 10000; j++) {
sum += j;
}
}
System.out.println(sum);
}
// 테스트 무시
// @Ignore("")
@Test
public void testIgnore() throws Exception {
System.out.println("start-testIgnore()");
assertTrue(false);
}
// 배열 지원 - 값이랑 순서까지 동일해야 함
@Test
public void testAssertArrayEquals() throws Exception {
System.out.println("start-testAssertArrayEquals()");
Object[] a = {
"Java",
"Python",
1
};
Object[] b = {
"Java",
"Python1",
1
};
assertArrayEquals(a, b);
}
}
```
3. JUnit Suite Example - 실행
: Suite Class 는 여러개의 테스트 클래스를 한번에 호출할 수 있다.
```java
/** TestSuite.java **/
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
@RunWith(Suite.class)
//@Suite.SuiteClasses( { Junit4Test.class, Junit4Exam.class })
@Suite.SuiteClasses( { Junit4Exam.class })
public class TestSuite {
}
```
4. JUnit Runner Example - 실행
```java
/** TestRunner.java **/
import org.junit.Ignore;
import org.junit.Test;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertTrue;
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
public class TestRunner { // 예외 테스트
public static void main(String[] args) {
// Result result = JUnitCore.runClasses(Junit4Test.class);
Result result = JUnitCore.runClasses(Junit4Exam.class);
for (Failure failure : result.getFailures()) {
System.out.println(failure.getTrace() + " / " + failure.toString());
}
System.out.println("result.wasSuccessful() : " + result.wasSuccessful());
}
}
```
5. JUnit Testcase Example
```java
/** JavaTest.java **/
import java.util.ArrayList;
import java.util.List;
public class ListTest {
private List lstFruits = new ArrayList();
public void add(String fruit) {
lstFruits.add(fruit);
}
public void remove(String fruit) {
lstFruits.remove(fruit);
}
public int size() {
return lstFruits.size();
}
public void removeAll(){
lstFruits.clear();
}
}
```
# JavaTest.java
```java
import junit.framework.TestCase;
public class JavaTest extends TestCase {
protected int value1, value2;
protected ListTest lstTest = new ListTest();
protected void setUp() {
lstTest.add("Apple");
lstTest.add("Orange");
lstTest.add("Grapes");
}
public void testSize() {
assertEquals("Checking size of List", 3, lstTest.size());
}
public void testAdd() {
lstTest.add("Banana");
assertEquals("Adding 1 more fruit to list", 4, lstTest.size());
}
public void testRemove() {
lstTest.remove("Orange");
assertEquals("Removing 1 fruit from list", 2, lstTest.size());
}
protected void tearDown() {
lstTest.removeAll();
}
}
```
'java' 카테고리의 다른 글
Javascript Destructuring assignment( 비구조화 할당 ) (0) | 2019.07.12 |
---|---|
Java Assertion (0) | 2019.07.12 |
Singletone Design Pattern (0) | 2019.01.30 |
Adapter Design Pattern (0) | 2019.01.30 |
Spring Boot internationalization (0) | 2019.01.30 |
댓글