카테고리 없음

[CleanCode & TDD] - 2, 단위 테스트

스프링피바라기 2021. 11. 21. 22:17

main method

class Main{
	public static void main(String ... args){
    	...
    }
}

 

- 프로그램을 시작

- 구현한 프로그램을 테스트

 

우리는 main method를 활용해 test를 진행할 예정이다.

 

production code

프로그램의 구현을 담당하는 부분으로,

사용자가 실제로 사용하는 소스 코드를 의미한다.

 

test code

production code가 정상적으로 동작하는지를 확인하는 코드이다.

 

 

그러나

main method에서 test 를 진행하면 여러 문제점이 발생한다.

- production code와 test code가 클래스 하나에 존재한다.

  : 클래스 크기가 커지고, 복잡도가 증가한다.

- test code가 실 서비스에 같이 배포된다.

- main method 하나에서 여러 개의 기능을 테스트하게 된다.

- method 이름을 통해 어떤 부분을 테스트하는지 의도를 드러내기 힘들다.

  : 기본적으로 method 명으로 테스트 단위를 구분짓는다.

- 테스트 결과를 수동으로 확인해야한다.

 

 

따라서

우리는 이런 불편함을 덜고자

JUnit 을 활용한다.

 

 

JUnit

- main method를 통해 테스트할때 발생하는 문제점을 해결하기 위한 도구

 

버전은 크게 5.x 와 4.x 둘로 나뉘며,

최신 Spring 에서는 5버전을 위주로 지원을 해준다.

 

JUnit 5.x version

- 어노테이션을 활용해 테스트 코드를 구현한다.

@Test

@BeforeEach

@AfterEach

Assertions class의 static assert method를 활용해 테스트 결과 검증

 

상세한 코드와 어노테이션 활용은 개인 노션 을 참고

 

JUnit 4.x version

- 어노테이션을 통해 테스트코드를 구현하는 방법은 5.x version과 같다.

어노테이션 패키지의 위치와 이름이 다르다. 

(다른 부분은 5.x 버전과 같다)

@org.junit.Test

@org.junit.Before

@org.junit.After

Assert class의 static assert method를 활용해 테스트 결과 검증

 

 

우리는 단위 테스트에 익숙해져야한다.

 

실제 application을 개발하면서 추가로 적용될 라이브러리나 API의 활용법을 모를때

단순히 구글링을 통해 붙혀넣기 식의 코딩은 

개발자로서 성장하는 것이 아니라,

단순히 문서작업하는것에 불과하다고 생각한다.

 

특히 개발하면서 이런 생각이 들었을것이다.

"어? 다른 메서드는 뭐가있지?"

"이 메서드는 무슨 역할이지?"

"매개 변수로 다른 타입도 들어갈 수 있네?"

등등

 

이런식으로 내가 처음 접하는 라이브러리와 API를 여러 방향으로 테스트해보면서

적용하는것이 올바른 방식이다.

 

하지만 application을 개발하면서 그러기엔 쉽지않고,

만약 하더라도 컴파일이 되기위해서는 연관된 부분의 수정과 같은 수고가 들어가며

하나의 API를 확인해보는데 application 전체가 동작되어야한다.

 

비효율적이다.

 

따라서 우리는 JUnit을 활용한 단위 테스트에 익숙해져야한다.

또한 위에서 말한 API 혹은 라이브러리에 익숙해지는 테스트를 학습 테스트라고한다.

 

예시 코드

public class Main{
	@Test
    public void split(){
    	String[] values = "1".split(",");
        assertThat(values).contains("1");
        values = "1,2".split(",");
        assertThat(values).containsExactly("1","2");
    }
    
    @Test
    public void substring(){
    	String input = "(1,2)";
        String result = input.substring(1, input.lenght() - 1);
        assertThat(result).isEqualTo("1,2");
    }
    
}

 

 

 

 

 

 

ref

"클린코드는 왜 중요한가?" - youtube 박재성

https://edu.nextstep.camp/s/RFY359FE

 

플레이그라운드

 

edu.nextstep.camp

 

"daehwan2yo"   contact

software, soongsil univ  <  now

udsward@gmail.com  < email

https://github.com/daehwan2yo <    git

 

daehwan2yo - Overview

daehwan2yo has 15 repositories available. Follow their code on GitHub.

github.com