与真正的本地Raven实例相比,使用RavenDb EmbeddableDocumentStore的测试非常慢

时间:2014-03-21 19:24:11

标签: .net unit-testing ravendb

总结:我想使用EmbeddableDocumentStore(我相信the recommended approach)对使用IDocumentSession的测试类进行单元化。与使用“真实”,本地托管的DocumentStore创建的会话相比,使用静态索引的简单测试慢慢地运行非常。运行了一些基本的分析 - 7x慢 (见下文)。我无法使用RavenTestBase,因为我想使用this approach to test using SpecsFor

我期待使用内存存储的测试速度非常快 - 我是否在解释这种性能时做错了什么?

编辑Having read this我禁用了我的防病毒软件,这没有任何区别。

两种方法之间的区别:

我通过以下方式创建 EmbeddableDocumentStore

    private static IDocumentStore CreateInMemoryEmbdeddableDocumentStore()
    {
        var embeddedStore = new EmbeddableDocumentStore();
        embeddedStore.Configuration.RunInMemory = true;
        embeddedStore.Configuration.RunInUnreliableYetFastModeThatIsNotSuitableForProduction = true;
        embeddedStore.RegisterListener(new NoStaleQueriesAllowedListener());
        return embeddedStore.Initialize();
    }

和“真正的” DocumentStore by:

    public IDocumentStore CreateLocalDocumentStore()
    {
        var store = new DocumentStore { Url = "http://localhost:8080", DefaultDatabase = "ColourTest" };
        store.RegisterListener(new NoStaleQueriesAllowedListener());
        return store.Initialize();
    }

在这两种情况下我使用它来确保在获取查询结果之前已经进行了索引:

    public class NoStaleQueriesAllowedListener : IDocumentQueryListener
    {
        public void BeforeQueryExecuted(IDocumentQueryCustomization queryCustomization)
        {
            queryCustomization.WaitForNonStaleResults();
        }
    }

然后我通过以下方式开会:

    private static IDocumentSession ConfigureIndexesAndCreateSession(IDocumentStore store)
    {
        IndexCreation.CreateIndexes(typeof(Colours_ColourCountByMood).Assembly, store);
        return store.OpenSession();
    }

使用此会话,我设置测试数据(使用真实存储,我也首先删除现有数据)。像往常一样,我然后运行method being tested - 使用static index - 然后执行断言。

将效果与性能分析进行比较:

我还添加了logging calls through the code (see complete code here)来比较两种情况下的时间安排。测试运行的示例结果:

TestUsingInMemoryEmbeddable()
  191 ms : Start create EmbeddableDocumentStore
 1819 ms : Finish create EmbeddableDocumentStore
 1819 ms : Start embeddedStore.Initialize()
 3411 ms : Finish embeddedStore.Initialize()
 3411 ms : Start CreateIndexes
 5322 ms : Finish CreateIndexes
 5322 ms : Start OpenSession
 5330 ms : Finish OpenSession
 5331 ms : Start test data storing
 5852 ms : Finish test data storing
 5853 ms : Start test Act
 6985 ms : Finish test Act
 6985 ms : Start test Assert
 6998 ms : Finish test Assert

TestUsingLocallyHosted()
    1 ms : Start create DocumentStore
    1 ms : Finish create DocumentStore
    2 ms : Start documentStore.Initialize()
  608 ms : Finish documentStore.Initialize()
  608 ms : Start CreateIndexes
  717 ms : Finish CreateIndexes
  717 ms : Start OpenSession
  717 ms : Finish OpenSession
  718 ms : Start DeleteTestData
  730 ms : Finish DeleteTestData
  730 ms : Start test data storing
  823 ms : Finish test data storing
  823 ms : Start test Act
  957 ms : Finish test Act
  957 ms : Start test Assert
  957 ms : Finish test Assert

运行这些数字后,上述数字具有代表性:在运行嵌入式设备时,相对较慢的速度在整个测试代码中是显而易见的。

1 个答案:

答案 0 :(得分:0)

您需要直接在EmbeddableDocumentStore上使用RunInMemory属性。

此外,您可能希望多次运行,以查看时间。我们正在做很多前期工作以降低总体成本。