2011-08-06 3 views
1

Java에서 동시성이 처음입니다. Junit을 사용하여 일부 코드를 테스트했지만 그 결과는 이상합니다. 아래 코드는 JUnit (Eclipse)로 실행할 때 콘솔에 아무 것도 쓰지 않지만 성공적으로 실행합니다.JUnit 이상 동작으로 멀티 스레드 코드 테스트

// Switch to test with good-old main method. 
public static void main(String args[]) { 

     // code to create IndexFile and DictionaryFile... 
     ... 
     Thread taskOne = new GetNameTask(packOneIndex, packOneDict); 
     Thread taskTwo = new GetNameTask(packTwoIndex, packTwoDict); 
     taskOne.start(); 
     taskTwo.start(); 
} 

을 그리고 이것은 작업입니다 : 내가 주요 방법으로 실행하는 경우

@Test 
public void testGetNameWithMultithreading() { 

    // code to create IndexFile and DictionaryFile... 
    ... 
    Thread taskOne = new GetNameTask(packOneIndex, packOneDict); 
    Thread taskTwo = new GetNameTask(packTwoIndex, packTwoDict); 
    taskOne.start(); 
    taskTwo.start(); 
} 

그러나, 그것은 작동

public class GetNameTask extends Thread { 

    public GetNameTask (IndexFile indexFile, DictionaryFile dictFile) { 
     this.dictFile = dictFile; 
     this.indexFile = indexFile; 
    } 

    @Override 
    public void run() { 
     Dictionary dictionary = new DICTDictionary(indexFile, dictFile); 
     System.out.println(dictionary.getName()); 
    } 

    private final IndexFile indexFile; 
    private final DictionaryFile dictFile; 
} 
DICTDictionary를 구성 할 때, IO의 체인이

파일에서 사전 이름을 가져 오는 작업.

멀티 스레딩을 사용하여 IO 코드를 실행하는 것이 JUnit에서 작동하지 않을 수 있습니다.

편집 : 어떻게 작동 시키는가를 발견했습니다. JUnit은 단일 스레드에서 테스트를 실행하기 때문에 JUnit 스레드에 2 개의 작은 스레드를 결합하여 예상 결과를 얻어야합니다. 그래서, 이것은 작동합니다.

@Test 
public void testGetNameWithMultithreading() { 

    // code to create IndexFile and DictionaryFile... 
    ... 
    Thread taskOne = new GetNameTask(packOneIndex, packOneDict); 
    Thread taskTwo = new GetNameTask(packTwoIndex, packTwoDict); 
    taskOne.start(); 
    taskTwo.start(); 
    try { 
     taskOne.join(); 
     taskTwo.join(); 
    } catch (InteruptedException ie) { 
     ie.printStackTrace(); 
    } 
} 

JUnit으로 멀티 헤드 코드를 테스트하는 더 쉬운 방법이 있습니까?

감사합니다.

+0

당신은 이것에 흥미가있을 것입니다 : http://stackoverflow.com/questions/12159/how-should-i-unit-test-threaded-code – Grundlefleck

답변

2

테스트 메소드는 스레드가 완료 될 때까지 실행을 차단해야합니다.

ThreadPool 사용을 고려하십시오. 자세한 내용은 ExecutorService.awaitTemination을 참조하십시오.

+0

고마워, 나는 그것을 시도하고있다. – Genzer

2

JUnit은 스레드를 제대로 처리하지 못하는 것으로 유명합니다.

저는 TestNG를 사용하여 작동시킬 수있었습니다. 스위치를 권하고 싶습니다. 이는 다른 @Test 주석 가져 오기 및 CLASSPATH의 새 JAR을 의미하지 않습니다.

+2

예, TestNG로해야 할 일은 일반적인 방법으로 테스트를 작성한 다음 testNG에 testNG.xml의 스레드에서 실행하도록 TestNG에 지시하는 것입니다. @Test (threadPoolSize = 10, invocationCount = 10000)를 사용하여 스레드에서 개별 메소드를 실행할 수도 있습니다. http://testng.org –

+1

세드릭 베스트 (Cedric Beust)는 모르는 사람들을위한 TestNG의 창시자입니다. 좋은 물건. – duffymo