2012-03-10 8 views
1

Eclipse 3.7에서 JUnit 4.10을 실행하고 있습니다. 나는 데이터베이스 테스트를하고있다 : 사용 된 데이터베이스는 sqlitejdbc 인 SQLite3이다. 나는 창문과 리눅스 모두에서 시험을 시험해 보았고 나의 관측은 다음과 같다.JUnit 테스트에서 SQLite 데이터베이스 잠금

  • Windows 7 x64에서, 테스트는 더 빨리 실행된다 (테스트 당 0.6s). "데이터베이스 파일을 열 수 없습니다"라는 오류 메시지가 나타납니다. 간헐적 인 것으로 보입니다. (때로는 동일한 테스트가 다음 실행이 실패 할 때 한 번 성공할 수 있습니다.)
  • 우분투 11.10 x64에서 테스트는 느립니다 (테스트 당 3 초). "데이터베이스 잠김"에 관한 오류가 발생합니다. Windows의 오류가 간헐적으로 발생하는 것과 달리 여기서 오류는 동일한 테스트/파일에서 발생하는 것으로 보이고 잠금 오류가 발생하면 모든 테스트가 실패합니다.

당신은 GitHub에 테스트를위한 코드를 찾을 수 있습니다

UPDATE. 나는 문제가 내 @BeforeClass, @Before 및 테스트 스위트가 설치 얼마나 함께 할 수있는 뭔가있을 것 같아요

내 테스트 클래스에서 다음

@RunWith(Suite.class) 
@SuiteClasses({ DataAccessTests.class, SimpleQueryTests.class, ... }) 
public class DataAccessTestSuite { 
    @BeforeClass 
    public static void setUpDatabase() throws SQLException, ClassNotFoundException {  
     DataAccess.setEnvironment(DataAccess.DATABASE_TESTING); 
     Connection conn = DataAccess.getConn(); 

     // truncate tables: simply DELETE statements 
     truncateTables(conn); 

     // insert test data, INSERT statements 
     insertTestData(conn); 
    } 

같은 테스트 스위트가 나는 또한 설정을 호출하는 @Before 있었다 .

public class EventsDataAccessTests { 

    @Before 
public void setup() throws SQLException, ClassNotFoundException { 
    DataAccessTestSuite.setUpDatabase(); 
} 

전체 제품군을 호출하고 싶지 않을 경우에 대비해 데이터베이스를 설정하고 싶습니다. 나는이 문제가이 문제와 관련이 있다고 생각하지만, 그것이 정확히 어떻게 문제를 일으키는 지 잘 모르겠습니다. 개별 테스트 클래스를 호출하더라도 해당 제품군에 대한 설치가 실행됩니다. 그렇지 않은 경우, 스위트에서 테스트가 호출되지 않는 경우 어떻게 실행되는지 어떻게 보장 할 수 있습니까?

은 - 올드 포스트 제거 -

+0

단위 테스트를 동시에 실행합니까? – kan

+0

Eclipse를 사용하여 테스트를 실행했는데 Eclipse의 여러 인스턴스가 없으므로 테스트가 동시에 실행되지 않아야합니까? –

+0

'@SuiteClasses ({DataAccessTests.class, SimpleQueryTests.class, SimpleInsertTests.class, SimpleUpdateTests.class, ...})'와 같은 것이 있다면 동시에 실행되는 개별 테스트 클래스입니까? –

답변

2

당신은 반드시 한 번에 하나 개의 스레드가 sqlite가 데이터베이스에 쓰기 잠금을 시도 없는지 확인해야합니다. 내가 그 무슨 뜻인지에 대한 개요는 말 그럼 언제

(5) Can multiple applications or multiple instances of the same application access a single database file at the same time?

읽기 : 나는 자체적으로 검사를 실행할 경우

, 그것은 전달합니다. 전체 제품군을 실행하려고 할 때 나는 또 다른 하나는 그것을 얻기 위해 시도하는 동안 쓰기 잠금이 아마 연결 개체가 해제되지 않습니다 가정하는 것이 공평하다고 생각

실패합니다. 따라서 스레드를 사용하지 않더라도 다른 테스트가 다른 연결 개체를 만들기 전에 GC가 이전 테스트의 연결 개체에 연결되지 않는 것일 수 있습니다.

아마도 이러한 테스트 중 일부는 잘못된 것으로 잘못 이해할 수 있도록 게시 할 수 있습니다.

UPDATE :

여기에 연결을 종료하지 않나요?:

public static void tearDownDatabase() throws SQLException, ClassNotFoundException { 
    Connection conn = DataAccess.getConn(); 
    truncateTables(conn); 
} 
+0

+1 소리입니다. 때로는 우연히 동시성 문제가 발생합니다. :) – MrGomez

관련 문제