2015년 4월 7일 화요일

Unit Test Junit, TDD, and CI(수업 노트02 JUnit기초)

구성 설명
1. 이론 수업
2. 테스트 케이스 모델 2개 (4칙연산, int 값에 -+ 하는 계산 로직 일명 통장)
3. 각각 테스트 구현방법(Junit3, Junit4) 4는 두가지 다 3은 1가지만 예제 올림
4. 버전별로 테스트를 묶어서 구현하는 방법
 순서로 진행됩니다.


....단위 테스트 프레임워크 (Junit)
1997년 Erich Gamma , Kent Beck 둘이서 개발함
   컨퍼런스를 가는중에 Smalltalk 라는 프로그램 테스트를 위한 SUnit 을 가지고 
      자바 기반인 JUnit 로 컨버팅(다른 언어를 자바형태로 컨버팅 함)

   공개 소스 소프트웨어, 이후 Java 개발에서 단위 테스트 de facto 표준 프레임워크로 발전함

xUnit : 모든 언어를 위한 프레임워크

   JUnit 의 기능
      결과를 판별해주는 단정문(boolean)
      여러 테스트에서 공통으로 사용할수 있는 테스트 픽스처
      테스트 러너(작업도구)

Junit 4 (Java1.5ver)과 같이 발전함 1.5 버전 기준으로 하위는 3를 사용, 위에는 4버전을 사용

★Junit3 작성 규칙(4는 해당사항 없음)
 -TestCase를 상속받아야 쓸수 있음
 -테스트 메소드 이름은 반드시 Test로 시작해야 함

  setUp(); //테스트 시작전
  tearDown(); //테스트 종료 전
    --> 테스트 픽스처 메소드

테스트 스위트 (한방에 테스트 돌리고 싶을때 사용)
   Method 명은 반드시 public static Test suite() 여야 가능함
   테스트 추가시 suite.addTestSuite(테스트 클래스.class) 형태를 가져야 함

★Junit4 -- test 안붙여도 실행됨
    또한 유연한 픽스처 제공 및 예외 테스트 가능Test(expected=class name), 테스트 무시 가능
       (@Ignore("message")
    배열 지원,  시간제한 테스트 가능(@Test(timeout=1000)
    시작할때 @RunWith(class name) 으로 시작
    여러개 묶어 할때 @SuiteClasses(Class[]) 로 가능


   ------------------------Unitest ver 3 활용 예제--------------------------------------

기본 클래스 Calculator  ---------------------------------------------------------------
//4칙 연산을 기본적으로 하는 메소드 4개가 결합된 클래스 하나를 만든 상태임

public class Calculator {

public static int add(int num1, int num2){
return num1+num2;
}
public static int subtract(int num1, int num2){
return num1-num2;
}
public static int numtiply(int num1, int num2){
return num1*num2;
}
public static int divide(int num1, int num2){
return num1/num2;
}
}
------------------------------------------------------------------------------------
JUnit ver3 으로 테스트 한 예제   Calculator3Test  ---------------------------------------

public class Calculator3Test extends TestCase {

  @Override
protected void tearDown() throws Exception {
System.out.println("setUp");
//테스트를 타면서 값이 변할수 있는데 teatDawn 메소드를 넣으면 
// 1개 메소드 실행후 초기화된다. 
                // 한개 메소드 실행하고 tearDown 실행하고 다른 메소드 실행하고
                // tearDown 실행하고 ........
}

public void testAdd() {
  // 밑에 세가지 순서를 지켜서 작성하는게 좋다고 권고함
// setup
int num1 = 3;
int num2 = 2;

// execute
int result = Calculator.add(num1, num2);
// verify
assertEquals(5, result);
System.out.println("add");
}

public void testSubtract() {
assertEquals(4, Calculator.subtract(6, 2));//앞 숫자와 뒤 숫자가 같은지 비교하는 구문
assertEquals(3, Calculator.subtract(6, 3));
assertEquals(5, Calculator.subtract(6, 1));
System.out.println("Subtract");
}

public void testMultiply() {
assertEquals(4, Calculator.numtiply(2, 2));
System.out.println("Multiply");
}

public void testDevide() {
assertEquals(6, Calculator.divide(18, 3));
System.out.println("Devide");
}
}

 ------------------------콘솔 결과값 ------------------------------------------------
add
setUp
Multiply
setUp
Devide
setUp
Subtract
setUp
-------------------------------------------------------------------------------------

JUnit ver4 으로 테스트 한 예제   Calculator4Test  ---------------------------------------
public class Calculator4Test {

@BeforeClass
public static void beforClass(){
System.out.println("BeforeClass");
//beforeClass 와 afterClass 두가지는 static 선언해야 에러가 안남 왜? 잘 모르겠음
//test 시작전 처음에 실행됨
}
@Before
public void before(){
System.out.println("before");
// before 메소드는 한가지 테스트 메소드 실행전에 실행됨
}
@Test
public void testAdd() {
// setup
int num1 = 3;
int num2 = 2;

// execute
int result = Calculator.add(num1, num2);
// verify
assertEquals(5, result);
System.out.println("add");
}

@Test
public void testSubtract() {
assertEquals(4, Calculator.subtract(6, 2));
assertEquals(3, Calculator.subtract(6, 3));
assertEquals(5, Calculator.subtract(6, 1));
System.out.println("Subtract");
}

@Test
public void testMultiply() {
assertEquals(4, Calculator.numtiply(2, 2));
System.out.println("Multiply");
}

@Test
public void testDevide() {
assertEquals(6, Calculator.divide(18, 3));
System.out.println("Devide");
}
@After
public void after(){
System.out.println("after");
// test 메소드 실행후에 매번 실행되는 after 메소드
}
@AfterClass
public static void afterClass(){
System.out.println("afterClass");
//모든 실행이 끝나면 마지막에 afterclass 메소드가 실행된다.
//여기도 마찬가지로 static 선언을 해줘야됨
}
}
------------------------------------------------------------------------------------
 ------------------------콘솔 결과값 ------------------------------------------------
BeforeClass
before
Subtract
after
before
add
after
before
Multiply
after
before
Devide
after
afterClass
-------------------------------------------------------------------------------------
 
                    (Junit 상 pass화면)

예제 2) 이제 2번째 예제인 예금 클래스에 대한 testcase를 작성하기를 해본다.
원본예제Account---------------------------------------------------------------------
public class Account {

static int money =0;
public Account(int i) {
this.money=i;
}

public int getBalance() {
return money;
}
public int deposit(int i){
this.money += i;
return money;
}

public int withdraw(int i) {
this.money -= i;
return money;
}
}
-------------------------------------------------------------------------------------
Junit4 테스트 Account4Test------------------------------------------------------------
public class Account4Test {

@BeforeClass
public static void beforClass(){
System.out.println("BeforeClass");
}
@Before
public void before(){
System.out.println("before");
}

@Test
public void TestgetBalance() {
Account account = new Account(10000);
assertEquals(10000, account.getBalance());
System.out.println("pass getBalance"+account.getBalance());
}
@Test
public void Testdeposit(){
Account account = new Account(10000);
int dep = account.deposit(5000);
assertEquals(15000, dep);
System.out.println("pass deposit" + dep);
}

@Test
public void Testwithdraw() {
Account account = new Account(10000);
int with = account.withdraw(2000);
assertEquals(8000,with);
System.out.println("pass withdraw" + with);
}
@After
public void after(){
System.out.println("after");
}
@AfterClass
public static void afterClass(){
System.out.println("afterClass");
}
}
-------------------------------------------------------------------------------------
콘솔 결과----------------------------------------------------------------------------
BeforeClass
before
pass getBalance10000
after
before
pass deposit15000
after
before
pass withdraw8000
after
afterClass
-------------------------------------------------------------------------------------

 3... 이제 전체 테스트를 묶어서 실행해보는 방법 (메이븐을 안쓰면 이런 방법을 쓰더라)

Junit 3 버전일때 사용 방법-------------------------------------------------------------

public class Suite3Test extends TestCase {

public static  Test suite(){
TestSuite suite = new TestSuite();
suite.addTestSuite(Calculator3Test.class);
suite.addTestSuite(SampleJunit3Test.class);
return suite;
}
}
-------------------------------------------------------------------------------------


Junit4 버전일때 사용방법--------------------------------------------------------------

@RunWith(Suite.class)
@SuiteClasses({Calculator4Test.class, SampleJunit4Test.class})
public class Suite4Test {
}


앞서 했던 두가지 테스트 클래스가 다 실행되었음-----------------------------------------

 BeforeClass
before
Multiply
after
before
add
after
before
Subtract
after
before
Devide
after
afterClass
-------------------------------------------------------------------------------------

댓글 없음:

댓글 쓰기