Technical Note/JAVA

Java에서 XML을 다루기 위한 API들입니다. DOM, SAX, JDOM,StAX

IBM의 developerworks에 보면 좋은 tutorial이 있습니다.
    XML 입문(한글) : http://www.ibm.com/developerworks/kr/xml/newto/

참고자료를 보면서 간단하게 정리한 내용은..

DOM(document object model) : 
   object-based(객체기반) 으로 트리구조를 이루며 XML 내용을 모두 분석하므로 느리고 메모리 사용이 많음
SAX(simple api for xml) : 
   event-based(이벤트 기반) 으로 순차적으로 읽기만 가능하며 DOM에 비해 빠르고 메모리 사용 적음
JDOM(java document object model) 
   object-based(객체기반)으로 DOM을 Java에 친숙하게 개량하고 DOM,SAX와의 상호 연동 지원
StAX(streaming api for xml) 
   cursor-based(커서 기반)으로 DOM, SAX를 보안한 방법으로 필요할때 정보를 추출

입니다.

다음은 DOM, SAX, StAX에 대한 장단점입니다.
(원본 출처가 oracle magazine이었는데 갈무리한 blog를 까먹었네요.)
□ XML 구문 분석 기술 요약    

    ㅁ 장점
    +-------------------------------------------------------------------------------------------------
    |DOM |* 사용 편의성                                                                              
    |        |* 편리한 탐색을 위한 풍부한 API 집합                                             
    |        |* 전체 트리가 메모리로 로드되므로 XML 문서에 대한 임의 액세스 허용
    +---------------------------------------------------------------------------------------
    |SAX  |* 전체 문서가 메모리에 로드되지 않으므로 메모리 소비량 감소            
    |        |* 여러 ContentHandler를 등록할 수 있는 푸시 모델                            
    +---------------------------------------------------------------------------------------
    |StAX |* 편의성과 성능을 위한 두 개의 구문 분석 모델이 포함되어 있음     
    |        |* 애플리케이션이 구문 분석을 제어하므로 여러 입력이 더 쉽게 지원됨
    |        |* 효율적인 데이타 검색을 가능하게 하는 강력한 필터링 기능 제공   
    +---------------------------------------------------------------------------------------
    
    ㅁ 단점
    +---------------------------------------------------------------------------------------
    |DOM |* 한 번에 구문 분석해야 함                                       
    |        |* 전체 트리를 메모리로 로드하는 경우 과도한 부담 발생
    |        |* 객체 유형 바인딩의 경우 일반 DOM 노드가 적합하지 않음           
    |        |  (모든 노드에 대한 객체 작성 필요)                               
    +---------------------------------------------------------------------------------------
    |SAX  |* 내장된 문서 탐색 지원 없음                            
    |        |* XML 문서에 대한 임의 액세스 없음                 
    |        |* XML 수정에 대한 지원 없음                           
    |        |* 이름 공간 범위 지정에 대한 지원 없음             
    +---------------------------------------------------------------------------------------
    |StAX |* 내장된 문서 탐색 지원 없음                           
    |        |* XML 문서에 대한 임의 액세스 없음                
    |        |* XML 수정에 대한 지원 없음                          
    +---------------------------------------------------------------------------------------
        
    ㅁ 가장 적합한 경우
    +---------------------------------------------------------------------------------------
    |DOM |* XML 문서를 수정해야 하거나 XSLT를 위한 애플리케이션            
    |        |  (읽기 전용 XML 애플리케이션에는 사용되지 않음)               
    +---------------------------------------------------------------------------------------
    |SAX  |* XML에서 읽기만 수행하는 애플리케이션                            
    |        |  (XML 문서 조작 또는 수정에는 사용되지 않음)                    
    +---------------------------------------------------------------------------------------
    |StAX |* 스트리밍 모델과 네임 스페이스에 대한 지원이 필요한 애플리케이션
    |        |  (XML 문서 조작 또는 수정에는 사용되지 않음)                     
    +---------------------------------------------------------------------------------------



이후 소스들은 참고자료를 보면서 따라해본 소스들이며 JDK 5에서 테스트 하였으며
샘플로 사용한 xml 파일은 상당히 단순합니다.

xml 샘플파일 a.xml



DOM 사용
DOM을 사용하여 XML 을 읽어 전체 읽기, 수정, 삭제, 다시 XML 파일로 저장의 작업 샘플입니다.
"Understanding DOM : http://www.ibm.com/developerworks/edu/x-dw-xudom-i.html" 를 보면서 따라한 샘플입니다.

DOM 샘플 : DOM.java




SAX 사용
"Understanding SAX : http://www.ibm.com/developerworks/edu/x-dw-xusax-i.html" 을 보면서 따라한 샘플입니다.
소스 파일이 2개 있는데 SAX.java와 필터를 사용한 SAX_Filter.java입니다.
SAX.java는 기초적인 사용 예제로 DefaultHandler라는 여러 핸들러를 implement한 껍데기 클래스입니다.
Content나 Error등의 각기 인터페이스 클래스가 제공되므로 따로 구현해도 됩니다.

SAX 샘플 : SAX.java


SAX_XMLFilter.java는 필터 기능을 넣는 방법으로 각 event 전 후에 해당 메소드들이 실행되며
XMLFilterImpl 클래스를 상속하여 구현합니다.

SAX Filter 사용 샘플 : SAX_XMLFilter.java



JDOM
일단, JDOM 홈페이지(http://www.jdom.org/) 에서 jdom.jar 를 받아야 합니다.
"Simplify XML programming with JDOM : http://www.ibm.com/developerworks/java/library/j-jdom/" 와 jdom 다운시 들어있는 샘플을 보고 돌려봤습니다.

JDOM 사용 샘플 : JDOM.java



StAX
StAX의 경우 API와 RI(구현체)가 여러가지 있습니다. (처음에 BEA에서 만들었군요)
http://stax.codehaus.org/ 와 http://woodstox.codehaus.org/ 에서 API와 RI의 .jar 를 받을 수 있는데 
아래 샘플에선 stax.codehaus.org에서 받은 라이브러리를 사용했습니다.
다른 분들은 woodstox를 사용하시는 것 같습니다.

샘플에서 XML 파일을 읽고 쓰는데 2가지 방식(XMLStreamReader와 XMLEventWriter) 이 있습니다.
참고자료의 "StAX'ing up XML, Part1,2,3" 을 보고 만들었습니다.

StAX 사용 샘플 : StAX.java



참고자료 : (IBM developerworks의 경우 일부 글들은 가입하셔야 볼 수 있습니다.)

XML 입문(한글) : http://www.ibm.com/developerworks/kr/xml/newto/

DOM
    Understanding DOM : http://www.ibm.com/developerworks/edu/x-dw-xudom-i.html
    Java와 XML 5장 DOM : http://kwon37xi.springnote.com/pages/1231818
    Java와 XML 6장 Advanced DOM : http://kwon37xi.springnote.com/pages/1231820

SAX - 홈 : http://www.saxproject.org/
    Understanding SAX : http://www.ibm.com/developerworks/edu/x-dw-xusax-i.html
    Java와 XML 3장 SAX : http://kwon37xi.springnote.com/pages/1231802
    Java와 XML 5장 Advanced SAX : http://kwon37xi.springnote.com/pages/1231814

JDOM - 홈 : http://www.jdom.org/
    Simplify XML programming with JDOM : http://www.ibm.com/developerworks/java/library/j-jdom/
    Java와 XML 7장 JDOM : http://kwon37xi.springnote.com/pages/1231824
    Java와 XML 8장 Advanced JDOM : http://kwon37xi.springnote.com/pages/1231828

StAX
    StAX'ing up XML, Part 1: An introduction to Streaming API for XML (StAX): 
        http://www.ibm.com/developerworks/library/x-stax1.html
    StAX'ing up XML, Part 2: Pull parsing and events :
        http://www.ibm.com/developerworks/java/library/x-stax2.html
    StAX'ing up XML, Part 3: Using custom events and writing XML :
        http://www.ibm.com/developerworks/xml/library/x-stax3.html
    StAX API 및 RI : 
        http://stax.codehaus.org/
        http://woodstox.codehaus.org/


Technical Note/TEST AUTOMATION

TestNG는 단위테스트를 비롯하여 기능테스트, 통합테스트, 인수테스트 등 모든 범주의 테스트를 지원하는 것을 추구한다. JUnit보다 더욱 유연하고 쉬운 테스트가 가능하며, 효율적인 테스트를 위한 많은 기능들을 제공하고 있다. 차세대 자바 테스팅 엔진으로서 손색이 없는 TestNG의 사용법을 예제를 통해 알아본다.

1. 기본 테스트 예제

import org.testng.Assert;
import org.testng.annotations.Test;

public class SimpleTest {
	private int x = 2;
	private int y = 3;

	@Test
	public void testAddition() {
		int z = x + y;
		Assert.assertEquals(5, z);
	}

	@Test(groups = { "fast" })
	public void aFastTest() {
		System.out.println("Fast test");
	}

	@Test(groups = { "slow" })
	public void aSlowTest() {
		System.out.println("Slow test");
	}
}

- @Test 어노테이션을 사용하여 테스트 메소드를 정의하고, Assert 구문을 사용하여 테스트를 검증한다.
- JUnit과는 다르게 테스트 메소드를 groups 파미미터 지정으로 특정 그룹으로 지정할 수 있다.
- 이렇게 지정된 그룹은 이후에 그룹별 실행이나 종속성을 갖도록 설정되어질 수도 있다.

- 아래는 테스트를 수행한 한 예로 testng.xml 파일을 이용한 것이다. 결과는 콘솔에 보여준다.

C:\TestingWorks\TestNG01>java org.testng.TestNG testng.xml
[Parser] Running:
  D:\WORKS\TestingWorks\TestNG01\temp-testng-customsuite.xml

Slow test
Fast test
PASSED: aSlowTest
PASSED: testAddition
PASSED: aFastTest

===============================================
    SimpleTest
    Tests run: 3, Failures: 0, Skips: 0
===============================================


===============================================
TestNG01
Total tests run: 3, Failures: 0, Skips: 0
===============================================


- 테스트 수행은 다양하게 설정되어 질 수 있는데, 위 테스트의 testng.xml의 내용이다.

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="TestNG01">
  <test verbose="2" name="SimpleTest" annotations="JDK">
    <classes>
      <class name="testing.testng.SimpleTest"/>
    </classes>
  </test>
</suite>


2. 테스트 메소드 실행 전/후에 처리작업 수행하기

import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterGroups;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeGroups;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;

public class BeforeAfterTest {

	@BeforeSuite
	public void beforeSuite() {
		System.out.println("@BeforeSuite");
	}

	@AfterSuite
	public void afterSuite() {
		System.out.println("@AfterSuite");
	}

	@BeforeTest
	public void beforeTest() {
		System.out.println("@BeforeTest");
	}

	@AfterTest
	public void afterTest() {
		System.out.println("@AfterTest");
	}

	@BeforeClass
	public void beforeClass() {
		System.out.println("@BeforeClass");
	}

	@AfterClass
	public void afterClass() {
		System.out.println("@AfterClass");
	}

	@BeforeGroups(groups = { "fast" })
	public void beforeGroups() {
		System.out.println("@BeforeGroups: fast");
	}

	@AfterGroups(groups = { "fast" })
	public void afterGroups() {
		System.out.println("@AfterGroups: fast");
	}

	@BeforeMethod
	public void beforeMethod() {
		System.out.println("@BeforeMethod");
	}

	@AfterMethod
	public void afterMethod() {
		System.out.println("@AfterMethod");
	}

	@Test(groups = { "fast" })
	public void aFastTest() {
		System.out.println("Fast test");
	}

	@Test(groups = { "slow" })
	public void aSlowTest() {
		System.out.println("Slow test");
	}
}

- TestNG는 테스트 수행시 다양한 스코프의 전/후 처리작업을 설정할 수 있다.
- 실행 전 순서: @BeforeSuite -> @BeforeTest -> @BeforeClass -> @BeforeGroups -> @BeforeMethod
- 실행 후 순서: @AfterMethod -> @AfterGroups -> @AfterClass -> @AfterTest -> @AfterSuite

- 아래는 테스트를 수행시 아래와 유사한 결과를 볼 수 있다.

[Parser] Running:
  C:\TestingWorks\TestNG01\temp-testng-customsuite.xml

@BeforeSuite
@BeforeTest
@BeforeClass
@BeforeMethod
Slow test
@AfterMethod
@BeforeGroups: fast
@BeforeMethod
Fast test
@AfterMethod
@AfterGroups: fast
@AfterClass
@AfterTest
PASSED: aSlowTest
PASSED: aFastTest

===============================================
    testing.testng.study02.BeforeAfterTest
    Tests run: 2, Failures: 0, Skips: 0
===============================================

@AfterSuite

===============================================
TestNG01
Total tests run: 2, Failures: 0, Skips: 0
===============================================


3. 테스트 그룹 지정을 통한 보다 유연한 테스트하기

import org.testng.annotations.Test;

@Test(groups = {"func-test"})
public class GroupTest {
	@Test(groups = { "fast" })
	public void aFastTest() {
		System.out.println("Fast test");
	}

	@Test(groups = { "slow", "broken" })
	public void aSlowTest() {
		System.out.println("Slow test");
	}
}

- 테스트 그룹은 메소드와 클래스 레벨 모두 지정할 수 있고, 클래스 레벨에서 지정된 그룹(func-test)은 해당 클래스내의 모든 테스트 메소드들이 속한 대한 그룹이 된다.
- 테스트 설정파일 testng.xml을 통해 테스트 코드가 완성되지 않은 특정 그룹에 속한 메소드는 테스트에서 제외할 수도 있다.

- 아래 예는 "fast" 그룹에 속한 메소드만을 실행하며, "broken" 그룹에 속한 메소드는 실행에서 제외한다.

<!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" >
<suite name="Simple Suite">
  <test name="Test2">
    <groups>
      <run>
        <include name="fast" />
        <exclude name="broken" />
      </run>
    </groups>
  </test>
</suite>


4. 테스트 메소드 및 그룹간 종속성 지정을 통한 단위테스트 넘어서기

import org.testng.annotations.Test;

public class MethodDependencyTest {
	@Test
	public void serverStartedOk() {
		System.out.println("serverStartedOk");
	}

	@Test(dependsOnMethods = { "serverStartedOk" })
	public void testMethod1() {
		System.out.println("testMethod1");
	}
}

- 테스트 메소드간 종속성을 지정하여 테스트 메소드간의 실행 순서를 지정할 수 있다.

import org.testng.annotations.Test;

public class GroupDependencyTest {
	@Test(groups = { "init" })
	public void serverStartedOk() {
		System.out.println("serverStartedOk");
	}

	@Test(groups = { "init" })
	public void initEnvironment() {
		System.out.println("initEnvironment");
	}

	@Test(dependsOnGroups = { "init.*" })
	public void testMethod1() {
		System.out.println("testMethod1");
	}
}

- 테스트 그룹간 종속성을 지정하여 해당 그룹에 지정된 테스트의 실행 순서를 지정할 수 있다.
- 그룹명 및 메소드명 지정시 정규표현식을 이용할 수 있다. 위 예에서 init.*는 init로 시작하는 모든 그룹을 의미한다.

5. 예외처리 테스트하기 

import org.testng.annotations.Test;

public class ExceptionTest {
	@Test(expectedExceptions = { ArithmeticException.class })
	public void divisionByZero() {
		int n = 2 / 0;
		System.out.println(n);
	}

	@Test(expectedExceptions = { NumberFormatException.class })
	public void parseInteger() {
		int n = Integer.parseInt("two");
		System.out.println(n);
	}
}

- 기대되어지는 예외 클래스와 동일한 예외가 발생되면 성공으로 간주한다. 예외 클래스는 1개이상 지정할 수 있다.

6. 타임아웃 테스트하기 

import java.util.Random;
import org.testng.annotations.Test;

public class TimeOutTest {
	@Test(timeOut = 2000)
	public void testServer() throws Exception {
		Random rand = new Random();
		long responseTime = rand.nextInt(3000);
		System.out.println(responseTime);
		Thread.sleep(responseTime);
	}
}

- 지정된 시간안에 정상적으로 처리되면 성공이고, 그렇지 않으면 실패로 간주된다. 

7. 지정된 회수만큼 반복 테스트 수행하기 

import org.testng.annotations.Test;

public class RepeatedTest {
	@Test(invocationCount = 5)
	public void testServer() {
		System.out.println("accessPage");
	}
}

- 지정된 회수만큼 반복하여 테스트를 수행한다. 

8. 지정된 쓰레드 개수만큼 테스트를 병렬로 수행하기 

import java.util.Random;

import org.testng.annotations.Test;

public class ParallelRunningTest {
	@Test(threadPoolSize = 5, invocationCount = 10, timeOut = 2000)
	public void testServer() throws Exception {
		System.out.println(Thread.currentThread().getId());

		Random rand = new Random();
		long responseTime = rand.nextInt(3000);
		System.out.println(responseTime);
		Thread.sleep(responseTime);		
	}
}

- 테스트 반복 수행시 테스트 수행속도 향상을 위해 지정된 쓰레드 개수만큼 병렬로 테스트를 수행한다. 

9. 파라미터를 이용한 테스트 수행하기 

import org.testng.annotations.Parameters;
import org.testng.annotations.Test;

public class ParameterTest {
	@Parameters( { "first-name" })
	@Test
	public void testSingleString(String firstName) {
		System.out.println("Invoked testString " + firstName);
		assert "Sehwan".equals(firstName);
	}
}

- @Parameters 어노테이션으로 지정된 파라미터들에 대해서 testng.xml 파일로부터 값을 얻어와 테스트를 수행할 수 있다.

- testng.xml 의 파라미터 설정 예는 아래와 같다.

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="TestNG01">
  <test name="Test1">
    <parameter name="first-name" value="Sehwan" />
    <classes>
      <class name="testing.testng.ParameterTest" />
    </classes>
  </test>  
</suite>


10. DataProvider를 이용한 Data-Driven 테스트 수행하기 

import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

public class DataProviderTest {
	@Test(dataProvider = "dp")
	public void verifyData1(String n1, Integer n2) {
		System.out.println(n1 + " " + n2);
	}

	@DataProvider(name = "dp")
	public Object[][] createData() {
		return new Object[][] { { "John", new Integer(34) },
				{ "Jane", new Integer(31) }, };
	}
}

- @DataProvider을 통해 2차원 배열형태로 데이터를 제공자하는 메소드를 정의한다.
- 테스트 메소드는 이 Data Provider를 이용하여 미리 정의된 데이터 집합을 가지고 반복적인 테스트를 수행할 수 있다.

import java.lang.reflect.Method;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

public class DataProviderParamTest {
	@Test(dataProvider = "dp")
	public void testData1(String s) {
		System.out.println(s);
	}

	@Test(dataProvider = "dp")
	public void testData2(String s) {
		System.out.println(s);
	}

	@DataProvider(name = "dp")
	public Object[][] createData(Method m) {
		System.out.println(m.getName());
		return new Object[][] { { "Hello" } };
	}
}

- Data Provider를 이용하는 테스트 메소드들에 대한 참조를 할 수 있다.

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

public class DataProviderIteratorTest {

	@Test(dataProvider = "dp")
	public void verifyData1(String n1, Integer n2) {
		System.out.println(n1 + " " + n2);
	}

	@DataProvider(name = "dp")
	public Iterator<Object[]> createData() {		
		List<Object[]> list = new ArrayList<Object[]>();
		list.add(new Object[] {"John", new Integer(34)});
		list.add(new Object[] {"Jane", new Integer(31)});
		return list.iterator();
	}
}

- 이차원 배열이 아닌 Iterator 타입의 데이터 집합을 반환하는 Data Provider를 만들 수 있다.
- 이 방식은 Lazy Loading을 통해서 메모리 부족에 대한 좋은 해결책을 제공할 수 있다.

import org.testng.annotations.Test;

public class StaticDataProviderTest {
	@Test(dataProvider = "dp", dataProviderClass = StaticDataProvider.class)
	public void test(Integer n) {
		System.out.println("Number:" + n);
	}
}

- Data Provider를 테스트 클래스 밖으로 꺼내어 별도의 클래스로 만들어서 이용할 수 있다.
- 동일한 Data Provider를 이용하는 테스트 클래스가 여럿일 경우 유용하게 쓰일 수 있다.

import org.testng.annotations.DataProvider;

public class StaticDataProvider {
	@DataProvider(name = "dp")
	public static Object[][] createData() {
		return new Object[][] { new Object[] { new Integer(42) } };
	}
}


사진이야기





나의 시야를 가로막고있는

그 무엇들은

내게 어두운 존재일까

밝은 존재일까


여긴 위일까 아래일까












Technical Note/TEST AUTOMATION

maven 프로젝트를 실행하려고 하니 "Unsupported major.minor version 51.0" 와 같은 에러가 났다 


---- 에러 내용 ----

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.16:test (default-test) on project TestAutomationScript: Execution default-test of goal org.apache.maven.plugins:maven-surefire-plugin:2.16:test failed: There was an error in the forked process

[ERROR] java.lang.UnsupportedClassVersionError: io/appium/java_client/AppiumDriver : Unsupported major.minor version 51.0

[ERROR] at java.lang.ClassLoader.defineClass1(Native Method)

[ERROR] at java.lang.ClassLoader.defineClassCond(ClassLoader.java:637)

[ERROR] at java.lang.ClassLoader.defineClass(ClassLoader.java:621)

[ERROR] at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)

[ERROR] at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)

[ERROR] at java.net.URLClassLoader.access$000(URLClassLoader.java:58)

[ERROR] at java.net.URLClassLoader$1.run(URLClassLoader.java:197)

[ERROR] at java.security.AccessController.doPrivileged(Native Method)

[ERROR] at java.net.URLClassLoader.findClass(URLClassLoader.java:190)

[ERROR] at java.lang.ClassLoader.loadClass(ClassLoader.java:306)

[ERROR] at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)

[ERROR] at java.lang.ClassLoader.loadClass(ClassLoader.java:247)

[ERROR] at java.lang.Class.getDeclaredMethods0(Native Method)

[ERROR] at java.lang.Class.privateGetDeclaredMethods(Class.java:2484)

[ERROR] at java.lang.Class.privateGetPublicMethods(Class.java:2604)

[ERROR] at java.lang.Class.getMethods(Class.java:1446)

[ERROR] at org.testng.internal.TestNGClassFinder.<init>(TestNGClassFinder.java:59)

[ERROR] at org.testng.TestRunner.initMethods(TestRunner.java:409)

[ERROR] at org.testng.TestRunner.init(TestRunner.java:235)

[ERROR] at org.testng.TestRunner.init(TestRunner.java:205)

[ERROR] at org.testng.TestRunner.<init>(TestRunner.java:153)

[ERROR] at org.testng.SuiteRunner$DefaultTestRunnerFactory.newTestRunner(SuiteRunner.java:536)

[ERROR] at org.testng.SuiteRunner.init(SuiteRunner.java:159)

[ERROR] at org.testng.SuiteRunner.<init>(SuiteRunner.java:113)

[ERROR] at org.testng.TestNG.createSuiteRunner(TestNG.java:1299)

[ERROR] at org.testng.TestNG.createSuiteRunners(TestNG.java:1286)

[ERROR] at org.testng.TestNG.runSuitesLocally(TestNG.java:1140)

[ERROR] at org.testng.TestNG.run(TestNG.java:1057)

[ERROR] at org.apache.maven.surefire.testng.TestNGExecutor.run(TestNGExecutor.java:217)

[ERROR] at org.apache.maven.surefire.testng.TestNGXmlTestSuite.execute(TestNGXmlTestSuite.java:84)

[ERROR] at org.apache.maven.surefire.testng.TestNGProvider.invoke(TestNGProvider.java:92)

[ERROR] at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:200)

[ERROR] at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:153)

[ERROR] at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103)


원인을 찾아보니

컴파일때 사용된 JDK버전과 실행시 사용되는 JDK 버전이 다르다고 했다


정말 mvn -version을 하니 java home의 경로가 jdk 1.6을 바라보고 있는것이 아닌가?

.bash_profile에서 java home을 jdk 1.7로 변경하니 문제가 해결되었다



Technical Note/TEST AUTOMATION

If you want to select a different TestNG test suite .xml files to run test from you can do the following in the pom.xml file:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.13</version>
    <configuration>
        <forkMode>always</forkMode>
        <systemPropertyVariables>
            <reporter.debug>false</reporter.debug>                     
        </systemPropertyVariables>
        <suiteXmlFiles>
            <suiteXmlFile>${suiteXmlFile}</suiteXmlFile>
        </suiteXmlFiles>
    </configuration>
</plugin>

You can however add a specific test suite file to a Maven property:

1
2
3
<properties>
     <suiteXmlFile>testng.xml</suiteXmlFile>
 </properties>

To run the tests from a particular TestNG test suite file you can run the following command from terminal:

1
mvn clean test -DsuiteXmlFile=custom.xml


1 2 3 4 5 ··· 48
블로그 이미지

zzikjh