2012-03-10 21 views
1

我在Eclipse 3.7上运行JUnit 4.10。我正在做数据库测试:使用的数据库是SQLite3与sqlitejdbc。我尝试在Windows和Linux上运行测试,这里是我的观察结果:SQLite数据库在JUnit测试中锁定

  • 在Windows 7 x64上,测试运行速度更快(每次测试约0.6s)。我确实收到有关“无法打开数据库文件”的错误。它们似乎是间歇性的(有时在下次运行失败时,相同的测试可能会通过一次)
  • 在Ubuntu 11.10 x64上,测试速度很慢(每次测试约3秒)。我收到有关“数据库锁定”的错误。与Windows的间歇性错误不同,在这里,错误似乎发生在同一个测试/文件上,一旦发生锁定错误,所有后续测试失败。

UPDATE

你可以找到测试的代码上GitHub。我想这个问题可能是与我的@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 2012-04-05 10:42:19

+0

我使用Eclipse运行测试,没有多个eclipse实例或类似的东西,所以测试不应该同时运行? – 2012-04-05 11:06:45

+0

如果我有类似'@SuiteClasses({DataAccessTests.class,SimpleQueryTests.class,SimpleInsertTests.class,SimpleUpdateTests.class,...})'个别测试类是否同时运行? – 2012-04-05 11:08:53

回答

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 2012-04-08 00:50:07