본문 바로가기
✨기타/학습 정리

Jacoco

by bdd 2022. 8. 25.

 

 

 

1. JaCoCo


Jacoco(Java Code Coverage)는 자바 코드 커버리지를 체크하는데 사용하는 오픈소스 라이브러리 입니다. 테스트를 실행하고 한 퍼센트만큼 커버하지 못한다면 빌드를 못하게끔 막을 수 있습니다.

 

plugins{
	id 'jacoco'
}

jacoco {
	toolVersion = '0.8.7'
}

jacocoTestReport {
	reports {
		html.enabled true
		xml.enabled true
		csv.enabled false

		//  각 리포트 타입 마다 리포트 저장 경로를 설정할 수 있다.
		html.destination file("$buildDir/jacocoHtml")
		xml.destination file("$buildDir/jacoco.xml")
	}

	finalizedBy 'jacocoTestCoverageVerification'
}

jacocoTestCoverageVerification {
	violationRules {
		rule {
			enabled = true
			element = 'CLASS'
			// includes = []

			limit {
				counter = 'LINE'
				value = 'COVEREDRATIO'
				minimum = 0.60
			}

			excludes = []
		}
	}
}
  1.  
  2.  
  3.  
  4.  
  5. plugin에 jacoco를 추가해 줍니다
  6. jacoco 버전을 추가해줍니다
  7. jacocoTestReport는 테스트 결과를 설정하는 부분으로 다양항 형태의 파일 타입으로 받을 수 있습니다.
    여기서 finalizedBy는 테스트가 먼저 실행되고 나서 리포트 작성을 하게끔 하기 위해서 입니다
  8. jacocoTestCoverageVerification 은 커버리지 수준을 저으이 하는 부분입니다.
    커버리지 퍼센트(소수점) 이나, counter등의 설정을 할 수 있습니다.
    - enable : rule 활성화를 설정
    - element : 커버리지에서가장 큰 측정 단위입니다.(PACKAGE, CLASS, SOURCEFILE, METHOD가 있습니다)
    - counter : 커버리지의 최소 측정 단위입니다.(CLASS, METHOD, LINE, BRACH 있습니다)
    - value : 측정한 정보를 보여주는 방식을 설정합니다(TOTALCOUNT, COVEREDCOUNT, COVEREDRATIO 있습니다)
    - exclude : 커버리지 검증에서 제외할 클래스를 지정합니다(패키지레벨 경로입니다)

 

 

 

 

 

 

실행은 gradlew가 있는 위치에서 아래 명령어를 실행하면 됩니다. 

./gradlew --console verbose test jacocoTestReport jacocoTestCoverageVerification

--console verbose : 실행되는 과정을 콘솔에서 볼 수 있습니다.

 

 

 

 

 

이런식으로 위에서 설정한 커버리지에 만족하지 못했기 때문입니다. 결과는 제가 설정한 경로에 따르면 build -> jacocoHtml 에서 확인할 수 있습니다. 맨 아래 index.html 파일을 누르면 전체 적인 커버 스토리지를 볼 수 있습니다.

 

보면 빨간색이 굉장히 많은데 저게 다 커버가 안됬다는 뜻입니다 ㅠㅠ
exclude 부분에 커버리지에 측정할 필요가 없는 더미데이터 부분을 추가해 놓지 않아서 그러한 부분까지 모두 측정되어 나온 것 같습니다(라고 위안을 삼습니다 ㅠㅠ)

그리고 여러 task를 한번에 실행 시킬 수 있습니다.

task testCoverage(type: Test) {
	group 'verification'
	description 'Runs the unit tests with coverage'

	dependsOn(':test',
			':jacocoTestReport',
			':jacocoTestCoverageVerification')

	tasks['jacocoTestReport'].mustRunAfter(tasks['test'])
	tasks['jacocoTestCoverageVerification'].mustRunAfter(tasks['jacocoTestReport'])
}

이렇게 적어주게 되면 jacocoTestReport와 jacocoTestCoverageVerification 를 한번에 지정해 줄 수 있습니다. 리포트 생성 후 -> 커버리지를 체크한다는 뜻입니다. 확인하면

 

 

 

 

 

보시면 TestReport 생성 후 coverateVerification이 실행됨을 알 수 있습니다.

혹시나 테스트 없이 빌드가 필요한 경우 다음과 같은 명령어로 빌드 할 수 있습니다.

./gradlew clean build -x test

-x test 는 테스트 없이 바로 클린 빌드 하겠다는 뜻 입니다.

출처
https://techblog.woowahan.com/2661/

 

 

 

 

이는 프로젝트를 하다 해당 강의를 들으며 작성한 글입니다. 학습 과정에서 작성되었기 때문에 잘못된 내용이 있을 수 있으며 강의 내용이 정말 좋기 때문에 꼭 들어보실 것을 추천드립니다.

 

 

 

 

 

 

 

 

 

1. 인덱스


원하는 데이터를 빠르게 검색할 수 있도록 돕는 오브젝트. DBMS가 데이터베이스 테이블의 모든 데이터를 검색해서 원하는 결과를 가져오려면 많은 시간이 걸리기 때문에 컬럼의 값과 실제 데이터가 있는 주소를 (키, 값) 의 한 쌍으로 인덱스를 만들어 순서대로 미리 정렬해서 보관합니다.  *색인: 책 속의 낱말이나 구절, 또 이에 관련한 지시자를 찾아보기 쉽도록 일정한 순서로 나열한 목록

 

 

 

인덱스는 SortedList,  ArrayList 자료구조를 사용하는데 SortedList는 저장되는 값을 항상 정렬된 상태로 유지하며, ArrayList는 값을 저장되는 순서대로 그대로 유지합니다. 따라서 인덱스도 저장되는 칼럼의 값을 이용해서 정렬된 상태로 저장된 데이터를 유지합니다. *innodb기준 데이터 파일은 ArrayList와 같이 저장된 순서대로 별도의 정렬 없이 그대로 저장

 

 

# 선형 자료구조   # 비선형 자료구조  # 이진트리  # B-TREE

 

 

 

 

 

2. 인덱스를 사용하면 좋은 경우


 

   - 규모가 큰 경우 

   - 데이터의 중복도가 낮은 컬럼

   - WHERE절이나 ORDER BY, JOIN 등이 자주 사용되는 컬럼

 

 

 

 

인덱스는 비선형 구조를 사용하는데, 이는 자신이 없는 데이터를 굉장히 빨리 찾을 수 있기 때문입니다. 물론 검색속도가 빨라지는 대신 데이터의 쓰기 작업은 느려지는데 이 비용은 감수해야 합니다. 여튼 파일시스템에는 모든 데이터를 아래와 같이 무작위로 넣는데요, 이를 빠르게 검색하기 위한 선형구조는 굉장히 비효율적입니다. 앞에서부터 모든 데이터를 순회해야하기 때문입니다.

 

데이터베이스는 커널을 사용합니다

 

 

 

 

 

 

여담으로 데이터베이스에서 SELECT 라는 키워드를 사용하는 이유는 이미 정렬이 된 B+TREE에서 필요한 데이터를 선택하는 것과 같습니다. 따라서 FIND가 아닌 SELECT로 이를 사용할 수 있습니다. 

 

# COST ORDER   # RAM 메모리  # 파일 시스템

 

댓글