使用 NHibernate 清除数据库的最快方法是什么?
我打算执行一些自动化集成测试。这需要将数据库恢复到“干净状态”。这是最快/最好的方法吗?
var cfg = new Configuration();
cfg.Configure();
cfg.AddAssembly("Bla");
new SchemaExport(cfg).Execute(false, true, false);
I intend to perform some automated integration tests. This requires the db to be put back into a 'clean state'. Is this the fastest/best way to do this?
var cfg = new Configuration();
cfg.Configure();
cfg.AddAssembly("Bla");
new SchemaExport(cfg).Execute(false, true, false);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
是的,几乎是。您不必在每次测试之前创建新的配置对象,创建一次后就可以重用它。您可以通过使用 sql-lite 等内存数据库进行测试来加快速度。
Yes it almost is. You don't have to create a new configuration object before each test, you can reuse it when created once. You can make it faster by using an inmemory database like sql-lite for testing.
我的集成测试在基类构造函数中创建 SessionFactory,并在测试装置设置中创建 SchemaExport。我还针对作为内存数据库运行的 SQLite 进行测试,以提高速度。
Ayende 在这篇 博客文章中给出了这种方法的一个很好的例子。托宾·哈里斯的文章 包括删除/创建与删除的计时数据。
My integration tests do SessionFactory creation in a base class constructor, and SchemaExport in test fixture setup. I also test against SQLite running as an in-memory database for extra speed.
Ayende gave a good example of this approach in this blog post. Tobin Harris' article includes timing data of drop/create vs delete.
我使用 Proteus,它是一个开源库。在每次测试之前,都会自动保存您的数据集,加载您想要测试的数据集(例如空数据库)。每次测试后,都会在上次测试后重新加载数据集,恢复测试前数据库中存在的数据。
Me I use Proteus, it's an open source library. Before each test, there is an auto save of your set of data , load the set you want to test (an empty DB for exemple). After each test, the set of data is reloaded after the last test, the data present in the database before the tests are restored.
由于 NHibernate 是独立于数据库的,如果您要让它生成数据库,另一个有趣的选择是针对内存中的 SQLite 之类的东西运行测试。这样事情会运行得更快。
这是一篇 文章,介绍如何使用 ActiveRecord 执行此操作但您可以采用这个概念并在没有 ActiveRecord 的情况下使用它。
如果您在使用过程中遇到问题,这里有一个讨论 (我一开始是这样做的)。
Since NHibernate is database independent another interesting option if you are having it generate your database is to run your tests against something like SQLite which is in memory. Things will run MUCH faster that way.
Here is an article on showing how to do this with ActiveRecord but you can take the concept and use it without ActiveRecord.
And here is a discussion if you're having trouble getting it working (I did at first).