앞선 포스트에서는 Interface를 사용해서 같은 Interface를 구현한 테스터 클래스들을
한번에 실행하여 그 결과를 볼 수 있는 Tester.java 까지 구현하였습니다.
Tester.java
새로운 테스터가 추가되어야 한다면
ProductTester Interface를 구현하여 위 Tester.java 에서 그 클래스를 add해주면 되었습니다.
하지만, 매번 이렇게 테스터가 추가 될 때 마다
클래스를 수정하고, 컴파일해서 배포를 해야 한다면 조금 귀찮은 작업이 될 수도 있습니다.
그리고, 실제로 현장에서 사용되는 테스터 클래스가 한두개가 아닐 수 있는데
그렇게 되면 Tester.java의 클래스는 addTester 메서드로 도배가 될 것 입니다.
그래서 간단하게 프로퍼티를 사용해서 , 테스트 할 테스터 클래스들을 선언하고
이를 이용해서 Tester.java 를 구현해보려고 합니다.
일단 프로퍼티 파일을 만들고 거기다가 테스트 할 테스터 클래스들을 기술합니다.
그리고 이 프로퍼티 파일을 읽어서 해당 테스터 클래스들을 동적으로 생성하고
이를 이용해서 테스트를 수행하는 것이지요..
tester.properties
Tester.java
프로퍼티 파일에서 테스터 클래스들을 가져와서 Class.forName 을 통해서 해당 class의 Class instance를 얻고
(관련 글 참조 : http://devyongsik.tistory.com/292) 이를 사용하여 객체를 생성해서 테스트를 수행하는 코드 입니다.
프로퍼티 파일에 대한 stream을 얻는 방법은 위의 두가지 경우처럼 절대경로를 이용하거나, Class의 getResource 메서드를 사용하여 클래스패스에 있는 프로퍼티를 읽어 올 수 있는 방법이 있습니다.
(관련 글 참고 : http://devyongsik.tistory.com/171)
여기서 얘기하고 싶은 것은 저것이 아니기 때문에.. 일단 넘어가고... 아무튼 프로퍼티로 부터 클래스의 full name을 얻어와서
이를 사용해 동적으로 객체를 생성하게 되어 있습니다.
꼭 .properties일 필요는 없고 xml로 만들어서 사용하셔도 되겠죠..
만약에 테스터 클래스가 추가 되어야 한다고 하면 위 상태에서는 소스를 건드릴 것이 아무것도 없습니다
단지, properties 파일에 추가 될 테스터 클래스의 이름을 추가해주기만 하면
알아서 테스트를 실행하게 됩니다.
이정도만 해도 꽤 쓸만 할 것 입니다. (아닐까요..ㅋㅋ)
아직 인터페이스를 사용하는 것이 왜 좋은지 감이 안 오신다면..
위 코드를 인터페이스를 사용하지 않고 한번 구현해보세요.
다음에는 Annotation을 사용해서 만들고자 하는 최종 버전을 작성해 보겠습니다.
한번에 실행하여 그 결과를 볼 수 있는 Tester.java 까지 구현하였습니다.
Tester.java
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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()); | |
} | |
} |
새로운 테스터가 추가되어야 한다면
ProductTester Interface를 구현하여 위 Tester.java 에서 그 클래스를 add해주면 되었습니다.
하지만, 매번 이렇게 테스터가 추가 될 때 마다
클래스를 수정하고, 컴파일해서 배포를 해야 한다면 조금 귀찮은 작업이 될 수도 있습니다.
그리고, 실제로 현장에서 사용되는 테스터 클래스가 한두개가 아닐 수 있는데
그렇게 되면 Tester.java의 클래스는 addTester 메서드로 도배가 될 것 입니다.
그래서 간단하게 프로퍼티를 사용해서 , 테스트 할 테스터 클래스들을 선언하고
이를 이용해서 Tester.java 를 구현해보려고 합니다.
일단 프로퍼티 파일을 만들고 거기다가 테스트 할 테스터 클래스들을 기술합니다.
그리고 이 프로퍼티 파일을 읽어서 해당 테스터 클래스들을 동적으로 생성하고
이를 이용해서 테스트를 수행하는 것이지요..
tester.properties
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
tester = testfw.NewServiceTester;testfw.ProductListsCompareTester;testfw.ProductRankScoreTester |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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()); | |
} | |
} |
프로퍼티 파일에서 테스터 클래스들을 가져와서 Class.forName 을 통해서 해당 class의 Class instance를 얻고
(관련 글 참조 : http://devyongsik.tistory.com/292) 이를 사용하여 객체를 생성해서 테스트를 수행하는 코드 입니다.
프로퍼티 파일에 대한 stream을 얻는 방법은 위의 두가지 경우처럼 절대경로를 이용하거나, Class의 getResource 메서드를 사용하여 클래스패스에 있는 프로퍼티를 읽어 올 수 있는 방법이 있습니다.
(관련 글 참고 : http://devyongsik.tistory.com/171)
여기서 얘기하고 싶은 것은 저것이 아니기 때문에.. 일단 넘어가고... 아무튼 프로퍼티로 부터 클래스의 full name을 얻어와서
이를 사용해 동적으로 객체를 생성하게 되어 있습니다.
꼭 .properties일 필요는 없고 xml로 만들어서 사용하셔도 되겠죠..
만약에 테스터 클래스가 추가 되어야 한다고 하면 위 상태에서는 소스를 건드릴 것이 아무것도 없습니다
단지, properties 파일에 추가 될 테스터 클래스의 이름을 추가해주기만 하면
알아서 테스트를 실행하게 됩니다.
이정도만 해도 꽤 쓸만 할 것 입니다. (아닐까요..ㅋㅋ)
아직 인터페이스를 사용하는 것이 왜 좋은지 감이 안 오신다면..
위 코드를 인터페이스를 사용하지 않고 한번 구현해보세요.
다음에는 Annotation을 사용해서 만들고자 하는 최종 버전을 작성해 보겠습니다.