일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Database
- NIO
- write by GPT-4
- 자바네트워크
- 리눅스
- oracle
- 인프라
- write by chatGPT
- kotlin
- 자바
- 역학
- spring data jpa
- 소프트웨어공학
- 유닉스
- 웹 크롤링
- chatGPT's answer
- 시스템
- flet
- Java
- spring integration
- jpa
- 데이터베이스
- android
- 자바암호
- 파이썬
- python
- JVM
- 고전역학
- GPT-4's answer
- 코틀린
- Today
- Total
기억을 지배하는 기록
테스트 지향 프로그래밍 with JUnit - 1 본문
Ch 1 Start Unit Test
단위 테스트란
- 테스트 대상이 되는 코드 기능의 아주 작은 특정 영역을 실행해 보는, 개발자가 작성한 코드 조각이다.
- 어떤 코드 조각이 개발자가 생각한 대로 동작하는지 증명하기 위해 수행하는 것이다.
단위 테스트의 지침
- 코드 자체를 작성하기 전에 문제가 되는 메서드를 테스트할 방법을 결정
- 테스트 코드를 기능 구현 코드보다 먼저 작성하거나 동시에 작성한다.
테스트 코드의 요소
- 테스트에 필요한 모든 조건과 상황을 준비 설정한다.(필요한 객체를 모두 생성하기, 필요한 자원을 모두 할당하기 등)
- 테스트 대상이 되는 메서드를 호출한다.
- 테스트 대상이 되는 메서드가 원하는 대로 동작한다는 것을 검증한다.
- 실행이 끝나고 다른 코드에 영향이 없게 정리 작업을 한다.
아주 간단한 단위테스트
메서드 조건
1. 주어진 int배열에서 가장 큰 값을 리턴한다.
2. Message Parameter가 Null이거나 int 배열의 Size가 0일 때 RuntimeException을 발생한다.
대상코드(GetlargeInt.java)
package cha2; public class GetlargeInt { public GetlargeInt() { } public int getMaxInt(int[] intArry) { if(intArry == null || intArry.length == 0) throw new RuntimeException("Message Parameter is null or size 0"); int a = 0; int b = 0; for(int i = 0; i < intArry.length; i++ ) { if(i==0) a = intArry[i]; if(i!=0 && a < intArry[i]) a = intArry[i]; } return a; } } |
Test Case(GetlargeIntTest.java)
package cha2; import junit.framework.TestCase; public class GetlargeIntTest extends TestCase { GetlargeInt tester = new GetlargeInt(); public static void main(String[] args) { } public void testGetMaxInt() { assertEquals(9, tester.getMaxInt(new int[]{0,1,9})); assertEquals(9, tester.getMaxInt(new int[]{-10,9,8})); } public void testNull() { try { assertEquals(9, tester.getMaxInt(null)); fail("이값은 Exception을 발생합니다."); } catch (RuntimeException e) { assertTrue(true); } } } |
Test Suite(AllTest.java)
package cha2; import junit.framework.Test; import junit.framework.TestSuite; public class AllTests { public static void main(String[] args) { junit.awtui.TestRunner.run(AllTests.class); } public static Test suite() { TestSuite suite = new TestSuite("Test for cha2"); //$JUnit-BEGIN$ suite.addTestSuite(GetlargeIntTest.class); //$JUnit-END$ return suite; } } |
Junit의 assert Method
assertEquals(String Message, expected, actual, tolerance) : 동일성 테스트 메서드
- Message : 테스트가 실패할 경우 출력될 메시지
- expected : 기대하는 값
- actual : 테스트 대상이 되는 코드에서 리턴된 값
- tolerance : 실수형를 비교하는 메서드에서 오차 한계 지정값
assertNull, assertNotNull(String Message, Object object) : object가 null 값인지 아닌지
assertNotSame, assertSame(String Message, expected, actual) : expected 와 actual이 같은 객체를 참조하는 지 판단
assertFalse, assertTrue(String Message, boolean condition) : boolean 조건의 거짓, 참를 판정한다.
fail(String Message) : 테스트를 실패 처리한다.
테스트별 설정 메서드
protected void setup() : 각 test 메서드들이 실행되기 전에 호출된다.
protected void teardown() : 각각의 test 메서드들이 실행되고 난 다음에 호출된다.
Test의 6가지 영역
Right – 결과가 옳은가? : 유효성 검사
B – 모든 경계(boundary) 조건이 Correct한가? : 경계조건(boundary condition)을 밝혀내는 것은 단위 테스트에서 가장 중요한 부분 중 하나다. 대부분의 버그가 보통 “경계”에 서식하기 때문이다. 다음은 경계 조건을 테스트할 때 유념할 부분이다.(이 부분은 나중에 더 자세히 알아보게 될 것이다..)
형식일치 : 값의 형식이 기대한 형식과 일치하는가?
순서 : 적절한 순서대로 되어 있거나 그렇지 않은 값인가?
범위 : 적당한 최소값과 최대값 사이에 있는 값인가?
참조 : 코드가 자기가 직접 제어하기 않는 외부 코드를 참조하는가?
존재성 : 값이 존재하는가?
개체 수 : 확실히 충분한 값이 존재하는가?
시간 : 모든 것이 순서대로 일어나는가? 제시간에? 때맞추어?
I – 역(inverse)관계를 확인할 수 있는가? : 몇몇 메서드는 논리적 역(inverse)을 적용하여 검증해야 한다.
C – 다른 수단을 사용해서 결과를 교차확인(cross-check)할 수 있는가?
E – 에러 조건(error condition)을 강제로 만들어 낼 수 있는가?
P – 성능(performance) 특성이 한도 내에 있는가?
'오래된글 > Java' 카테고리의 다른 글
테스트 지향 프로그래밍 with JUnit - 3 (0) | 2018.04.07 |
---|---|
테스트 지향 프로그래밍 with JUnit - 2 (0) | 2018.04.07 |
자카르타 프로젝트 HttpClient와 FileUpload 사용하기 (0) | 2018.04.07 |
자바을 이용한 암호학 - 12 (0) | 2018.04.07 |
자바을 이용한 암호학 - 11 (0) | 2018.04.07 |