본문 바로가기

BackEnd/Spring

unit test에 대해

반응형

유닛테스트 사용법 : https://jkonury.tistory.com/196


1) 용어정리


- unit: 구성 단위 (여기서 말하는 구성단위는 프로그램의 기본 단위인 모듈)


- JUnit: 자바용 단위 테스트 작성을 위한 산업 표준 프레임워크다, Java에서 독립된 단위 테스트를 도와주는 framework!


- 모듈: 프로그램 내의 하나의 기능으로 생각하자(예: MS Word라는 프로그램이 있다는 가정하에 Word내에 있는 기능 중, 폰트 사이즈 선택 기능이 일종의 모듈이라 볼 수 있다)



2) unit test란?


유닛 테스트(unit test)는 컴퓨터 프로그래밍에서 소스 코드의 특정 모듈이 의도된 대로 정확히 작동하는지 검증하는 절차다.



- 코드를 가능한 한 작은 단위로 실행해보는 테스트를 작성하는것을 단위 테스트라 한다.


- 단위 테스트(unit test)는 프로그램의 기본 단위인 모듈을 테스트하기 때문에 모듈 테스트(module test)라고도 한다. 


- 구현 단계에서 각 모듈의 개발이 완료되는 시점에 정확히 구현되었는지, 정해진 기능을 정확히 수행하는지를 테스트 한다.


- 소스 코드의 특정 모듈이 의도된 대로 정확히 작동하는지 검증하는 절차다.


- 즉, 모든 함수와 메소드에 대한 테스트 케이스(Test case)를 작성하는 절차를 말한다. 


- 이를 통해서 언제라도 코드 변경으로 인해 문제가 발생할 경우, 단시간 내에 이를 파악하고 바로 잡을 수 있도록 해준다.


- 유닛테스트란 메서드를 테스트하는 또 다른 메서드이다. 다른코드를 테스트하는 코드


- 이상적으로, 각 테스트 케이스는 서로 분리되어야 한다. 이를 위해 가짜 객체(Mock object)를 생성하는 것도 좋은 방법이다.


3) unit test의 특징


단위 테스트가 개발된 모듈만 테스트하기 때문에 쉬울 것 같지만,시스템은 수많은 모듈이 서로 


보를 주고받으며 연결되어 있다. 즉 테스트할 모듈을 호출하는 모듈도 있고, 테스트할 모듈이 호


출하는 모듈도 있다. 따라서 한 모듈을 테스트하려면 그 모듈과 직접 관련된 상위 모듈과 하위


모듈까지 모두 존재해야정확히 테스트할 수 있다.


그러나 하나의 모듈을 테스트할 때 상위나 하위 모듈이 개발이 안 된 경우도 있다.


이때 상위나 하위 모듈이 개발될 때까지 기다릴 수는 없으므로 가상의 상위나 하위 모듈을 만들어 


사용 해야 한다.


테스트 드라이버(test driver) : 테스트 대상이 되는 모듈의, 상위 가상 모듈이다.

 

테스트 스텁(stub) : 테스트 대상이 되는 모듈의, 하위 가상 모듈이다.



4) 유닛테스트의 장점


- 문제점의 빠른 발견


프로그램을 작은 단위로 쪼개서 각 단위가 정확하게 동작하는지 검사하고 이를 통해 문제 


발생시 정확하게 어느 부분이 잘못되었는지를 재빨리 확인할 수 있게 해준다. 따라서 프로그


램의 안정성이 높아진다.


- 개발 시간 단축, 개발 효율 높임


유닛 테스트는 개발 시간을 증가 시키는 것처럼 보이지만 개발 기간 중 대부분을 차지하는


디버깅 시간을 단축시킴으로써 여유로운 프로그래밍을 가능케 한다.


자동화된 테스트를 통해 생산성 향상


- 코드의 변경(리팩토링)이 자유롭다


프로그래머는 언제라도 유닛 테스트를 믿고 리팩토링을 할 수 있다.


리팩토링 후에도 문제점의 빠른 발견과, 해당 모듈이 의도대로 작동하고 있음을 유닛 테스트


를 통해서 확신할 수 있다.


그래서 프로그래머들은 더욱 더 의욕적으로 코드를 변경할 수 있게 된다.


- 신뢰를 형성해준다


단위 테스트는 프로그램의 쪼개진 단위마다 테스트 결과가 매우 명확하다.


그렇기 때문에 개발 조직에서 개발자와 개발자간의 코드에 대한 신뢰를 형성한다.


- 통합이 간단하다


유닛 테스트는 유닛 자체의 불확실성을 제거해주므로 상향식(bottom-up) 테스트 방식에서 유


용하다. 먼저 프로그램의 각 부분을 검증하고 그 부분들은 합쳐서 다시 검증하는 통합 테스트


에서 더욱 더 빛을 발한다.


- 코드 설계가 개선된다. 


단위 테스트를 작성하려면 코드를 가능한 한 작은 단위로 고립시켜야한다.


그 과정에서 코드 설계의 문제점을 알게 된다.


의존성이 포함되지 않게 클래스를 고립시키기가 어려우면 코드가 너무 강하게 결합되어 있는 


것이고, 기본적인 기능이 여러 단위에 걸쳐 퍼져 있으면 코드의 응집력이 부족한 것이다.


그리고 단위 테스트 때문에 에지 케이스를 생각해내거나 굳이 하지 않아도 되는 다양한 입력


을 넣어보다가 버그를 찾아내기도 한다.


4) 통합 테스트 (Integration Test)


모듈을 통합하는 과정에서 모듈 간 호환성의 문제를 찾아내기 위해 수행되는 테스트이다.


즉, 모듈 간의 인터페이스가 올바르게 작동하는지를 테스트하게 된다.


예를 들어 MS Word라는 프로그램 내에 ‘폰트 사이즈’ 모듈과 ‘폰트 스타일’ 모듈을 통합한다고 가


정 해보자.


이때 만약 ‘폰트 스타일’ 모듈 구현 당시 폰트 사이즈가 변화할 수 있다는 것을 인지하지 않고 개발


을 하게 된다면 폰트 사이즈 모듈과 통합되는 과정에서 에러가 발생할 수 있다.


이를테면 기본 폰트 사이즈 9pt에서만 폰트 스타일이 먹히는 문제 일수 있다.


다시 정리하면 각각의 통합한 모듈이 올바르게 연계되어서 동작하는지를 테스트하게 된다.


모듈 테스트시 통합 기법으로는 크게 빅뱅 통합과 점진적 통합 기법이 있다.


빅뱅 통합: 전체 모듈을 모두 통합한 이후 통합 테스트를 수행하는 방식 이때 오류가 발생했을시 오류가 발생한 모듈을 찾기가 쉽지 않다는 단점이 있다.


점진적 통합: 한 번에 모듈을 통합하지 않고 점진적으로 통합하는 방식으로 하향식 통합, 상향식 통합 기법이 대표적이다.


점진적 통합 기법을 이용하게 되면 설계상의 오류를 빨리 발견할 수 있다는 장점이 있다.


참고 블로그:

https://ko.wikipedia.org/wiki/%EC%9C%A0%EB%8B%9B_%ED%85%8C%EC%8A%A4%ED%8A%B8

http://juranosaurus.blogspot.com/2015/09/unit-testing-with-junit-1-what-is-junit.html

https://osb0728.tistory.com/26

https://imasoftwareengineer.tistory.com/88


반응형

'BackEnd > Spring' 카테고리의 다른 글

스프링의 의존성 주입 방식  (0) 2020.01.28
lombok에 대해  (0) 2020.01.28
스프링 프레임워크에 대해  (0) 2020.01.24
maven이란?  (0) 2020.01.24
스프링 시큐리티의 내부구조  (0) 2020.01.14