TIL

Unit(단위 테스트)와 Integration(통합 테스트) 정리 및 예시

빈코 2024. 4. 3. 09:19

Unit, Integration

개요

개발 테스트 방법은 크게 Unit(단위) 테스트와 Integration(통합) 테스트, E2E(End-to-End) 테스트로 나뉩니다. 오늘의 포스팅은 단위 테스트와 통합테스를 다뤄보고 E2E테스트는 다음 포스팅에서 진행할 예정입니다. 개발 테스트는 소프트웨어의 각 구성 요소와 각각의 상호작용을 테스트하는 것이기 때문에, 개발 과정에서 무척 중요합니다. 3가지의 테스트 방법 모두 장단점이 있으니 알아두시면 좋을 것 같습니다😁

 

개발 테스트 종류📙

출처 : https://fe-developers.kakaoent.com/2023/230209-e2e/

 

개발 테스트는 위의 그림과 같이 Unit(단위 테스트), Integration(통합 테스트), E2E(End to End 테스트)로 나뉩니다. 서론에서 언급했듯이 오늘의 포스팅은 통합테스트까지만 포스팅해볼게요 :)

 

Unit(단위 테스트)📘

단위 테스트 Unit은 Java 단위 테스트 프레임워크인 JUnit을 사용하여 소프트웨어의 각 부분이 개별적으로 정확하게 동작하는지 확인하는 데 사용합니다. 단위 테스트는 코드의 작은 부분을 테스트하여 해당 부분이 예상대로 작동하는지를 확인하는 프로세스입니다. 

 

public class Calculator {
    public int add(int a, int b) {
        return a + b;
    }

    public int subtract(int a, int b) {
        return a - b;
    }
}

 

위와 같은 Calculator라는 계산기 클래스가 있을 때, JUnit을 사용하여 단위 테스트를 만든다면,

 

import static org.junit.Assert.assertEquals;
import org.junit.Test;

public class CalculatorTest {

    @Test
    public void testAdd() {
        Calculator calculator = new Calculator();
        int result = calculator.add(3, 4);
        assertEquals(7, result); // 기대값과 결과값이 같은지 확인
    }

    @Test
    public void testSubtract() {
        Calculator calculator = new Calculator();
        int result = calculator.subtract(5, 2);
        assertEquals(3, result); // 기대값과 결과값이 같은지 확인
    }
}

 

Calculator 클래스의 add() 함수와 subtract() 함수를 위와 같이 각각 테스트하는 단위 테스트를 만들 수 있습니다. 

 

Integration(통합 테스트)📒

통합 테스트 Integration은 개별적으로 테스트된 모듈이 서로 상호작용하는 방식을 검증하는 테스트입니다. 모듈간의 인터페이스 및 상호작용을 확인하여 전체 시스템의 동작을 테스트하는 것을 의미합니다. 단위 테스트 이후에 수행되며, 시스템의 각 구성 요소가 예상대로 작동하는지에 대한 테스트입니다.

 

public class Account {
    private String accountId;
    private int balance;

    public Account(String accountId, int initialBalance) {
        this.accountId = accountId;
        this.balance = initialBalance;
    }

    public String getAccountId() {
        return accountId;
    }

    public int getBalance() {
        return balance;
    }

    public void setBalance(int balance) {
        this.balance = balance;
    }
}

 

Account 클래스는 계좌 클래스입니다. 각각의 계좌는 계좌 아이디(accountId)와 금액(balance) 값이 있습니다. getBalance()는 계좌의 잔액을 반환하고, setBalance()는 계좌의 잔액을 설정합니다.

 

import java.util.HashMap;
import java.util.Map;

public class AccountManager {
    private Map<String, Account> accounts;

    public AccountManager() {
        this.accounts = new HashMap<>();
    }

    public Account createAccount(String accountId, int initialBalance) {
        Account account = new Account(accountId, initialBalance);
        accounts.put(accountId, account);
        return account;
    }

    public Account findAccountById(String accountId) {
        return accounts.get(accountId);
    }
    
    public void transfer(String sourceAccountId, String targetAccountId, int amount) {
        Account sourceAccount = accounts.get(sourceAccountId);
        Account targetAccount = accounts.get(targetAccountId);

        if (sourceAccount == null || targetAccount == null) {
            throw new IllegalArgumentException("계좌가 없습니다.");
        }

        if (sourceAccount.getBalance() < amount) {
            throw new IllegalArgumentException("계좌 잔액이 부족합니다.");
        }

        sourceAccount.setBalance(sourceAccount.getBalance() - amount);
        targetAccount.setBalance(targetAccount.getBalance() + amount);
    }
}

 

예시로 만든 AccountManager 클래스는 계좌를 생성하고 조회하는 기능이 포함되어 있습니다. 'createAccount()' 함수는 매개변수로 받은 계좌 ID와 초기 금액을 사용하여 새 계좌를 생성하여 반환하고, 'findAccountById()' 함수는 주어진 계좌 ID를 받으면 해당 계좌를 찾아 반환합니다. 'transfer()' 함수는 이체할 계좌 ID와, 이체받을 계좌 ID, 금액을 매개변수로 받아서 각각의 계좌를 계좌 ID로 찾은 후에 이체를 진행하는 메서드입니다.

 

import static org.junit.Assert.assertEquals;
import org.junit.Test;

public class AccountTransferIntegrationTest {

    @Test
    public void testAccountTransfer() {
        // 계좌 생성
        AccountManager accountManager = new AccountManager();
        Account Aaccount = accountManager.createAccount("A", 1000);
        Account Baccount = accountManager.createAccount("B", 500);

        // 이체 서비스를 통해 계좌 간 이체
        TransferService transferService = new TransferService();
        transferService.transfer(Aaccount, Baccount, 500);

        // 데이터베이스에서 계좌 정보 확인
        Account AaccountFromDB = accountManager.findAccountById("A");
        Account BaccountFromDB = accountManager.findAccountById("B");

        // 계좌 잔액 확인
        assertEquals(500, AaccountFromDB.getBalance());
        assertEquals(1000, BaccountFromDB.getBalance());
    }
}

 

위에서 만든 AccountManager 클래스의 상호작용 테스트를 진행한다면, 계좌를 2개를 생성하고 이체를 진행 후에 각각의 계좌의 잔액을 확인하는 테스트를 구성했습니다. 

 

더 자세히 설명하자면 A계좌는 초기에 1000원을 초기 금액을 세팅하고, B계좌는 초기에 500원을 초기 금액으로 세팅을 했습니다. 이후에 transfer 메서드를 활용하여 계좌이체를 진행을 하였고, 이체 후에 각각의 계좌 ID를 통해 잔액을 확인하였습니다. 테스트가 정상적으로 동작되었는지 확인하기 위해 assertEquals 함수를 활용해서 잔액을 확인하고 테스트는 마무리되었습니다😊

 

마치며

지금까지 Unit 테스트와 Integration 테스트를 알아보았습니다. 많은 개발자 분들이 모든 테스트는 Unit테스트라고 오해하시는 경우도 있는데, 각각의 테스트는 엄연히 다르기 때문에 이번 기회에 테스트 방법들을 숙지해서 더 나은 개발 환경을 만들면 좋을 것 같습니다😄


👨‍👩‍👦‍👦 오픈채팅방 운영

취업을 준비하는 예비 개발자분들을 위한 질문&답변할 수 있는 공간을 만들었습니다. 취업과 이직을 하기 위해서 어떤 걸 중점적으로 준비해야 하는지부터 포트폴리오&이력서 작성법 등 다양한 질문들을 받고 답변을 드립니다. 참여하셔서 다양한 정보 얻고 가시면 좋을 것 같네요😁

 

참여코드 : 456456

https://open.kakao.com/o/gVHZP8dg

 

비전공 개발자 취업 준비방(질문&답변)

#비전공 #개발자 #취업 #멘토링 #부트캠프 #국비지원 #백엔드 #프론트엔드 #중소기업 #중견기업 #자바 #Java #sql

open.kakao.com

 

관련 포스팅

*E2E(End-to-End) 테스트 요약 정리

반응형