본문 바로가기

Programming👩🏻‍💻/AxBoot

*중요 디버깅, 단위테스트

service 단에 데이터가 잘 전달되는지 확인 하기 위해 브레이크포인트 넣어서 확인하기.


단위테스트의 시작

*테스트를 하는 습관은 정말 중요하니까 항상 몸에 익숙하게 만들자!

 

내가 테스트하고자 하는 것을 시나리오를 먼저 만들어야함.

 

1. 테스트 디렉토리 만들기 [src - test - java - edu -axboot - domain - {company - [CompanyServiceTest.java]}

 

2. class 설계

*Junit assert 기능 알아보기

 

3. Test 구성

Test 실행: 현 소스코드에서 마우스 오른쪽 클릭 run으로 실행

디버그 실행: 현 소스코드에서 마우스 오른쪽 클릭 디버그 run으로 실행

 

package edu.axboot.domain.company;

import com.chequer.axboot.core.parameter.RequestParams;
import edu.axboot.AXBootApplication;
import lombok.extern.java.Log;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.List;

import static org.junit.Assert.assertTrue;
//테스트하려고 하는 메소드위에 단위테스트를 할 수 있는 어노테이션을 준다.

@Log
@RunWith(SpringRunner.class)
@SpringBootTest(classes = AXBootApplication.class)

public class CompanyServiceTest {
    @Autowired
    private CompanyService companyService;

    @Test
    //companyservie.java에서 getByQueryDsl의 함수를 테스트할 경우.
    //Test와 해당 메서드명을 명시해줌
    public void testGetQueryDls() {
        // 테스트단계에서도 "디버깅" 가능

        // ***given : 사전준비, 테스트하기위한 변수,정의
        RequestParams<Company> requestParams = new RequestParams<Company>(); //해당 메서드 파라미터값
        requestParams.put("company", "토스"); //파라미터 값 넣어주기
        requestParams.put("ceo", "");
        requestParams.put("bizno", "");
        // ------------값을 던짐------

        // ***when : 실제 Action
        List<Company> result = this.companyService.getByQueryDsl(requestParams);
        //------파라미터값 넘겨주기


        // ***then : 결과에 참값의 성공여부. ( true/false )
        // asserTrue : 결과값 여부의 참거짓을 반환하는 기능.

       // assertTrue(result.size() > 0);

        // 참의 조건을 정확하게 1건인지 명시
        assertTrue(result.size() == 1);
    }
}

1)

CompanyService.java

2)

CompanyServiceTest.java

3)

CompanyService.java


리팩토링


Test로 테이블 데이터 CRUD 

Insert

  @Test
    public void testSaveQueryDls_create() {
        /* given
         1.Company객체 값 형태의 Array배열의 객체를 선언,*/
        List<Company> requests = new ArrayList<Company>(); // 그릇

        // 2.객체를 생성해서 값을 add해야한다. 데이터를 담을 재료(내용)들..
        Company company = new Company();
        company.setCompanyNm("단테회사");
        company.setCeo("단테대표");
        company.setBizno("1234");
        company.set__created__(true); //생성하기 위해 true값을 넣어줌
                //company객체가 SimpleJpaModel를 상속받아서
                //SimpleJpaModel의 AxBootCrudModel 에 CRUD기능이 있음.
        requests.add(company); // 내용을 담아 파라미터 값을 보냄
        /*when
        * 결과값을 받는 result*/
        int result = this.companyService.saveByQueryDsl(requests);

        // then
        // 결과값 1이나오면 테스트 성공
        assertTrue(result == 1);
    }

 

 

 

정보를 복수로 넣어줄 때 인스턴스는 별도로 생성해줘야 데이터 정보 겹침 현상이 안됨

두 테이블 추가시


Update


Delete

 


-목업/단위테스트 통합확인 하기 위해 브레이크포인트 넣어서 확인하기.

 

단위테스트의 시작

*테스트를 하는 습관은 정말 중요하니까 항상 몸에 익숙하게 만들자!

 

 

 

내가 테스트하고자 하는 것을 시나리오를 먼저 만들어야함.

 

 

 

1. 테스트 디렉토리 만들기 [src - test - java - edu -axboot - domain - {company - [CompanyServiceTest.java]}

 

 

2. class 설계

*Junit assert 기능 알아보기

 

 

 

3. Test 구성

Test 실행: 현 소스코드에서 마우스 오른쪽 클릭 run으로 실행

 

디버그 실행: 현 소스코드에서 마우스 오른쪽 클릭 디버그 run으로 실행

 

 

 

package edu.axboot.domain.company;

 

import com.chequer.axboot.core.parameter.RequestParams;

import edu.axboot.AXBootApplication;

import lombok.extern.java.Log;

import org.junit.Test;

import org.junit.runner.RunWith;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.boot.test.context.SpringBootTest;

import org.springframework.test.context.junit4.SpringRunner;

 

import java.util.List;

 

import static org.junit.Assert.assertTrue;

//테스트하려고 하는 메소드위에 단위테스트를 할 수 있는 어노테이션을 준다.

 

@Log

@RunWith(SpringRunner.class)

@SpringBootTest(classes = AXBootApplication.class)

 

public class CompanyServiceTest {

    @Autowired

    private CompanyService companyService;

 

    @Test

    //companyservie.java에서 getByQueryDsl의 함수를 테스트할 경우.

    //Test와 해당 메서드명을 명시해줌

    public void testGetQueryDls() {

        // 테스트단계에서도 "디버깅" 가능

 

        // ***given : 사전준비, 테스트하기위한 변수,정의

        RequestParams<Company> requestParams = new RequestParams<Company>(); //해당 메서드 파라미터값

        requestParams.put("company", "토스"); //파라미터 값 넣어주기

        requestParams.put("ceo", "");

        requestParams.put("bizno", "");

        // ------------값을 던짐------

 

        // ***when : 실제 Action

        List<Company> result = this.companyService.getByQueryDsl(requestParams);

        //------파라미터값 넘겨주기

 

 

        // ***then : 결과에 참값의 성공여부. ( true/false )

        // asserTrue : 결과값 여부의 참거짓을 반환하는 기능.

 

       // assertTrue(result.size() > 0);

 

        // 참의 조건을 정확하게 1건인지 명시

        assertTrue(result.size() == 1);

    }

}

1)

 

CompanyService.java

2)

 

CompanyServiceTest.java

3)

 

CompanyService.java

리팩토링

Test로 테이블 데이터 CRUD 

 

Insert

  @Test

    public void testSaveQueryDls_create() {

        /* given

         1.Company객체 값 형태의 Array배열의 객체를 선언,*/

        List<Company> requests = new ArrayList<Company>(); // 그릇

 

        // 2.객체를 생성해서 값을 add해야한다. 데이터를 담을 재료(내용)들..

        Company company = new Company();

        company.setCompanyNm("단테회사");

        company.setCeo("단테대표");

        company.setBizno("1234");

        company.set__created__(true); //생성하기 위해 true값을 넣어줌

                //company객체가 SimpleJpaModel를 상속받아서

                //SimpleJpaModel의 AxBootCrudModel 에 CRUD기능이 있음.

        requests.add(company); // 내용을 담아 파라미터 값을 보냄

        /*when

        * 결과값을 받는 result*/

        int result = this.companyService.saveByQueryDsl(requests);

 

        // then

        // 결과값 1이나오면 테스트 성공

        assertTrue(result == 1);

    }

 

 

 

 

 

 

정보를 복수로 넣어줄 때 인스턴스는 별도로 생성해줘야 데이터 정보 겹침 현상이 안됨

 

두 테이블 추가시

Update

Delete

 

 

-목업/단위테스트 통합: 허상의 데이터를 놓고 직접 db에 반영하지 않고 테스트를 하는 것. 생성-수정-삭제까지 완료하고 테스트를 마침

-테스트는 수행하되, 흔적을 남기지 않기 위해서 일괄적으로 CRUD를 실행하여 테스트 성공여부로 에러 판단을함.

 

package edu.axboot.domain.company;

import com.chequer.axboot.core.parameter.RequestParams;
import edu.axboot.AXBootApplication;
import lombok.extern.java.Log;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.MethodSorters;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.ArrayList;
import java.util.List;

import static org.junit.Assert.assertTrue;
//테스트하려고 하는 메소드위에 단위테스트를 할 수 있는 어노테이션을 준다.

@Log
@RunWith(SpringRunner.class)
@SpringBootTest(classes = AXBootApplication.class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING) //이름순으로 정렬

public class CompanyServiceTest {
    @Autowired
    private CompanyService companyService;

    public static long testId = 0; // 전역변수로 정의해서 결과값을 공유
    //그냥 long타입이면 함수가 바뀔때마다 값이 0으로 초기화 되므로 static으로 정의함.
    @Test
    //companyservie.java에서 getByQueryDsl의 함수를 테스트할 경우.
    //Test와 해당 메서드명을 명시해줌
    public void testGetQueryDls() {
        // 테스트단계에서도 "디버깅" 가능

        // ***given : 사전준비, 테스트하기위한 변수,정의
        RequestParams<Company> requestParams = new RequestParams<Company>(); //해당 메서드 파라미터값
        requestParams.put("company", "토스"); //파라미터 값 넣어주기
        requestParams.put("ceo", "");
        requestParams.put("bizno", "");
        // ------------값을 던짐------

        // ***when : 실제 Action
        List<Company> result = this.companyService.getByQueryDsl(requestParams);
        //------파라미터값 넘겨주기

        // ***then : 결과에 참값의 성공여부. ( true/false )
        // asserTrue : 결과값 여부의 참거짓을 반환하는 기능.

       // assertTrue(result.size() > 0);

        // 참의 조건을 정확하게 1건인지 명시
        assertTrue(result.size() == 1);
    }


    @Test
    public void testGetQueryDlsByString() { //레이블로 조회
        // ***given : 사전준비, 테스트하기위한 변수,정의
        String companyNm = "토스";
        String ceo = "";
        String bizno = "";

        // ***when : 실제 Action
        List<Company> result = this.companyService.getByQueryDsl(companyNm, ceo, bizno);
                                                    // 새로운 메서드명, 같은 메서드명으로도 가능
        // ***then : 결과에 참값의 성공여부. ( true/false )
        assertTrue(result.size() == 1);
    }


    // 테이블 생성
    @Test
    public void test1_SaveQueryDls_create() {
        /* given
         1.Company객체 값 형태의 Array배열의 객체를 선언,*/
        List<Company> requests = new ArrayList<Company>(); // 그릇

        // 2.객체를 생성해서 값을 add해야한다. 데이터를 담을 재료(내용)들..
        Company company = new Company();
        company.setCompanyNm("단테회사");
        company.setCeo("단테대표");
        company.setBizno("1234");
        company.set__created__(true); //생성하기 위해 true값을 넣어줌
                //company객체가 SimpleJpaModel를 상속받아서
                //SimpleJpaModel의 AxBootCrudModel 에 CRUD기능이 있음.
        requests.add(company); // 내용을 담아 파라미터 값을 보냄


        /*
        when
        결과값을 받는 result
        */

        testId = this.companyService.saveByQueryDsl(requests);

        // then
        // 결과값 1이나오면 테스트 성공
        assertTrue(testId > 0);
    }


    // modified
    @Test
    public void test2_SaveQueryDls_update() {
        //given

        List<Company> requests = new ArrayList<Company>(); // 그릇

        Company company = new Company();
        company.setId(testId); //강제 캐스팅 & 뒤에 L붙이는 2가지 방법이 있음
        company.setCompanyNm("단테회사2");
        company.setCeo("단테대표");
        company.setBizno("1234");
        company.set__modified__(true);
        requests.add(company);


        /*when
         * 결과값을 받는 result*/
        long result = this.companyService.saveByQueryDsl(requests);

        // then
        // 결과값 1이나오면 테스트 성공
        assertTrue(result == 1);
    }

    //Delete
    @Test
    public void test3_SaveQueryDls_delete() {
        //given

        List<Company> requests = new ArrayList<Company>();

        Company company = new Company();
        company.setId(testId);
        company.set__deleted__(true);
        requests.add(company);

        /*when
         * 결과값을 받는 result*/
        long result = this.companyService.saveByQueryDsl(requests);

        // then
        // 결과값 1이나오면 테스트 성공
        assertTrue(result == 1);
    }
}


@FixMethodOrder(MethodSorters.NAME_ASCENDING) //이름순으로 정렬기능을 추가

SelectOne의 함수를 만들어 테스트하고자 하는 정보와 실제 db에 저장된 정보가 같은지 확인

@Test
    public void test4_GetQueryDls_seletOne() { //레이블로 한건 조회
        // ***given : 사전준비, 테스트하기위한 변수,정의

        String companyNm = "단테회사2";
        String ceo = "";
        String bizno = "";

        // ***when : 실제 Action
        Company result = this.companyService.getOneByQueryDsl(testId);


        // ***then : 결과에 참값의 성공여부. ( true/false )
        assertTrue(result.getCompanyNm().equals(companyNm));
    }

 

public Company getOneByQueryDsl(long id) {
        BooleanBuilder builder = new BooleanBuilder(); // BooleanBuilder : where뒤에 조건을 생성해줌
        builder.and(qCompany.id.eq(id));

        Company company = select()
                .from(qCompany)
                .where(builder)
                .fetchOne();
        return company;
    }

 

 


디렉토리 파악

src - 실제 관리하는 파일 
컴파일 후 저장되는 정보(클래스생성등)  -target
webapp - 화면단
java - 자바코드

 

환경파일 resource 폴더 - 환경설정 파일들이 있음

axboot-common-properties : 공통적으로 설정되야되는 요소들


axboot-local-production 파일:개발환경에서 이뤄질때

axboot-production-properties: common-properties 와 비슷한 구성

운영계에 돌리는 환경 /운영계환경이 다를때 이곳에 파일을 만들어서 활용

 

속성의 axboot.dataSource.url이 서로 다름.

 

로컬/프로덕션 환경 구분: src-main-java-프로젝트폴더(edu) 폴더안에 AxbootApplication.java에

[@PropertySource(value = {"classpath:axboot-common.properties", "classpath:axboot-${spring.profiles.active:local}.properties"})]에서 확인가능.

[local, production] 2가지 타입으로 JDBCURL (/setup :URL)을 DB환경을 변경할 수 있음

 

DB환경이 바뀌면 loca.properties에 설정을 적용하면됨 (mysql, oracle계정 등..)


다국어 지원- 리소스에 다른 언어의 properties를 추가하면 됨.


resource-template : 프로그램 화면단 템플릿 jsp소스 불러와서 구성할 수 있음.


AXBootSecurityConfig.java

role권한 설정을 할 수 있음.

spring seculity에서 자동적으로 설정을 지원해줘서 알맞게 설정하면된다.

 

AxBootWebConfigureAdapter 화면단


데이터베이스에 대한 트랜잭션,소스 관리

'Programming👩🏻‍💻 > AxBoot' 카테고리의 다른 글

Banner / Logging / Excel download  (0) 2021.04.30
jsfiddle  (0) 2021.04.23
Mybatis연동  (0) 2021.04.19
QueryDSL  (0) 2021.04.19
Mac 맥) Maven 설치 및 환경 변수 설정  (0) 2021.04.19