P3] Ch 08. JUnit으로 테스트 하기

uuuu.jini·2022년 1월 17일
0
post-thumbnail

목차

  1. JUnit 이란
  2. Rest Api Crud 테스트 코드 작성
  3. 테스트 커버리지 확인

0. JUnit이란

intelliJ test code 실행시 밑의 에러 발생

There were failing tests. See the report at: file:///{프로젝트 경로}/index.html``` 

해결 : [File] > [Settings] > [Build, Execution, Deployment] > [Build Tools] > [Gradle]Run Testing Using옵션을 IntelliJ IDEA를 선택한다.
참고 자료

TDD[Test-Driven Development]

테스트 주도 개발에서 사용하며, 에러를 미리 방지하기 위해 단위 별로 검증하는 테스트 프레임 워크이다.

  • 단위 테스트: 작성한 코드가 기대하는 대로 동작하는지 검증하는 절차이다.
  • JUnit : 이러한 단위 테스트는 언어 별로 지원하며 그 중 JUnit은 Java 기반의 단위테스트를 위한 프레임워크로서 annotation기반으로 지원하고, Assert를 통하여 (예상,실제)를 통해 검증한다.

테스를 하기위해 Test하위의 java파일 하위에 테스트를 하기 위한 클래스를 작성하며 이 클래스에서 모든 테스트가 이루어지므로 main을 건드리지 않고 쉽게 테스트를 할 수 있다. 테스트를 위한 클래스 내부의 메소드에는 @Test어노테이션을 작성하고 원하는 값과 결과값의 비교를 위해서는 Assertions.assertEquals(원하는값,결과값)을 넣고 확인한다. 밑의 예제를 보자.

    @Test
    public void dollar(){

        MarketApi marketApi = new MarketApi();
        DollarCalculator dollarCalculator = new DollarCalculator(marketApi);
        dollarCalculator.init();

        Calculator calculator = new Calculator(dollarCalculator);

        Assertions.assertEquals(22000, calculator.sum(10, 10)); 
        Assertions.assertEquals(0, calculator.minus(10, 10));
    }

모킹(Mocking)

특정한 객체가 어떤 메소드를 호출할 때 내가 원하는 값을 리턴하도록 해주는 기능이다. 모킹을 사용할 클래스에 @ExtendWith(MockitoExtension.class)를 지정해준 후 모킹처리를 할 변수에 @Mock 어노테이션을 붙여준다. 이 모킹을 사용하기 위해서는 dependency에 해당 Mockito dependency를 추가한 후 사용할 수 있다. [Maven repository]에서 해당 dependency를 검색하여 build.gradle에 추가해 준다.

  @BeforeEach //test가 일어나기 전에 실행시킨다.
    public void init(){
        Mockito.lenient().when(marketApi.connect()).thenReturn(3000);
        //marketApi의 connect가 일어날때 내가 원하는 값을 리턴 시킨다. (thenReturn 안의 값을 리턴)
    }

test를 진행할 메서드에서 해당 모킹된 객체를 가져와서 사용하면 그 객체의 메서드의 결과값으로 내가 지정한 값이 반환되므로 그 값으로 다른 test를 진행할 수 있는 편의성을 제공한다.


1. Rest Api Crud test

@RequiredArgsConstructor : final이나 @Notnull이 붙은 필드에 대한 생성자를 생성해준다.

테스트를 진행할때에는 해당 test하위에 test할 클래스의 경로와 동일한 경로에서 테스트 클래스를 작성하여야 하며 이름또한 동일해야 한다. 테스트를 진행할 메서드에는 항상 @Test 어노테이션이 필요하다.(이거 안붙여놓고 실행 왜안되는지 한참 찾았음..)

통합 테스트

@SpringBootTest어노테이션을 해당 test를 위한 class에 붙여준다. 이 어노테이션은 모든 빈이 올라간 상태에서 테스트를 진행하므로 전체 클래스에 대한 테스트가 가능하다. Mocking을 위해서는 @MockBean어노테이션을 해당 모킹할 변수에 붙여준다. 이외에 지정하는 것은 위와 동일하다 .

Spring에서는 의존객체를 직접 주입해주지 않아도 @Autowired를 통해 자동으로 빈을 찾아서 주입해준다. [편함 !]

단위 테스트

특정 클래스에만 테스트를 진행하고 싶은 겨웅에는 주입받을 클래스를 모두 @Import()를 통해 빈 등록을 해주어야 한다. 여기서는 controller에 대한 테스트를 진행하기 위해 @WebMvcTest()를 통해 해당 매개변수로 테스트할 클래스를 넘겨주었다. 즉 매개변수로 들어온 클래스에 대해서만 웹 테스트를 진행할 것이라는 걸 알려주는 어노테이션이다. web test 를 위해서는 또한 @AutoConfigureWebMvc어노테이션이 필요하다.

Mvc를 모팅으로 테스트하기 위해 MockMvc객체를 생성하였다.

@Autowired
private MockMvc mockMvc; 

> Get test

> Post test


Delete 와 put 방식에서도 테스트는 동일하다. 즉, 이 방법을 통해서 직접 해당 웹서버에 요청을 하지 않고 개발환경에서 테스트가 가능하다. (너무 어렵다,,)


2. Test Coverage 확인

Jacoco

java 코드의 코드 커버리지를 체크 하는 라이브러리이다. 결과를 html,xml,csv등으로 확인이 가능하다.

해당 라이브러리 사용을 위해 build.gradle에 id 'jacoco'를 작성해준다.

이후 [gradle]->[Tasks]->[verification]->[test]를 더블클릭하여 test를 실행시킨 후 그 위의 [jacocoTestReport]를 클릭하면 해당 테스트 리포트가 생성된다. 이 리포트는 build->reports->test->html 하위에서 확인이 가능하다.

profile
멋쟁이 토마토

0개의 댓글