我有一个系统,它获得一条消息后 - 入队(写入一个表),另一个进程轮询数据库并将其出队处理。在我的自动测试中,我已经将操作合并到同一个进程中,但不能(从概念上)合并来自两个操作的NH会话。在内存中SQLite数据库测试NHibernate时出现随机错误
自然 - 出现问题。
我已经阅读了所有关于让SQLite-InMemory-NHibernate组合在测试世界中工作的所有内容,但由于“没有这样的表”错误,我现在已经遇到了RANDOMLY失败的测试。要说清楚 - “随机”意味着具有相同确切配置和代码的相同测试有时会失败。
我有以下SQLite的配置:
return SQLiteConfiguration
.Standard
.ConnectionString(x => x.Is("Data Source=:memory:; Version=3; New=True; Pooling=True; Max Pool Size=1;"))
.Raw(NHibernate.Cfg.Environment.ReleaseConnections, "on_close");
在我的测试(每个测试)我取“静”会话提供的开始,并恳请它刷新现有DB干净,并重新创建模式:
public void PurgeDatabaseOrCreateNew()
{
using (var session = GetNewSession())
using (var tx = session.BeginTransaction())
{
PurgeDatabaseOrCreateNew(session);
tx.Commit();
}
}
private void PurgeDatabaseOrCreateNew(ISession session)
{
//http://ayende.com/Blog/archive/2009/04/28/nhibernate-unit-testing.aspx
new SchemaExport(_Configuration)
.Execute(false, true, false, session.Connection, null);
}
所以,是的,它是在不同的会话,但连接池在SQLite的,所以我创建了下一届会议将看到生成的模式。然而,虽然大部分时间都有效 - 但有时后来的“入队”操作将失败,因为它无法为我的传入消息查看表格。另外 - 这似乎发生在每个测试套件运行最多一次或两次;不是所有的测试都失败了,只是第一次(有时候是另一次),不太确定是否是第二次测试。
最糟糕的部分是随机性,自然。我告诉自己我现在已经修好几次了,只是因为它只是“停止失败”。随机。
这发生在FW4.0,System.Data.SQLite x86版本,Win7 64b和2008R2(总共三台不同机器),NH2.1.2,配置了FNH,TestDriven.NET 32b precesses和NUnit控制台32b进程。
帮助?
我也有这个问题。几乎每个测试都通过了,但偶尔有一两次测试会失败,并显示“没有这样的表”错误,如果我再次运行它们,它们会通过。我认为这只是SQLite在随机重新创建连接池中的连接。 – 2011-08-31 12:33:56