본문 바로가기

Java

[Java] Interface. - 아주 간단한 테스트 프레임웍 만들어보기 3 -

앞선 포스트에서는 Interface를 사용해서 같은 Interface를 구현한 테스터 클래스들을
한번에 실행하여 그 결과를 볼 수 있는 Tester.java 까지 구현하였습니다.


Tester.java
public class Tester {
public static void main(String[] args) throws Exception {
MultiTester multiTester = new MultiTester();
multiTester.addTester(new ProductListsCompareTester());
multiTester.addTester(new ProductRankScoreTester());
//새로운 테스터 추가
multiTester.addTester(new NewServiceTester());
System.out.println("통과여부 : " + multiTester.isAllPassed());
}
}
view raw 1.java hosted with ❤ by GitHub

새로운 테스터가 추가되어야 한다면
ProductTester Interface를 구현하여 위 Tester.java 에서 그 클래스를 add해주면 되었습니다.

하지만, 매번 이렇게 테스터가 추가 될 때 마다
클래스를 수정하고, 컴파일해서 배포를 해야 한다면 조금 귀찮은 작업이 될 수도 있습니다.
그리고, 실제로 현장에서 사용되는 테스터 클래스가 한두개가 아닐 수 있는데
그렇게 되면 Tester.java의 클래스는 addTester 메서드로 도배가 될 것 입니다.

그래서 간단하게 프로퍼티를 사용해서 , 테스트 할 테스터 클래스들을 선언하고
이를 이용해서 Tester.java 를 구현해보려고 합니다.

일단 프로퍼티 파일을 만들고 거기다가 테스트 할 테스터 클래스들을 기술합니다.

그리고 이 프로퍼티 파일을 읽어서 해당 테스터 클래스들을 동적으로 생성하고
이를 이용해서 테스트를 수행하는 것이지요..


tester.properties
tester = testfw.NewServiceTester;testfw.ProductListsCompareTester;testfw.ProductRankScoreTester
view raw 2.properties hosted with ❤ by GitHub
Tester.java
package testfw;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Properties;
public class Tester {
public static void main(String[] args) throws Exception {
// MultiTester multiTester = new MultiTester();
// multiTester.addTester(new ProductListsCompareTester());
// multiTester.addTester(new ProductRankScoreTester());
//
// //새로운 테스터 추가
// multiTester.addTester(new NewServiceTester());
//
// System.out.println("통과여부 : " + multiTester.isAllPassed());
Class claz = Tester.class;
//InputStream is = new FileInputStream(new File("C:/Edu/bin/testfw/tester.properties"));
InputStream is = claz.getResourceAsStream("tester.properties");
Properties prop = new Properties();
prop.load(is);
MultiTester multiTester = new MultiTester();
String[] testers = prop.getProperty("tester").split(";");
for(String className : testers) {
Class<?> clazz = Class.forName(className);
ProductTester tester = (ProductTester)clazz.newInstance();
multiTester.addTester(tester);
}
System.out.println(prop.getProperty("tester"));
System.out.println("통과여부 : " + multiTester.isAllPassed());
}
}
view raw 3.java hosted with ❤ by GitHub

프로퍼티 파일에서 테스터 클래스들을 가져와서 Class.forName 을 통해서 해당 class의 Class instance를 얻고
(관련 글 참조 : http://devyongsik.tistory.com/292) 이를 사용하여 객체를 생성해서 테스트를 수행하는 코드 입니다.
프로퍼티 파일에 대한 stream을 얻는 방법은 위의 두가지 경우처럼 절대경로를 이용하거나, Class의 getResource 메서드를 사용하여 클래스패스에 있는 프로퍼티를 읽어 올 수 있는 방법이 있습니다.
(관련 글 참고 : http://devyongsik.tistory.com/171)

여기서 얘기하고 싶은 것은 저것이 아니기 때문에.. 일단 넘어가고... 아무튼 프로퍼티로 부터 클래스의 full name을 얻어와서
이를 사용해 동적으로 객체를 생성하게 되어 있습니다.
꼭 .properties일 필요는 없고 xml로 만들어서 사용하셔도 되겠죠..

만약에 테스터 클래스가 추가 되어야 한다고 하면 위 상태에서는 소스를 건드릴 것이 아무것도 없습니다

단지, properties 파일에 추가 될 테스터 클래스의 이름을 추가해주기만 하면
알아서 테스트를 실행하게 됩니다.

이정도만 해도 꽤 쓸만 할 것 입니다. (아닐까요..ㅋㅋ)

아직 인터페이스를 사용하는 것이 왜 좋은지 감이 안 오신다면..
위 코드를 인터페이스를 사용하지 않고 한번 구현해보세요.

다음에는 Annotation을 사용해서 만들고자 하는 최종 버전을 작성해 보겠습니다.