ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 테스트 더블: 출력값
    테스팅 관련/개념 2020. 8. 9. 23:40

     

     

    이어지는 시리즈

     


     

    더미 객체, 테스트 스텁, 페이크 객체 → 입력값 제공
    모의 객체(Mock), 스파이 객체 → 입력값, 세밀한 모니터링 기능 제공

     

    테스팅은 function 출력값을 확인하는 것보다 더 많은 것을 포함한다.

    만약, function이 void값을 리턴한다면?

     

     


    상호작용(interactions)을 테스트할 것!

    - 올바른 순서대로 메소드가 호출되었는지

    - 메소드가 호출 되었는지/안 되었는지

    - 메소드 호출에 적절한 파라미터들이 사용되었는지

     


     

    모의 개체페이크 객체들의 상호작용을 관찰할 수 있게 해준다

     

    // Mocking은 객체 간의 상호작용을 결정하는데 사용된다
    // AirlineTravelService에 대해 호출되는 메소드를 보여주는 예제
    
    @Test
    public void testBookFlight() throws Exception {
        // 더미 객체 생성
        AirlineTravelService stubSvc = mock(AirlineTravelService.class);
        
        // 데이터 스텁
        Date d = new Date();
        Flight f1 = new Flight(d, "Delta", "DL1029", BigDecimal.valueOf(450.13));
        Flight f2 = new Flight(d, "American", "AM245", BigDecimal.valueOf(375.13));
        when(stubSvc.confirmFlight(f1)).thenReturn(true);
        when(stubSvc.confirmFlight(f2)).thenReturn(false);
        
        EmployeeTravelScheduler ets = new EmployeeTravelScheduler(stubSvc);
        Employee empl = createDummyEmployee();
        PaymentMethod method = mock(PaymentMethod.class);
        assertTrue(ets.bookFlight(empl, f1, method));
        assertFalse(ets.bookFlight(empl, f2, method));
    
        // Mocking 결과:
        // confirmFlight 메소드는 2번 호출되었다
        verify(stubSvc, times(2)).confirmFlight(any(Flight.class));
        // bookflight 메소드는 flight f1에 의해 1번 호출되었다
        verify(stubSvc).bookFlight(f1, method);
    
        // InOrder을 사용하여, 모의객체를 사용했을 때 메소드가 호출된 순서 확인
        InOrder inOrder = InOrder(stubSvc);
        inOrder.verify(stubSvc).confirmFlight(any(Flight.class));
        inOrder.verify(stubSvc).bookFlight(f1, method);
        
    }

     

    스파이 객체실제 객체들의 상호작용을 관찰할 수 있게 해준다

     

    // 스파이 예제
    // 실제 객체들의 상호작용을 점검하고, 그들의 동작을 무시할 수 있다
    
    @Test
    public void testBookFlgihtSpy() throws Exception {
    
        AirlineTravelService stubSvc = mock(AirlineTravelService.class);
        
        // 데이터 스텁
        Date d = new Date();
        // 스파이 생성
        List<Flights> l = spy(new ArrayList<>());
        Flight f1 = new Flight(d, "Delta", "DL1029", BigDecimal.valueOf(450.13));
        Flight f2 = new Flight(d, "American", "AM245", BigDecimal.valueOf(375.13));
        l.add(f1);
        l.add(f2);
        
        when(f1.getPrice()).thenReturn(BigDecimal.valueOf(200.00));
        when(stubSvc.findFlights(any(Date.class)))
        	.thenReturn();
            
        EmployeeTravelScheduler ets = new EmployeeTravelScheduler(stubSvc);
        Employee empl = createDummyEmployee();
        assertEquals(ets.findFlights(empl, d).get(0), f2);
        
        // Flight이 2번 추가되었는지 확인 
        verify(l, times(2)).add(any(Flight.class));
        
    }

     

    '테스팅 관련 > 개념' 카테고리의 다른 글

    소프트웨어 테스트 수명 주기(STLC)  (0) 2020.10.04
    SW 테스트 7가지 원리  (0) 2020.09.29
    테스트 더블: 입력값  (0) 2020.08.09
    테스트 더블: 소개  (0) 2020.08.09
    소프트웨어 테스팅 프로세스 레벨  (0) 2020.06.20
Designed by Tistory.