gpt4 book ai didi

java - JUnit 测试中的 SQLite 数据库锁定

转载 作者:行者123 更新时间:2023-11-30 04:52:01 25 4
gpt4 key购买 nike

我正在 Eclipse 3.7 上运行 JUnit 4.10。我正在做数据库测试:使用的数据库是 SQLite3 和 sqlitejdbc 。我尝试在 Windows 和 Linux 上运行测试,以下是我的观察结果:

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

更新

您可以在 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();
}

我想我仍然想设置我的数据库,以防我不想调用整个套件。我认为问题与此有关,但我不确定它到底是如何导致问题的。看来即使我调用单独的测试类,我的套件设置也会运行吗?或者如果没有,我如何确保它运行一次,以防测试没有从套件中调用?

-- 旧帖子已删除 --

最佳答案

您需要确保一次不超过一个线程尝试对 sqlite 数据库进行写锁定。要了解我的意思的概述,请阅读

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

所以当你说:

If I run the test by itself, it passes. When trying to run the whole suite it fails

我认为可以公平地假设,当另一个连接对象尝试获取写锁时,写锁可能不会被某个连接对象释放。 因此,即使您不使用线程,在另一个测试创建另一个连接对象之前,GC 也可能无法访问前一个测试的连接对象。

也许您可以发布其中一些测试来帮助更好地了解可能出现的问题。

更新:

您不应该关闭此处的连接吗?:

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

关于java - JUnit 测试中的 SQLite 数据库锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9646605/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com