[CS] 테스트코드

말하는 감자·2025년 3월 20일

CS

목록 보기
32/33
post-thumbnail

단위 테스트

given-when-then 패턴

  • given(준비)
    • 테스트를 준비하는 과정
    • 테스트에 사용하는 값을 정의
  • when(실행)
    • 테스트하고자 하는 기능 실행
  • then(검증)
    • 기능을 실행한 후 결과 검증

First원칙

  • 효율적이고 좋은 단위 테스트를 위해 지켜야 하는 원칙

Fast

  • 빨라야한다

Independent

  • 테스트는 독립적으로 동작해야 한다.
  • 이전 테스트에 영향을 받으면 실패 원인을 찾기 어렵다.

Repeatable

  • 어떤 상황에서든 예상한 대로 테스트 결과가 나와야 한다.

Self-Validating

  • 출력 혹은 로그가 아닌 테스트 자체적으로 결과가 나와야한다.
  • assert

Timely

  • 적시에 테스트를 철저하게 작성 해야 한다

@ParameterizedTest

    @Test
    void testBoundary() {
        assertFalse(isInRange(1));  
    }

    @Test
    void testBoundary() {
        assertTrue(isInRange(2));   
    }

    @Test
    void testBoundary() {
        assertFalse(isInRange(99)); 
    }

    @Test
    void testBoundary() {
        assertTrue(isInRange(100)); 
    }

@ParameterizedTest 적용

	@ParameterizedTest
    @ValueSource(ints = {1, 2, 99, 100})
    void testBoundaries(int input) {
        boolean expected = input % 2 == 0;
        assertEquals(expected, isInRange(input));
    }

세부 구현에 의존적x

비즈니스 요구 사항이 변경되었을 때, 테스트 코드가 작동되지 않을 확률을 낮춤

    @Test
    @DisplayName("구매금액의 10퍼센트 적립")
	void testCalculateReward() {
        // Given
        int Amount = 10000;

        // When
        int points = pointService.calculateReward(Amount);

        // Then
        assertEquals(100, points);
    }
  • 현재 테스트 코드는 10퍼센트라는 세부 구현에 의존적
  • 만약 적립율이 변동되면 테스트 동작x
    @Test
    @DisplayName("기존 포인트와 적립율로 계산하여 새로운 포인트가 일치하는지 테스트")
    void testCalculateReward() {
        // Given
        int Amount = 1000;
		int exisitingPoints = pointService.getPoint();
        
        // When
        int newPoints = pointService.calculateReward(Amount);

        // Then
        int expectedPoints = existingPoints + (int)(Amount * Rate);

        assertEquals(expectedPoints, actualTotalPoints, "적립된 포인트가 예상과 일치해야 합니다.");
    }
  • 적립율이 변동되어도 문제없이 작동

실행 구절은 짧을수록 좋음

    @Test
    void testPurchaseProduct() {
        // Given
        Product product = new Product("TestProduct", 10);
		User buyer = new User();
        
        // When
        boolean result = buyer.purchase("TestProduct",5);
        product.remove("TestProduct",5)
        
        // Then
        assertEquals(5, product.getStock()); // 재고가 감소했는지 확인
        assertEquals(true, result); // 구매가 성공했는지 검증
    }

한가지 로직에서

    1. 구매자가 상품을 구매
    1. 재고 감소
      라는 두 가지 결과를 만들어내는데, 이는 하나는 실행되고 하나는 실행되지 않는 위험을 안고있기 때문에
      구현부를 수정할 필요가 있다(구매+감소)
profile
주니어개발자(?)

0개의 댓글