Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JUnit测试中的SQLite数据库锁定_Java_Unit Testing_Sqlite_Junit - Fatal编程技术网

Java JUnit测试中的SQLite数据库锁定

Java JUnit测试中的SQLite数据库锁定,java,unit-testing,sqlite,junit,Java,Unit Testing,Sqlite,Junit,我正在Eclipse3.7上运行JUnit4.10。我正在做数据库测试:使用的数据库是SQLite3。我尝试在windows和linux上运行测试,以下是我的观察结果: 在Windows 7 x64上,测试运行速度更快(每个测试约0.6秒)。我确实收到关于“无法打开数据库文件”的错误。它们似乎是间歇性的(有时相同的测试可以通过一次,而下一次运行失败) 在Ubuntu11.10x64上,测试速度很慢(每次测试约3秒)。我收到关于“数据库锁定”的错误。与Windows的间歇性错误不同,这里的错误似

我正在Eclipse3.7上运行JUnit4.10。我正在做数据库测试:使用的数据库是SQLite3。我尝试在windows和linux上运行测试,以下是我的观察结果:

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

您可以在上找到测试的代码。我认为问题可能与如何设置我的
@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);
    }
然后,在我的测试类中,我在前面有一个调用setup的

public class EventsDataAccessTests {

    @Before
public void setup() throws SQLException, ClassNotFoundException {
    DataAccessTestSuite.setUpDatabase();
}
我想我还是要设置我的数据库,以防我不想调用整个套件。我认为问题与此有关,但我不确定它究竟是如何导致问题的。看起来,即使我调用单个测试类,我的套件设置也会运行吗?或者如果不是,我如何确保它只运行一次,以防测试没有从套件中调用


--旧帖子已删除--

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

所以当你说:

如果我自己运行测试,它就会通过。当你试图运行整个系统时 它失败了吗

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

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

更新:

你不应该把这里的连接关掉吗

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

您是否同时运行单元测试?我使用Eclipse运行测试,没有Eclipse或类似的多个实例,因此测试不应该同时运行?如果我有类似于
@SuiteClasses({DataAccessTests.class,SimpleQueryTests.class,SimpleInsertTests.class,SimpleUpdateTests.class,…})的内容
单个测试类是否同时运行?是否使用maven?通常,一些参数应该允许并行执行,例如
。你在测试中使用线程吗?@MrGomez,我使用的是SQLite,用户在使用应用程序时不需要安装它。HSQLDB听起来是敏锐诊断的一个很好的选择+1。有时,我们都会无意中导致并发问题。:)