로컬 테스트

로컬 테스트는 개발자 PC에서 거래 혹은 모듈을 테스트하는 것을 의미하며, PC에서 실행하기 때문에 FEP, EAI 연계 테스트는 불가능하다.

로컬 테스트는 JUnit 테스트를 이용하여 수행한다.

1. 단위 테스트

Mock을 이용한 테스트를 말한다.

1. 패키지 익스플로러에서 우클릭 → New → JUnit 테스트 케이스를 선택한다.

chapter2/test001
Figure 1. JUnit 테스트 케이스

2. 유형에 Mock을 이용한 단위 테스트를 선택하며, 이름과, 논리이름을 입력하겨 생성한다.

chapter2/test002
Figure 2. 단위테스트

3. 생성된 template에 Test소스를 작성한다.

            /**
             * Single Employee Info Component 테스트
             *
             * @author
             */
            @ExtendWith( SpringExtension.class)
            @ContextConfiguration(classes = {EmployeeComponent.class})
            public class EmployeeComponentTest {
                private Logger logger= LoggerFactory.getLogger(getClass());

                @Autowired
                private EmployeeComponent employeeComponent;

                @MockBean
                private EmployeeDbio employeeDbio;


                @BeforeEach
                public void setup()
                {
                }

                /**
                 * Single Select
                 */
                @Test
                @DisplayName("Single Select 테스트")
                public void testGetEmployee(){

                    logger.debug("[getEmployee] 메소드의 테스트를 시작 합니다.");

                    /*
                     * 테스트 대상 메소드 내부에서 호출하는 메소드의 입/출력 값의 조건을 설정 합니다.
                     */
                    {
                        /*
                         * Employee Info Single Select
                         */
                        // TODO 테스트 조건에 맞는 입력 값을 지정 하십시오.
                        int mockInput= 0;

                        // TODO 지정한 입력 값으로 메소드를 호출 했을 때 반환 하는 값을 지정 하십시오.
                        EmployeeIO mockResult= new EmployeeIO();
                        //mockResult.setEmpNo(0); // Employee id
                        ....

                        // 메소드가 지정한 입력 값으로 호출 될 때 지정한 값을 반환 하도록 설정 합니다.
                        BDDMockito.given(employeeDbio.selectEmployee(mockInput)).willReturn(mockResult);
                    }

                    /*
                     * TODO 실제 테스트할 메소드의 입력 값을 지정 하십시오.
                     */
                    int input= 0;

                    /*
                     * TODO 메소드 호출 결과로 기대하는 출력 값을 지정 하십시오.
                     */
                    EmployeeIO expectedResult= new EmployeeIO();
                    //expectedResult.setEmpNo(0); // Employee id

                    try{
                        // 실제 테스트할 메소드 호출
                        EmployeeIO result= employeeComponent.getEmployee(input);

                        assertEquals(expectedResult, result, "Response failed");
                    }
                    catch(Exception e){
                        fail(e);
                    }


                    logger.debug("[getEmployee] 메소드의 테스트가 종료 되었습니다.");
                }

                .....
            }
  1. JUnit 테스트 Bean 생성 클래스 정의 : JUnit 테스트 시 Context에 생성/등록이 필요한 Bean Class를 정의한다.

  2. Mock 테스트를 위한 초기화 처리를 구현한다.

  3. Mock Bean 생성 : Mock 으로 사용할 Bean을 정의한다. (실제 DB에 접근하기가 어려우므로 DBIO의 경우 Mock으로 Bean을 정의)

  4. Mock Bean의 입 출력값 설정

  5. @Test Annotation 메소드를 작성한다.

결과는 다음과 같다.

            /**
             * Single Employee Info Component 테스트
             *
             * @author
             */
            @ExtendWith( SpringExtension.class)
            @ContextConfiguration(classes = {EmployeeComponent.class})
            public class EmployeeComponentTest {
                private Logger logger= LoggerFactory.getLogger(getClass());

                @Autowired
                private EmployeeComponent employeeComponent;

                @MockBean
                private EmployeeDbio employeeDbio;

                // 초기화를 위한 설정
                @Autowired
                private ApplicationContext applicationContext;
                private boolean init = false;

                @BeforeEach
                public void setup()
                {
                    if(init == false) {
                        // Static Class에 대한 Mock 정의
                        // DefaultApplicationContext.getBean
                        mockStatic(DefaultApplicationContext.class);
                        BDDMockito.given(DefaultApplicationContext.getBean(ArgumentMatchers.any()
                                , ArgumentMatchers.eq(EmployeeDbio.class))).willReturn(employeeDbio);

                        // ApplicationContextUtils BxmApplicationProperties
                        mockStatic(ApplicationContextUtils.class);
                        BxmApplicationProperties bxmApplicationProperties = new BxmApplicationProperties();
                        BDDMockito.given(ApplicationContextUtils.getBxmApplicationProperties()).willReturn(bxmApplicationProperties);
                        BDDMockito.given(ApplicationContextUtils.getApplicationContext()).willReturn(applicationContext);

                        // DefautApplicationException
                        mockStatic(MessageCodeManager.class);
                        BDDMockito.given(MessageCodeManager.getMessageId(ArgumentMatchers.any())).willAnswer(new ReturnsArgumentAt(0));
                        mockStatic(ResolvedMessageApplicationException.class);

                        init = true;
                    }
                }

                /**
                 * Single Select
                 */
                @Test
                @DisplayName("Single Select 테스트")
                public void testGetEmployee(){

                    logger.debug("[getEmployee] 메소드의 테스트를 시작 합니다.");

                    /*
                     * 테스트 대상 메소드 내부에서 호출하는 메소드의 입/출력 값의 조건을 설정 합니다.
                     */
                    {
                        /*
                         * Employee Info Single Select
                         */
                        // TODO 테스트 조건에 맞는 입력 값을 지정 하십시오.
                        int mockInput= 7369;

                        // TODO 지정한 입력 값으로 메소드를 호출 했을 때 반환 하는 값을 지정 하십시오.
                        EmployeeIO mockResult= new EmployeeIO();
                        mockResult.setEmpNo(7369);
                        mockResult.setDeptNo(10);
                        mockResult.setEmpNm("Tester");

                        // 메소드가 지정한 입력 값으로 호출 될 때 지정한 값을 반환 하도록 설정 합니다.
                        BDDMockito.given(employeeDbio.selectEmployee(mockInput)).willReturn(mockResult);
                    }

                    /*
                     * TODO 실제 테스트할 메소드의 입력 값을 지정 하십시오.
                     */
                    int input= 7369;

                    /*
                     * TODO 메소드 호출 결과로 기대하는 출력 값을 지정 하십시오.
                     */
                    EmployeeIO expectedResult= new EmployeeIO();
                    expectedResult.setEmpNo(7369);
                    expectedResult.setDeptNo(10);
                    expectedResult.setEmpNm("Tester");

                    try{
                        // 실제 테스트할 메소드 호출
                        EmployeeIO result= employeeComponent.getEmployee(input);

                        assertEquals(expectedResult, result, "Response failed");
                    }
                    catch(Exception e){
                        fail(e);
                    }


                    logger.debug("[getEmployee] 메소드의 테스트가 종료 되었습니다.");
                }

                .....
            }

5. Test는 Run As → Junit test에서 실행한다.

chapter2/test004
Figure 3. Junit test

6. Test 결과.

chapter2/test005
Figure 4. Junit test 결과

2. 통합 테스트

실제로 Application을 기동하여 테스트 하는 것을 말한다.

1. 패키지 익스플로러에서 우클릭 → New → JUnit 테스트 케이스를 선택한 후, 유형에 통합테스트를 선택하여 작성한다.

chapter2/test006
Figure 5. 통합테스트

2. 생성된 샘플 소스에 test코드를 작성한다.

            /**
             * 사원관리 Controller 테스트
             *
             *
             *
             * @author sysadmin
             */
            @ExtendWith( SpringExtension.class)
            @SpringBootTest(
                webEnvironment= WebEnvironment.DEFINED_PORT,
                classes= { BxmCloudApplication.class},
                properties= { /*1. Spring Boot 프로퍼티 설정 */
                        "server.port=8081",
                        "spring.config.name=bxframeworkForTest",
                        "logging.level.root=info"})
            @ActiveProfiles( { "local"}) /* 2.Spring Profile 설정*/
            public class EmployeeControllerTest {
                private Logger logger= LoggerFactory.getLogger(getClass());
                // TODO Mock 으로 사용할 컴포넌트를 알맞게 수정 하십시오.
                //@Autowired
                //private TestComponent component; /* 4.서비스/컴퍼넌트/DBIO Bean 주입*/

                @BeforeEach
                public void setup() {

                }

                /**
                 * Single select
                 *
                 * {@link sample.online.controller.EmployeeController#getEmployee}
                 */
                @Test
                @DisplayName("Single select 테스트")
                public void testGetEmployee(){

                    logger.debug("[getEmployee] 메소드의 테스트를 시작 합니다.");

                    /*
                     * TODO 테스트할 메소드의 입력 값을 지정 하십시오.
                     */
                    int input= 0;

                    /*
                     * TODO 메소드 호출 결과로 기대하는 출력 값을 지정 하십시오.
                     */
                    EmployeeIO expectedResult= new EmployeeIO();
                    //expectedResult.setEmpNo(0); // FW교육임직원번호
                    ....

                    try{
                        // 메소드 호출
                        SmpEmployeeBasicControllerDto result= employeeController.getEmployee(input);

                        assertEquals(expectedResult, result, "Response failed");
                    }
                    catch(Exception e){
                        fail(e);
                    }

                    logger.debug("[getEmployee] 메소드의 테스트가 종료 되었습니다.");
                }
            }
  1. Spring Boot 프로퍼티 설정 : Local에서 Spring Boot로 기동하기 위한 설정이다. Local에서는 Cloud 환경이 갖춰있지 않아서 기동 시 에러가 발생 할 수 있다. 에러가 발생할 경우에는 테스트가 정상적으로 되지 않을 수 있어, 일 부 설정을 주입하여 정상적으로 기동 될 수 있도록 한다.

  2. Spring Profile 설정 : Spring Boot 시 Profile별로 설정을 다르게 가져 갈 수 있다. ‘local’ Profile은 Local에서 정상적으로 기동 될 수 있도록 필요한 설정 값들이 Setting 되어 있다.

  3. Spring Boot Controller 호출 : 기동된 Spring Boot에 URL 호출을 하여 처리 결과를 확인 할 수 있다. 참고로 기동된 Application의 호출 URL은 프레임워크에서 Default로 “local-service” 로 정의 되어 있다.

  4. 서비스/컴퍼넌트/DBIO Bean 주입 : Spring Boot로 기동 되기 때문에 개발되어진 리소스들은 기동 시 Bean이 생성이 되어 getBean 혹은 @Autowired Annotation을 이용하여 Bean을 주입한다.

  5. 서비스/컴퍼넌트/DBIO Bean 호출 : 생성되어진 Bean을 직접 호출하여 Bean 실행 결과를 확인 한다.

결과는 다음과 같다.

            /**
             * 사원관리 Controller 테스트
             *
             *
             *
             * @author sysadmin
             */
            @ExtendWith( SpringExtension.class)
            @SpringBootTest(
                webEnvironment= WebEnvironment.DEFINED_PORT,
                classes= { BxmCloudApplication.class},
                properties= {"spring.config.name=bxframeworkForTest", "logging.level.root=info"})
            @ActiveProfiles( { "local"})
            public class EmployeeControllerTest {
                private Logger logger= LoggerFactory.getLogger(getClass());

                private DefaultSystemHeader systemHeader;

                @BeforeEach
                public void setup() {
                    // 기본 System Header 설정
                    systemHeader= new DefaultSystemHeader();
                    systemHeader.setTrxTerminalNo("1234567890");
                    systemHeader.setUserId("TestUser");
                    systemHeader.setChlType("IDE");
                    systemHeader.setLangCd("ko");

                    System.setProperty(Request.SYSTEMHEADER_PROPERTY_NAME, DefaultSystemHeader.class.getName());
                }

                /**
                 * Controller 테스트
                 */
                @Test
                public void testGetEmployee() {
                    logger.debug("[getEmployee] 메소드의 테스트를 시작 합니다.");

                    // 호출 헤더 정의
                    PrependedSystemHeader header= PrependedSystemHeader.prepend(systemHeader);

                    EmployeeIO expectedResult= new EmpIO();
                    expectedResult.setEmpNo(7839); // FW교육임직원번호
                    expectedResult.setEmpNm("KING"); // FW교육임직원명
                    expectedResult.setOccpNm("PRESIDENT"); // FW교육직업명
                    expectedResult.setMngrEmpNo(0); // FW교육관리자임직원번호
                    expectedResult.setHireDt("00000000"); // FW교육입사일자
                    expectedResult.setPayAmt(new BigDecimal("5000.0")); // FW교육급여금액
                    expectedResult.setDeptNo(10); // FW교육부서번호

                    try{
                        // 메소드 호출
                        EmpIO result= DefaultWebClient.getForObject(header, "http://local-service/employee/get/7839", EmpIO.class);

                        DefaultSystemHeader respHeader = (DefaultSystemHeader) header.consume();
                        logger.info("Response Header : {}", respHeader);

                        assertEquals(expectedResult, result, "Response failed");
                    }
                    catch(Exception e){
                        fail(e);
                    }

                    logger.debug("[getEmployee] 메소드의 테스트가 종료 되었습니다.");
                }
            }

3. 테스트를 실행한다.

chapter2/test007
Figure 6. 통합 테스트 결과

3. RestAPI 테스트

이미 배포하여 기동되고 있는 Application을 RestAPI를 이용하여 테스트 하는 것을 말한다.

1. 패키지 익스플로러에서 우클릭 → New → JUnit 테스트 케이스를 선택한 후, 유형에 Rest API테스트를 선택하여 작성한다.

chapter2/test008
Figure 7. Rest API 테스트

package는 suffix로 restapi를 붙이고(예 : bcpp.online.sample.project.restapi), 테스트하려는 Application의 URL에 대응하는 이름으로 클래스를 작성한다. (예 : EmployeeTest)

2. 생성된 샘플 소스에 test코드를 작성한다.

            @ExtendWith( SpringExtension.class)
            public class EmployeeControllerRemoteTest {
                private Logger logger= LoggerFactory.getLogger(getClass());

                private DefaultSystemHeader systemHeader;

                @BeforeEach
                public void setup()
                {
                    // 기본 System Header 설정
                    systemHeader= new DefaultSystemHeader();
                    systemHeader.setTrxTerminalNo("1234567890");
                    systemHeader.setUserId("TestUser");
                    systemHeader.setChlType("IDE");
                    systemHeader.setLangCd("ko");

                    System.setProperty(Request.SYSTEMHEADER_PROPERTY_NAME, DefaultSystemHeader.class.getName());

                    DefaultWebClient.setHeaderClass(SimpleSystemHeader.class);
                    DefaultAsyncWebClient.setHeaderClass(SimpleSystemHeader.class);
                }

                /**
                 * Single select
                 *
                 * {@link sample.online.controller.EmployeeController#getEmployee}
                 */
                @Test
                @DisplayName("Single select 테스트")
                public void testGetEmployee(){

                    logger.debug("[getEmployee] 메소드의 테스트를 시작 합니다.");

                    PrependedSystemHeader header= PrependedSystemHeader.prepend(systemHeader);

                    /*
                     * TODO 테스트할 메소드의 입력 값을 지정 하십시오.
                     */
                    int empNo= 0;


                    /*
                     * TODO 메소드 호출 결과로 기대하는 출력 값을 지정 하십시오.
                     */
                    EmployeeIO expectedResult= new EmployeeIO();
                    //expectedResult.setEmpNo(0); // FW교육임직원번호
                    ....

                    try{
                        EmployeeIO result= DefaultWebClient.getForObject(
                            header
                            , "http://IP:PORT/employee/get/{empNo}"
                            , EmployeeIO.class
                            );

                        assertEquals(expectedResult, result, "Response failed");
                    }
                    catch(Exception e){
                        fail(e);
                    }

                    logger.debug("[getEmployee] 메소드의 테스트가 종료 되었습니다.");
                }

                ...
            }
  1. REST Api 호출하기 위한 사전 설정 : 기동된 Application을 REST Api를호출 하기 위해서 RestTemplate 을 생성을 해줘야 한다.

  2. REST Api 호출 테스트 : 기동된 Application의 URL로 REST Api 테스트 수행한다.

결과는 다음과 같다.

            @ExtendWith( SpringExtension.class)
            public class EmployeeControllerRemoteTest {
                private Logger logger= LoggerFactory.getLogger(getClass());

                private DefaultSystemHeader systemHeader;

                @BeforeEach
                public void setup()
                {
                    // 기본 System Header 설정
                    systemHeader= new DefaultSystemHeader();
                    systemHeader.setTrxTerminalNo("1234567890");
                    systemHeader.setUserId("TestUser");
                    systemHeader.setChlType("IDE");
                    systemHeader.setLangCd("ko");

                    System.setProperty(Request.SYSTEMHEADER_PROPERTY_NAME, DefaultSystemHeader.class.getName());

                    DefaultWebClient.setHeaderClass(SimpleSystemHeader.class);
                    DefaultAsyncWebClient.setHeaderClass(SimpleSystemHeader.class);
                }

                /**
                 * Single select
                 *
                 * {@link sample.online.controller.EmployeeController#getEmployee}
                 */
                @Test
                @DisplayName("Single select 테스트")
                public void testGetEmployee(){

                    logger.debug("[getEmployee] 메소드의 테스트를 시작 합니다.");

                    PrependedSystemHeader header= PrependedSystemHeader.prepend(systemHeader);

                    /*
                     * TODO 테스트할 메소드의 입력 값을 지정 하십시오.
                     */
                    int empNo= 7369;


                    /*
                     * TODO 메소드 호출 결과로 기대하는 출력 값을 지정 하십시오.
                     */
                    EmployeeIO expectedResult= new EmployeeIO();
                    expectedResult.setEmpNo(7839); // FW교육임직원번호
                    expectedResult.setEmpNm("KING"); // FW교육임직원명
                    expectedResult.setOccpNm("PRESIDENT"); // FW교육직업명
                    expectedResult.setMngrEmpNo(0); // FW교육관리자임직원번호
                    expectedResult.setHireDt("00000000"); // FW교육입사일자
                    expectedResult.setPayAmt(new BigDecimal("5000.0")); // FW교육급여금액
                    expectedResult.setDeptNo(10); // FW교육부서번호

                    try{
                        EmployeeIO result= DefaultWebClient.getForObject(
                            header
                            , "http://IP:PORT/employee/get/" + empNo
                            , EmployeeIO.class
                            );

                        assertEquals(expectedResult, result, "Response failed");
                    }
                    catch(Exception e){
                        fail(e);
                    }

                    logger.debug("[getEmployee] 메소드의 테스트가 종료 되었습니다.");
                }

                ...
            }

4. Gradle bootRun 테스트

프레임워크에서는 간단한 Command로 Spring Boot로 Local에서 기동 할 수 있도록 Gradle Task(bootRun)를 제공하고 있다.

1. 윈도우에서 cmd 혹은 get bash 를 실행한다.

2. bootRun을 실행할 프로젝로 이동한다.

예) cd D\BXCloud_win_x64\workspace\bxcm.online.sample

3. gradle bootRun을 수행한다.

C:\BXCloud_win_x64\workspace\bxcm.online.sample>gradle bootRun

> Task :bootRun
2022-02-22 16:29:45.041 DEBUG [bxframework,,,] 90324 --- [           main] gerReplayToApplicationContextInitializer : [] class bxmc.config.LoggerReplayToApplicationContextInitializer.initialize.
2022-02-22 16:29:45.048 TRACE [bxframework,,,] 90324 --- [           main] bxmc.config.BxmEnvironmentPostProcessor  : [] spring.cloud.bootstrap.name: bxframework
2022-02-22 16:29:45.049 TRACE [bxframework,,,] 90324 --- [           main] .BootstrapConfigEnvironmentPostProcessor : [] bootstrap environment post processing.........

4. Application이 정상적으로 기동되는지 확인한다.

2022-02-22 16:30:08.945  INFO [bxframework,,,] 90324 --- [           main] bxmc.BxmCloudApplication                 : [] Started BxmCloudApplication in 25.579 seconds (JVM running for 26.855)
2022-02-22 16:30:09.034  INFO [bxframework,,,] 90324 --- [           main] bxmc.BxmCloudApplication                 : [] spring.application.name: [bxcm.online.sample]
==========---> 80% EXECUTING [1m 11s]
> :bootRun

Swagger UI 확인 및 테스트http://localhost:8080/swagger-ui.html)

chapter2/test009
Figure 8. Swagger 테스트
chapter2/test010
Figure 9. Swagger 확인 테스트
SWLab Bankware Global
  • 전체
  • BXM
  • BXCM
  • BXCP
  • BXI
제품 선택 시 더 정확한 매뉴얼 가이드를 제공해드립니다.

Copyright© Bankwareglobal All Rights Reserved.