Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.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
.net 内存数据库管理系统&x27;单元测试的标准_.net_Data Access Layer_Embedded Database_In Memory - Fatal编程技术网

.net 内存数据库管理系统&x27;单元测试的标准

.net 内存数据库管理系统&x27;单元测试的标准,.net,data-access-layer,embedded-database,in-memory,.net,Data Access Layer,Embedded Database,In Memory,我正在寻找令人满意的选项来对我的.NETDAL类进行单元测试;因为它们是DAL类,所以直接使用ADO.NET访问数据库。目前,我使用MSSQL数据库的一个实例进行测试,但我想知道有哪些更快的选项——因为单元测试需要尽可能快地运行,内存中的解决方案将是理想的 我还应该提到,我将自己与TSQL绑定,因为我只会使用Microsoft平台。鉴于您的陈述: 我还应该提到,我已经打成平局 因为我只是 将使用微软的 站台 然后使用SQLServerCompactEdition可以很好地满足您的需要。 它不会完

我正在寻找令人满意的选项来对我的.NETDAL类进行单元测试;因为它们是DAL类,所以直接使用ADO.NET访问数据库。目前,我使用MSSQL数据库的一个实例进行测试,但我想知道有哪些更快的选项——因为单元测试需要尽可能快地运行,内存中的解决方案将是理想的

我还应该提到,我将自己与TSQL绑定,因为我只会使用Microsoft平台。

鉴于您的陈述:

我还应该提到,我已经打成平局 因为我只是 将使用微软的 站台

然后使用SQLServerCompactEdition可以很好地满足您的需要。 它不会完全在内存中运行,但可以在只读模式下运行(在这种模式下,不会对主数据库文件进行编辑,因此可以同时由多个测试使用)

有一些GOTCHA,不支持存储过程,一些数据类型需要翻译,某些数据类型有严格的限制(特别是varchar,它只能达到4000个字符)。Linq to Sql也不受适当支持


尽管如此,我还是使用了SqlServer Compact Edition几乎完全替代了正确的SqlServer数据库,并取得了良好的效果。

SqlServer真的是单元测试的瓶颈吗

我的意思是:

  • 您是否分析过单元测试(使用类似于SQL Profiler的工具)。他们都慢吗?有几个慢吗?为什么?
  • 你的单元测试做得太多了吗?安装和拆卸代码是否太重
  • 如果SQL是您的瓶颈,您是否考虑过一个问题,所以您模拟了所有SQL调用

  • 我建议使用与生产相同的数据库进行单元测试。当你调试一个实时问题时,你真的不需要有什么奇怪的差别


    如果您看一看NHibernate的真正大型单元测试套件,您会发现它使用SQL Server(基于磁盘),并且测试运行速度惊人地快。更令人印象深刻的是,有更多的表创建/删除要比平均的单元测试集要多,这不是SQL Server优化的。

    < P>我听说有软件在Windows中安装RAMDISCL(不记得URL,对不起)。p> 在此基础上创建测试数据库可能会很有趣

    我发现这是最好的选择。虽然我使用的是nHibernate,但它是零配置,所以只需几秒钟即可设置。但是,您必须知道,这些类型的引擎通常缺少一些您可能需要的东西(例如,如果使用ADO提供程序,当表名中有空格时,SQLite就会崩溃)

    诚然,@TopBanana在一些不使用“实际”数据库的问题上是正确的。然而,内存中的RDBMS非常适合于那些您想要快速运行的测试(例如,增量或CI构建的签入测试)


    另一个巨大的优势是,您不必担心安装或拆卸。由于开发人员A破坏了您的开发数据库,导致您的签入失败是非常低效的;-)

    我对Oracle也有类似的挑战,我们做了以下工作:

    • 确保真正的单元测试不涉及数据库,而是使用模拟服务

    • 标记了实际需要Oracle的DB测试,而不是针对HSQLDB或H2或任何其他内存数据库运行的测试。所以我们可以分别运行它们

    • 在实际使用Oracle功能的测试中,我们使用了在RAM光盘上运行的普通Oracle实例


    这使得测试速度大大加快。

    这里是指向SQLite ado.net提供程序的链接。要使用内存中的数据库,请使用以下连接字符串:内存:。在我看来,您应该只在CI构建期间使用db测试DAL。上层应该得到一个没有db的DAL模拟。只有一个问题——SQLite不讲TSQL!哎呀,对不起。也许他应该试试SQL Server Compact,它可以在一定程度上处理TSQL,请阅读此处的比较:。它不是内存中的数据库,而是一个轻量级数据库,不需要服务,只需要DLL。但是它仍然会写入磁盘。我写的几乎和ShuggyCoUk写的一样。但我想这没关系,因为我提供了链接。当你使用模拟框架时会发生什么?假设我有个人服务。PersonService有一个方法GetAllPersons返回所有人员。在该方法中,我让unity提供IPersonDataAcces的一个实现,该实现具有GetAllPersons()方法。在生产中,实现转到sql server并获取所有人员。如果我使用模拟框架会发生什么?我猜我也有unity,给我一个IpersonDataAccess的实现,但然后是一个“被嘲笑”的?那么,如果调用GetAllPersons()方法会发生什么?在测试PersonService时,我应该声明什么?我实际上已经用ImgDisk尝试了这个方法。我为每个测试创建/销毁数据库。在我的场景中,这并不比将数据库放在SSD上快多少(要慢)。因此,现在我正在研究使用内存中的SQLite或DI和Mock的常规路径,它只解决单元测试的性能问题。但在理想情况下,我需要一种更简单的方法在单元测试中编写测试数据,就像我为依赖的方法注册任何存根实现一样。在真实数据库中准备数据有点复杂。我认为Linq to Sql从那时起就已经实现了?