스프링 수업노트 - j유닛 junit ( 테스트 코드 작성이란? ) 집가서 다시한번 정리

 

test 라이브러리 : j 유닛4.13

클래스를 테스트해야 한다 → 중요 : RUN AS JUNIT 으로 실행해서 테스트 한다.

tendency 에 의존성을 추가해야한다.

<!-- https://mvnrepository.com/artifact/junit/junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.1</version> <scope>test</scope> </dependency>

scope 가 test → 운영을 할때 동작을 하지 않고 테스트 할 때 동작을 한다.

web-inf → lib 에는 안생긴다.

Marven Dependencies 에서 harmcrest 도 같이 생긴다.

New - JUnit Test Case 만들기 → 이름은 테스트할 클래스 + Test

@Test public void test() { fail("Not yet implemented"); }

한개 생성된게 차이점이다.

Test : junit 으로 실행

메인이 존재하지 않는다. 이클립스, 메이븐등에서 자동으로 실행되서 main 이 없다.

(일반 class는 main_ 에서 실행이 된다. )

errors가 나오면 : 실행이 잘 되지 않았을때 ( assetEquals 랑 관련되지 않음)

failures 가 나오면 : assetEquals 를 통과하지 못했을때 → 실행은 된다.

모든 과정통과 : 녹색마크

실패 메시지 : java.lang.AssertionError: expected:<120> but was:<720>

해석 : 120을 기대치로 넣었지만 실제적인 값은 720 이다.

tomcat(구체화) := 일반화/추상화 : servlet container → service 를 호출하는 주체가 된다.

-servlet 을 테스트하기는 힘들다.

why?

→ interface 타입 httpaServletRequest

요청부분에서 인자가 두개 response, request

// getattribute, getsession, setattribute 등등 → 서버가 필요함 .

테스트하기가 힘들어짐 (서버에 의한 요청, 반응이 되는데 ) 이렇게

외부환경에 의존하고 있으면 테스트하기가 어려워진다.

bash 에서 :

통과를 못하면 → war는 안만들어짐

$ mvn package -Dmaven.test.skip=true

이렇게 쓰면 test 를 거치지 않음




클래스 구조 살펴보기 


-TDD : Test Driven Development(테스트 기반 개발) 

-BDD : Behavior Driver Development 


-@Test : 텍스트 메소드에 붙이는 어노테이션 

        해당 어노테이션을 붙이지 않으면 테스트 메소드로 인식되지 않음(테스트 대상에서         제외) 

        제한사항 : 

         1. 메소드 시그니처를 정해진대로 구성해야함 

         접근제어자 : public 

         반환타입 : void 

         인자 : 없음

         테스트 메소드 : 통과 조건 

        1. 테스트 메소드를 실행하는 과정에서 예외가 없이 끝까지 실행된 경우

        2. assert 구문이 있을 경우 assert 구문이 전부 통과했을 때 

/* @Test : 테스트 메소드에 붙이는 어노테이션 

해딩 어노테이션을 붙이지 않으면 테스트 메소드로 인식되지 않음(테스트 대상에서 제외 ) 

제한사항 : 

1. 메소드 시그니처를 정해진대로 구성해야함

   접근제어자 : public

         반환타입 : void 

   인자 : 없음 

  테스트 메소드 : 통과 조건 

  1. 테스트 메소드를 실행하는 과정에서 예외가 없이 끝까지 실행된 경우

  2. assert 구문이 있을 경우 assert 구문이 전부 통과 했을 때 

@before : 초기화 메소드에 붙이는 어노테이션 

@test 어노테이션이 붙은 테스트 메소드를 호출하기 전에 먼저 실행됨   

@before ==> @Test(test)

@before ==> @Test(test2)

@before ==> @Test(test3)

@after : @Test 메서드 실행 이후에 실행된 메소드에 붙이는 어노테이션 

자원 해제를 주로 담당 


@BeforeClass, @AfterClass 

클래스 단위로 최초 1회씩 호출 되는 메소드  

@BeforeClass  

@before ==> @Test(test) 

  

   => @After

@before ==> @Test(test2) ==> @After

@before ==> @Test(test3) ==> @After

@Afterclass 

제한사항 : static 메소드로 선언을 해야한다. ==> 

해당 메소드에서 사용하는 필드는 static 필드여야함 ==> 사용 빈도가 떨어지는 원인 





정리




 ackage kr.or.ddit+-

ervlet.basic;


import static org.junit.Assert.*;


import org.junit.Before;

import org.junit.Test;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;


public class FactorialTest {


//TDD : Test Driven Development (테스트 기반 개발)

//BDD : Behavior Driven Development 


/* @Test : 테스트 메소드에 붙이는 어노테이션 

해딩 어노테이션을 붙이지 않으면 테스트 메소드로 인식되지 않음(테스트 대상에서 제외 ) 

제한사항 : 

1. 메소드 시그니처를 정해진대로 구성해야함

   접근제어자 : public

         반환타입 : void 

   인자 : 없음 

  테스트 메소드 : 통과 조건 

  1. 테스트 메소드를 실행하는 과정에서 예외가 없이 끝까지 실행된 경우

  2. assert 구문이 있을 경우 assert 구문이 전부 통과 했을 때 

@before : 초기화 메소드에 붙이는 어노테이션 

@test 어노테이션이 붙은 테스트 메소드를 호출하기 전에 먼저 실행됨   

@before ==> @Test(test)

@before ==> @Test(test2)

@before ==> @Test(test3)

@after : @Test 메서드 실행 이후에 실행된 메소드에 붙이는 어노테이션 

자원 해제를 주로 담당 


@BeforeClass, @AfterClass 

클래스 단위로 최초 1회씩 호출 되는 메소드  

@BeforeClass  

@before ==> @Test(test) 

  

  => @After

@before ==> @Test(test2) ==> @After

@before ==> @Test(test3) ==> @After

@Afterclass 

제한사항 : static 메소드로 선언을 해야한다. ==> 해당 메소드에서 사용하는 필드는 static 필드여야함 ==> 사용 빈도가 떨어지는 원인 


*/

private static final Logger logger = LoggerFactory.getLogger(FactorialTest.class);


private Factorial factorial;

@Before

public void setup() {

logger.debug("setup");

factorial = new Factorial(); 

}

public void test() {

logger.debug("test()");

/***Given***/ //현재 테스트 환경에서 주어진 조건을 기술 

// Factorial factorial = new Factorial();


/***When***/ //테스트를 검증 하고자 하는 행위( method call )

// private 이기 때문에 call 이 안된다. 나중에 다시 보고 public 으로 변경해줌

int result = factorial.calculate2(5); 

//120부븐은 예측값이고 result 는 결과값이다. 

//assertEquals(100, result);

/***Then***/ //코드를 실행한 결과와 예상한 값이 일치하는지 검증 


}

@Test

public void test2() {

logger.debug("test2()");

/***Given***/ //현재 테스트 환경에서 주어진 조건을 기술 

// Factorial factorial = new Factorial();


/***When***/ //테스트를 검증 하고자 하는 행위( method call )

// private 이기 때문에 call 이 안된다. 나중에 다시 보고 public 으로 변경해줌

int result = factorial.calculate2(8); 

//120부븐은 예측값이고 result 는 결과값이다. 

assertEquals(1, result);

/***Then***/ //코드를 실행한 결과와 예상한 값이 일치하는지 검증 


}



@Test

public void test3() {

logger.debug("test3()");

/***Given***/ //현재 테스트 환경에서 주어진 조건을 기술 

// Factorial factorial = new Factorial();


/***When***/ //테스트를 검증 하고자 하는 행위( method call )

// private 이기 때문에 call 이 안된다. 나중에 다시 보고 public 으로 변경해줌

int result = factorial.calculate2(3); 

//120부븐은 예측값이고 result 는 결과값이다. 

assertEquals(6, result);

/***Then***/ //코드를 실행한 결과와 예상한 값이 일치하는지 검증 


}

}





실행했을 때 












 

댓글