Gradle의 모든 포스팅은 유튜브 프리렉을 기반으로 작성되었습니다.
링크 : https://www.youtube.com/watch?v=s-XZ5B15ZJ0&list=PL7mmuO705dG2pdxCYCCJeAgOeuQN1seZz
강의의 버전이 옛버전 이기 때문에 이론적인 부분만 학습하는것이 좋습니다.
테스트 자동화
그레이들의 테스트 도구로서 기능 및 역할
1. 환경 차이에 대한 제어
2. 특정 조건, 범위에 대한 테스트 수행
3. 느린 테스트에 대한 지양
1. 환경차이 제어
빌드를 위한 환경구성은 단순하지 않다.
개발과 운영환경, 그리고 보안적인 측면 등을 고려해서 다양하게 개발환경을 구성하게되고
환경구성에 있어서 차이가 발생할 수 있다.
즉, 개발환경, 테스트 환경, 검증환경, 응용환경 등 서버나 DB등의 영향으로 프로젝트를 수행하는데 있어서
개발에 영향을 미칠 수 있고 각 구성마다 차이가 발생할 수 있다.
이러한 상황에서 환경구성에 대한 변경이나 새롭게 구성이 발생하게 된다면
환경구성과 관련되어 있는 파일마다 수정해야 하는 번거로움이 발생한다.
이러한 단점을 Gradle을 사용하면 보완할 수 있다.
Gradle에서 환경차이 제어
프로젝트 구성
EnvDir : 환경구성 정보를 간직하는 디렉터리
dev : 개발
mid : 검증
prod : 운영환경
conf.properties 속성파일에 설정 임의 정보를 입력
dev
EnvDir/dev/conf.properties
server_ip=10.1.1.151
domain_nm=https://dev.gradleTest.co.kr
mid
EnvDir/mid/conf.properties
server_ip=10.1.1.151
domain_nm=https://mid.gradleTest.co.kr
prod
EnvDir/prod/conf.properties
server_ip=10.1.1.151
domain_nm=https://prod.gradleTest.co.kr
build.gradle 파일
task exeTask<<{
// 개발환경
def dev = new Properties()
dev.load(new FileInputStream("EnvDir/dev/conf.properties"))
println "******DEV Environments******"
println "Server IP : $(dev.server_ip)"
println "Domain Name : $(dev.domain_nm)"
// 검증환경
def mid = new Properties()
dev.load(new FileInputStream("EnvDir/mid/conf.properties"))
println "******mid Environments******"
println "Server IP : $(mid.server_ip)"
println "Domain Name : $(mid.domain_nm)"
// 운영환경
def prod = new Properties()
dev.load(new FileInputStream("EnvDir/prod/conf.properties"))
println "******prod Environments******"
println "Server IP : $(prod.server_ip)"
println "Domain Name : $(prod.domain_nm)"
}
gradle exeTask 실행결과
******DEV Environments******
Server IP : 10.1.1.151
Domain Name : https:///dev.gradleTest.co.kr
******mid Environments******
Server IP : 10.1.1.151
Domain Name : https:///mid.gradleTest.co.kr
******prod Environments******
Server IP : 10.1.1.151
Domain Name : https:///prod.gradleTest.co.kr
conf.properties 파일이 아닌 conf.gradle 파일로 각각 생성
dev
EnvDir/dev/conf.gradle
ext.server_dev_ip=10.1.1.151
ext.domain_dev_nm=https://dev.gradleTest.co.kr
mid
EnvDir/mid/conf.gradle
ext.server_mid_ip=10.1.1.152
ext.domain_mid_nm=https://mid.gradleTest.co.kr
prod
EnvDir/prod/conf.gradle
ext.server_prod_ip=10.1.1.153
ext.domain_prod_nm=https://prod.gradleTest.co.kr
build.gradle 파일 작성
apply from: "EnvDir/dev/conf.gradle"
apply from: "EnvDir/mid/conf.gradle"
apply from: "EnvDir/prod/conf.gradle"
task exeTask <<{
println "******DEV Environments******"
println "Server IP : $(server_dev_ip)"
println "Domain Name : $(domain_dev_nm)"
println "******Mid Environments******"
println "Server IP : $(server_mid_ip)"
println "Domain Name : $(domain_mid_nm)"
println "******Prod Environments******"
println "Server IP : $(server_prod_ip)"
println "Domain Name : $(domain_prod_nm)"
}
gradle exeTask 실행결과
> Task:exeTask
******DEV Environments******"
DEV Server IP : 10.1.1.151
Dev Domain Name : https://dev.gradleTest.co.kr
******Mid Environments******"
MID Server IP : 10.1.1.152
MID Domain Name : https://mid.gradleTest.co.kr
******Prod Environments******"
PROD Server IP : 10.1.1.153
PROD Domain Name : https://prod.gradleTest.co.kr
Gradle만의 특징을 살린 환경차이 제어
좀더 유연하게 사용가능
프로젝트 구조
conf.gradle파일
environments{
dev {
server_ip='10.1.1.151'
domain_nm='https://dev.gradleTest.co.kr'
}
mid {
server_ip='10.1.1.152'
domain_nm='https://mid.gradleTest.co.kr'
}
prod {
server_ip='10.1.1.153'
domain_nm='https://prod.gradleTest.co.kr'
}
}
build.gradle 파일
task exeTask <<{
// Groovy 문법 사용 - 환경설정 정보 참조
def envBolck = new File('EnvDir/conf.gradle').toURL()
println "******Dev Environments******"
def dev = new ConfigSlurper("dev").parse(envBolck)
println 'Dev server_ip : ' + dev.server_ip
println 'Dev domain_nm : ' + dev.domain_nm
println "******Mid Environments******"
def mid = new ConfigSlurper("mid").parse(envBolck)
println 'Mid server_ip : ' + mid.server_ip
println 'Mid domain_nm : ' + mid.domain_nm
println "******Prod Environments******"
def prod = new ConfigSlurper("prod").parse(envBolck)
println 'Prod server_ip : ' + prod.server_ip
println 'Prod domain_nm : ' + prod.domain_nm
}
gradle exeTask 실행결과
> Task :exeTask
******Dev Environments******
Dev server_ip : 10.1.1.151
Dev domain_nm : https://dev.gradleTest.co.kr
******Mid Environments******
Mid server_ip : 10.1.1.152
Mid domain_nm : https://mid.gradleTest.co.kr
******Prod Environments******
Prod server_ip : 10.1.1.153
Prod domain_nm : https://prod.gradleTest.co.kr
테스트 자동화
패턴을 사용한 테스트
- 패턴을 이용하여 프로젝트에서 패턴에 일치하는 대상에 대하여 구별하여 테스트 진행
- include, exclude 사용
build.gradle파일
apply plugin:'java' // 자바 플러그인 사용
sourceCompatibility = 1.7 // jdk버전 지정
targetCompatibility = 1.7 // jdk버전 지정
def defaultEncoding = 'UTF-8' // UTF-8 인코딩 지정
[compileJava, compileTestJava]*.options*.encoding=defaultEncoding
repositories {
mavenCentral() // maven중앙 저장소 사용
}
dependencies{
testCompile 'junit:junit:4.11' // junit 4.11버전 사용 의존관계지정
}
task exeTask(type: Test) { // exeTask가 Test를 위한 부분이다 라는것을 나타냄
include '**/Gradle*.class'
filter{
includeTestsMatching'Gradle*'
}
}
gradle exeTask 실행결과
프로젝트 하위의 bin 디렉터리 생성되고 하위에
test 디렉터리 생성 하위에 dao task util 생성
test 타스크 사용(java 플러그인에서 제공)
apply plugin:'java' // 자바 플러그인 사용
//test 타스크 (java 플러그인에서 제공)
test {
// TestNG사용
useTestNG()
// explicitly include or exclude tests
include 'org/foo/**' // 빌드수행 대상 추가
exclude 'org/boo/**' // 제거
// test 도중 오류 사항을 콘솔창에 표시
testLogging.showStandardStreams = true
// 테스트를 위한 Heap 메모리 세팅
minHeapSize = "128m"
maxHeapSize = "512m"
// 테스트 실행 생명주기 표시
beforeTest { descriptor ->
logger.lifecycle("Running test: " + descriptor)
}
// 테스트 JVM의 오류 및 출력 내용 등을 표시
onOutput { descriptor, event ->
logger.lifecycle("Test:" + descriptor +
+ produced standard out/err:" + event.message)
}
}
JUnit을 이용한 테스트
Junit이란?
- 테스트를 위한 테스트 프레임워크
- 리플렉션을 통하여 클래스의 메타 정보를 확인하고 클래스에 있는 메소드들을 테스트할 수 있도록 해주는
자바 기반 테스트 프레임워크
- 단위 테스트, 통합테스트에 사용
실습을 위한 디렉터리 구조 생성
Build 및 Reports,TEst-results 는 빌드 수행을 통해서 결과로 생성되는 디렉터리이다.
GradleMsg.java파일
간단한 문자열얼 처리하기 위해 만들어진 클래스
package test.java;
public class GradleMsg {
String msg = "";
public GradleMsg() {
}
public GradleMsg(String msg) {
this.msg = msg;
}
public String returnMsg(String msg){
return msg;
}
}
GradleMsgTest.java 파일
package test.java;
import org.junit.Before;
import org.junit.Test; // junit 사용
public class GradleMsgTest {
private GradleMsg gMsg;
@Before
public void printMsg() throws Exception {
gMsg = new GradleMsg("Hello, Gradle");
System.out.println("==@Before==>> ");
}
@Test
public void testMsg(){
gMsg = new GradleMsg("Hello, Gradle");
String msg = gMsg.returnMsg("Gradle");
System.out.println("==@Test==>> " + msg);
}
}
build.gradle
applay plugin : 'java'
repositories {
mavenCentral() // 메이븐 중앙 저장소 사용
}
dependencies{
testCompile 'junit:junit:4.8.2' // junit 버전 지정
}
test{
testLogging{
events "passed", "skipped", "failed", "standardOut", "StandardError"
// test를 진행할 때 log부분을 어떻게 지정할지 속성을 지정
}
}
task exeTask(type: Test) { // Test타입으로 선언
// html파일로 테스트 결과가 출력
reports.html.destination = file("${reports.html.destination}/integration")
reports.junitXml.destination = file("${reports.junitXml.destination}/integration")
}
Junit을 이용한 테스트
- 빌드 수행
1. gradle -b build.gradle test 수행 후
2. gradle -Penv=integration exeTask 수행
Build라는 디렉터리에 빌드수행 결과가 만들어짐
build 하위에
classes : java파일을 컴파일한 class파일들
reports : 하위에 tests디렉터리 그 하위에 test, exeTask디렉터리 생성 exeTask하위에
integration 생성 integration 하위에 index.html파일 생성 클릭하여 확인
test-results : exeTask -> integration -> Test-test.java.GradleMsgTest.xml 확인
빌드 수행결과가 xml로 출력
tmp : tmp파일
테스트 자동화
병렬 테스트
- 자바 플러그인에서 제공하는 test 객체 이용
- maxParallelForks를 사용하여 병렬 수행 프로세스 개수를 지정 가능
- 병렬 처리를 할 경우 시스템 사용과 함께 테스트에 가장 최적의 프로세스 개수 파악 필요
실습을 위한 병렬 테스트 프로젝트 생성
build.gradle파일
apply plugin:'java'
repositories{
mavenCentral() // 저장소 사용
}
dependencies{
testCompile'junit:junit:4.11' // 의존관계 설정
}
def defaultEncoding = 'UTF-8'
[compileJava, compileTestJava]*.options*.encoding = defaultEncoding
test{ // test 객체를 사용
// Gradle의 병렬 테스트 실행
maxParallelForks = 1 // maxParallelForks속성 값 이용 프로세스 개수 제어
}
GradleMsg.java
package test.java;
public class GradleMsg{
String msg = "";
public GradleMsg(){
}
public GradleMsg(String msg) {
this.msg = msg;
}
public String returnMsg(String msg){
return msg;
}
}
ParallelTest.java
package test.java;
public class parallelTest {
protected void stress() {
System.out.println("ParallelTEst > Start >");
try {
Thread.sleep(5000); // 빌드 수행 시 5초 슬립
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
GradleMsgTest1 ~ 10
package test.java;
import org.junit.Before;
import org.junit.Test;
public class GradleMsgTest1 extends parallelTest{
private GradleMsg gMsg;
@Before
public void setUp() {
stress();
}
@Test // Test 어노테이션
public void testMsg() {
gMsg = new GradleMsg("Hello, Gradle");
String msg = gMsg.returnMsg("Gradle");
System.out.println("==@Test==>> " + msg);
}
}
maxParallelForks = 1 일때 실행결과 프로세스 개수가 1일때
5초간격으로 각각의 파일들이 하나씩 빌드가 수행됨
총 58초가 걸림
maxParallelForks = 2 일때 실행결과 프로세스 개수가 2일때
총 22초가 걸림
maxParallelForks= 1~10까지 실행해보면
각각 빌드수행 환경에 최적화된 프로세스 개수를 확인 할 수 있다.
'프로그래밍 공부 > Gradle' 카테고리의 다른 글
Gradle 파일 퍼블리싱 Maven publish, Ivy publish, 인터넷 배포 (0) | 2021.09.10 |
---|---|
Gradle 퍼블리싱 압축하기 zip tar jar war ear (0) | 2021.09.09 |
Gradle 의존관계 관리, 환경구성 정의, 저장소 정의 (0) | 2021.09.08 |
Gradle의 파일처리 파일관리 파일참조, 파일복사, 파일삭제 (0) | 2021.09.06 |
Gradle의 도메인 객체 Project, Task, Gradle, Settings, 기타 (0) | 2021.09.05 |