본문 바로가기

대학원 라이프/기록

Junit5 콘솔창에서 실행하기. [ wow! ][ 2021 ] [junit console-standalone]

들어가며... 윈도우에서 콘솔 창으로 Junit5 실행하기

 

JVM기반 프로그래밍 언어에서 테스트의 모든 것을 담당하는 Junit 테스트 프레임워크.

 

개발자의 필수역량으로 자리 잡고 있는 테스트 주도 개발 방법에 있어서

 

JVM기반 언어에서 테스트를 돌릴 때 Junit5는 매우 큰 도움이 된다.

 

그중에서 junit console-standalone 라이브러리는 이름 그대로 이 라이브러리 하나로 console의 모든 것을 담당하게 해 준다.

 

모든 기능을 살펴보진 못했고 나의 경우 Windows 환경에서 간단한 테스트 파일을 돌려보았다.

 

가장 큰 도움을 준 유튜브 링크는 아래와 같다.

 

유튜버의 설명으로 듣자면 서버형 프로그램에서는 console창으로만 접근이 가능하니까.. (요즘은 따로 서버를 실행시켜  웹(주피터 랩처럼...)으로 컨트롤할 수 있는 기술이 많이 발전하긴 했지만...)

 

서버형 개발환경에서 테스트를 자동화해야 하는 경우에 console-standalone을 자주 활용한다고 한다. [ 대부분 클라우드 환경이지 않을까 한다. ]

 

위의 유튜브를 통해 내가 해결할 수 있던 것은 javac으로 main java와 test java를 컴파일한 후 standalone을 돌려야 한다는 것이었다. 너무도 당연한 것인데 이것을 헤매고 있었다... ㅠ

 

toy 환경을 살펴보자.

main java : SampleUnit.java

 

public class SampleUnit {
    
    public int addInts(int a, int b){
        return a + b;
    }

    public boolean validAboveZero(int a) {
	    if (a>0) {
		    return true;
	    }
	    return false;
    }
}

 

test java : SampleUnitTest.java

 

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertEquals;
import org.junit.Test;

public class SampleUnitTest {

    @Test
    public void testAddInts() {
        SampleUnit sampleUnit = new SampleUnit();
        int result = sampleUnit.addInts(2, 2);
	// The below should fail.
        assertEquals("Not adding correctly!", 5, result);
    }

    @Test
    public void testValidAboveZero() {
        SampleUnit sampleUnit = new SampleUnit();
        boolean result = sampleUnit.validAboveZero(2);
        assertTrue(result);
    }

    @Test
    public void testValidFail() {
        boolean result = false;
        assertFalse(result);
    }
}

 

주의할 점!!

 

우선은 따로 패키지를 만들진 말자.

 

디렉터리의 구조

 

lib폴더에는 "junit-platform-console-standalone-1.7.1.jar"이 들어있다.

 

Central Repository: org/junit/platform/junit-platform-console-standalone/1.7.1

 

repo1.maven.org

위에서 다운로드할 수 있다.

 

1. 자바 파일들을 컴파일 하자.

javac -cp "./lib/junit-platform-console-standalone-1.7.1.jar" SampleUnit.java SampleUnitTest.java

 

하나씩 분해해서 살펴보자.

 

1. javac은 java 컴파일러의 명령어이다.  ~~ 을 컴파일할 것이야 라는 것을 의미한다.

 

2. -cp는 --class-path을 의미한다. [ 자세한 것은 "javac --help" 로 설명을 참조하자 ]

사용할 라이브러리의 경로를 설정하는 것이다. 내가 사용할 라이브러리는 lib폴더에 있는 

"junit-platform-console-standalone-1.7.1" 파일이다. 

해당 jar파일 안에는 Junit3,4를 지원하는 빈티지와 Junit5를 지원하는 주피터가 존재한다고 한다.

사실상 Junit 전체를 지원한다고 봐도 무방하다.

jar를 따로 경로 설정한 이유는 SampleUnitTest.java 에서 Junit을 이용하기 때문이다.

 

3. cp이후에는 컴파일하고자 하는 자바 파일들을 나열한다. [ 폴더 구조로 넣어도 된다. EX ./*.java ] 이런 식

위와 같이 compile 하고 나면. class 파일이 생긴다. 자바 소스코드를 바이트코드로 컴파일을 한 것이다. 이 오브젝트 코드들을 실행시켜야 한다.

이 또한 jar파일로 실행시켜야 한다.

 

여기서 주의할 점

나의 경우 패키지명을 따로 설정하지 않았고, 패키지명에 맞게끔 import 하는 문도 없다.

위의 샘플을 console-standalone을 실행해보는 것에 의미를 둔다. 

 

복잡한 패키지 구조와 import가 얽혀있는 경우에는 그에 맞게 프로젝트 구조를 설정하고 import 하고 있는 파일들의 경로가 하나도 틀리지 않아야 컴파일이 완료된다. 

 

그러니 위의 샘플을 테스트해 볼 때는 꼭 패키지를 빼고 해 보자. [ 정말 복잡한 부분은 패키지 구조와 import문을 다 체크할 때 생긴다. ] [ 안타깝지만 그것에 대해선 다루지 않는다. ]

 

2. console-standalone 을 돌려보자

java -jar "./lib/junit-platform-console-standalone-1.7.1.jar" -cp "." --select-class SampleUnitTest

혹은

java -jar "./lib/junit-platform-console-standalone-1.7.1.jar" -cp "." -c SampleUnitTest

 

위와 같이 결과가 나온다. [ 일부러 한 test 케이스는 fail로 설정했다. ]  (testValidFail() 메서드)

 

java은. class 파일들의 실행 명령어이다. (. class 파일들에서. class 확장자는 생략한다)

 

-jar는 실행하는 데 사용할 라이브러리이고 

 

-cp는 실행시킬 파일들에 대한 클래스 패스를 설정하는 것이다. 나의 경우 "."로 현재 디렉터리를 의미한다.

 

이후의 파일명들을 실행시킬 테스트 파일이다.

 

 

JUnit 5 User Guide

Although the JUnit Jupiter programming model and extension model will not support JUnit 4 features such as Rules and Runners natively, it is not expected that source code maintainers will need to update all of their existing tests, test extensions, and cus

junit.org

 

위의 가이드에서 4.3 Console Launcher에서 option들을 보면 다양한 기능들을 살펴볼 수 있다.

--reports-dir=[DIR] 을 이용하면 결과를 "DIR"의 이름을 가진 디렉터리에 저장된다.

 

이 결과를 파싱 해서 서버에서는 테스트를 자동으로 돌리고 체크하기를 반복하면 되는 것이다.

 

이후 사용해볼 만한 기능은 패키지 단위로 테스트하는 것인데... 여기까지는 내 역량을 넘어선다. 다음의 글을 참고하길 바란다.

 

 

Junit 5 - ConsoleLauncher - Java Tutorials

The Junit 5 ConsoleLauncher is a stand-alone application for launching or running the JUnit Platform tests from the console. This article shows you how to static and parallel tests using ConsoleLauncher ...

javabydeveloper.com


마무리... 이 글은 상당히 빈약하다.

 

이 글의 목적은 Junit standalone-console을 한 번 돌려보는 것에 의의를 둔다.

 

standalone-console을 사용할 때 제일 자주 만나는 문제점들은 2가지로 나뉠 듯하다.

 

1. cp로 클래스 패스를 제대로 설정하지 않은 경우 [ jar 실행에 있어서.. ]

 

패키지 단위로 junit을 실행시키고 싶다면 cp에 main클래스가 있는 경로와 test클래스가 있는 경로를 알려주어야 한다.

[test-cp~~(test클래스패스):main-cp~~(main클래스패스)] 으로 말이다.

보통은 [com/hw1/test:com/hw1/main] 이런 식의 구조를 갖출 것이다. 

 

실제 패키지 구조를 갖춘 테스트를 실행할 때 아래와 같은 명령을 사용했다.

 

java -jar "../lib/junit-platform-console-standalone-1.7.1.jar" -cp "test/test:/test/main" --select-class Test

 

2. 해당 java파일에서 제대로 된 패키지 선언 와 import문을 처리하지 않은 경우

 

이 경우 Junit이 테스트할 클래스를 찾지 못했다고 에러가 나며 끝이 난다.

 

이런 문구를 확인한 것이라면 import문이 제대로 처리되었는지 체크해봐야 할 것이다.

 

위의 1,2번만 문제가 없다면 standalone의 다양한 옵션들을 즐겨볼 수 있을 것이다.

 

마무리... IDE의 편리함과 Console의 자동화를 구축하기 위한 불편함

 

뭐든지 익숙해지기까지는 시간이 걸리고, 어느 정도 불편함을 느끼게 된다.

 

Console 자동화가 가져다 줄 편리함에 대해선 초기의 불편함을 대가로 해야 하는 것이다.

 

IDE에서 알아서 처리해주던 기능들을 console에서 직접 활용해 보니까... IDE의 소중함을 느끼게 되었다.

 

서버 쪽 소프트웨어 엔지니어가 아니면 standalone-console은 거의 건들일이 없을 듯한데...

 

요즘에는 웬만한 모든 것을 자동화시면서 프로젝트를 진행해 나가기 때문에

 

여기에 test까지 자동화해서 돌리게끔 설정한다면 더 안정적인 프로젝트 운영이 가능하지 않을까 한다.

 

제일 많은 삽질은 javac로 컴파일하지 않은 부분에 있었다.

 

이후의 삽질은 -cp와 개별 java파일들의 패키지와 import 구조를 제대로 맞추지 않았던 점...

 

누군가에게 좋은 도움이 되는 글이었으면 좋겠다.

 

나의 경우 배치파일을 만들어 학생들의 과제(테스트 파일)들을 실행시키기 위한 프로그램을 만들다가 건드려보게 되었다.

 

제발.. 그 프로그램이 안전하게 만들어지길 바랄 뿐이다. 

 

cmd에선

 

java -jar "./lib/junit-platform-console-standalone-1.7.1.jar" -cp "." -c SampleUnitTest > result.txt

 

처럼 >로 output을 파일에 저장할 수 있다.

 

이렇게 만들어 둔 다음 파싱하면서 학생들의 결과를 체크해볼 수 있는 것이다.!!

 

 

 

 

 

 

 

 

 

 

 

 

반응형