모든 개발자들은 프로젝트를 할 때 테스트는 반드시 필요한 필수조건이다.
테스트종류에는 위의 사진과 같이 (아래서부터)단위 테스트, 서비스 테스트, 사용자 인터페이스 테스트 총 3가지가 있다.
Unit Tests(단위 테스트)
작은 컴포넌트, 하나의 기능을 하는 함수처럼 잘개 쪼개어 테스트 하는 방식
@Test
public void 게시글_저장_불러오기(){
//given
String title="테스트 게시글";
String content="테스트 본문";
postsRepository.save(Posts.builder()
.title(title)
.content(content)
.author("junseck")
.build());
//when
List<Posts> postsList=postsRepository.findAll();
//then
Posts posts = postsList.get(0);
assertThat(posts.getTitle()).isEqualTo(title);
assertThat(posts.getContent()).isEqualTo(content);
}
단위 테스트는 애플리케이션을 구성하는 하나의 기능이 올바르게 동작하는지를 독립적으로 테스트하는 것을 의미한다.
위의 "게시글_저장_불러오기()" 처럼 구현단계에서 각각의 모듈 개발을 다한 후, 명세서의 내용대로 개발이 되었는지를 확인한다.
<화이트박스 테스트>
소프트웨어 혹은 제품의 내부 구조, 동작을 세밀하게 검사하는 테스트 방식으로, 외부에서 요구사항에 따른 예상
결과값을 테스트하는 것과 다르게 내부 소스 코드를 테스트하는 기법으로 사용자가 들여다 볼 수 없는 구간의 코드 단위 테스트를 의미
ㆍ화이트박스 테스트는 설계된 절차에 초점을 둔 구조적 테스트 -> 테스트 과정의 초기에 적용
ㆍ모듈 안의 동작을 직접 세밀하게 관찰
<블랙박스 테스트>
소프트웨어의 내부 구조나 작동 원리를 모르는 상태에서 소프트웨어의 동작을 검사하는 방법
-> 검사할 때 소프트웨어의 내부 구조나 정보는 필요없고 특징, 요구 사항 검사를 위해 공개된 사항들을 통해 검사
즉, 개발자입장이 아닌 사용자 입장에서 소프트웨어 혹은 제품에 대한 요구사항과 결과물이 일치하는지 확인
ㆍ사용자의 요구사항 명세를 보면서 테스트 하는 것 -> 주로 구현된 기능을 테스트
ㆍ소프트웨어 인터페이스에서 실시하는 테스트
ㆍ테스트 과정의 후반부에 적용
단위 테스트는 위처럼 화이트 박스 테스트와 블랙박스 테스트를 사용할 수 있지만 구조적으로 잘 동작하는지를 파악하기 위해 주로 화이트박스 테스트를 사용한다.
단위테스트는 프로그램의 버그를 줄이고, 코드의 퀄리티를 높이기 위해 만든다.
하지만 예를 들어 게시글을 불러오기라는 기능을 테스트할 때 게시글 작성이라는 모듈을 작성하지 않았다면 테스트를 진행하지 못하고 게시글 작성이라는 모듈을 만들때까지 기다려야 하지만 테스트 드라이버를 이용하면 가능하다.
테스트 드라이버란?
상위 모듈의 역할을 하는 가상의 모듈을 의미
ㆍ 반대로 테스트 스텁(stub)가 있는데 이는 하위 모듈의 역할을 하는 모듈을 의미
정리하면, 드라이버와 스텁은 테스트할 때 필요한 기능만 제공하도록 구현
단위테스트 사용 이유
- 만약 프로그램의 크기가 크고, 메모리가 많이 들고, 다른 리소스가 필요한 경우 로컬환경에서 코드를 수정할 때마다 매번 실행시키기 어렵기 때문에 단위테스트를 사용한다.
- 의존성이 있는 다른 객체에서 버그가 나는 것을 방지하기 위해서 사용한다.
- 요즘은 TDD(테스트 주도 개발방법론)처럼 먼저 테스트 코드를 작성한 후 실제 서비스를 구현하는 방법도 사용한다.
<단위 테스트 장점>
ㆍ문제점 발견이 쉽다.
프로그램을 작은 단위로 조깨서 테스트를 하기 때문에 어느 부분이 잘못되었는지 빠르게 파악이 가능하다.
따라서 프로그램의 안정성이 향상된다.
ㆍ변경이 쉽다.
ㆍ통합이 간단하다
Integration Tests(통합 테스트)
단위 테스트보다 더 큰 동작을 달성하기 위해 여러 모듈을 모아 각각의 객체들이 의도한대로 협력하는지
확인하는 테스트
통합 테스트는 단위테스트와 달리 개발자가 변경할 수 없는 부분(ex: lib)까지 묶어서 검증할 때 사용한다.
@SpringBootTest
class BoardwebserviceApplicationTests {
@Test
void contextLoads() {
}
}
또한 통합테스트의 종류에는 DB통합테스트도 존재한다.
- 데이터 베이스 시작
- 프로젝트를 DB에 연결
- 코드 내에서 데이터베이스에 데이터를 쓰는 함수를 트리거함
- 예상한 데이터가 Read를 통해 데이터베이스에 잘 기록이 되었는지 확인
통합 테스트의 장점
- 단위 테스트에서 찾을 수 없는 버그까지 발견할 수 있다.
- 통합테스트에선 환경버그까지도 잡아낼 수 있다.
통합 테스트의 단점
- 단위 테스트보다 더 많은 코드를 테스트하기 때문에 신뢰성이 떨어질 수 있다.
- 전체 코드를 전부 다 테스트하기 때문에 버그가 발생했을 때 어디서 버그가 발생했는지 확인하기 어렵고, 또한
이 때문에 유지보수하기가 어렵다
그럼 단위 테스트, 통합 테스트 중에 무엇을 이용하는 것이 더 좋을까?
보통 통합 테스트는 단위테스트로 만족스럽지 않을 때 사용한다.
통합테스트는 단위 테스트보다 작성하기 더 까다롭고, 오랜시간이 걸린다는 단점이 있다.
즉, 굳이 꼭 통합테스트를 사용해야 할 상황이 아니라면 단위 테스트를 이용하여 테스트하는 편이 좋다.
'JAVA' 카테고리의 다른 글
[JAVA] 동시성 & Thread (0) | 2024.03.03 |
---|---|
[JAVA] I/O스트림 (0) | 2023.05.23 |
[JAVA] 제네릭 < > (0) | 2023.05.23 |
[JAVA] Enum(열거 타입) (0) | 2023.05.17 |
[JAVA] Thread & Runnable & Multi Thread란? (0) | 2023.05.03 |