如何对一个相当简单的应用程序进行单元测试?
通过“相当简单的应用程序”理解:
通过ORM查询数据库(可能很复杂)并在不进行任何进一步处理的情况下显示结果的应用程序。也就是说,Linq查询返回一个简单的
IEnumerable
,它将显示在屏幕上。
到目前为止,我写的测试往往很慢,而且我的执行时间越来越多。如果我保留这个过程,这些测试只会在我提交代码时执行,因此我将失去单元测试的所有好处:在一分钟内突出显示错误或错误。
我试图在内存中创建一个对象图,但随着应用程序的增长,这个图变得非常复杂,并且需要花费越来越多的时间进行维护。当我插入ORM而不是对象图时,我看到我的单元测试没有预见到的错误......
就我而言,我需要一个通用解决方案,因为ORM应该是Entity Framework或nHibernate。
编辑:
我重新解释我的问题,因为它可能有点不清楚:测试这种应用程序意味着测试查询。 测试Linq查询的最佳方式是什么?
答案 0 :(得分:1)
您的问题的简单答案不是单元测试数据查询。当您发现单元测试的价值时,这部分应用程序非常有限,并且大多数错误都没有显示出来。 ORM是集成测试的好地方。
要启用此功能,您的数据访问代码必须放在一个位置。根据您的应用程序,这可能是数据访问层,存储库或任何其他结构,使您可以从业务逻辑中分离数据访问。在业务逻辑部分中,您使用单元测试并使用内存解决方案模拟或替换数据访问。 您使用集成测试测试的数据访问部分。但在这里,您只需要测试是否可以插入,更新,选择或删除数据以及查询是否有效。与在单元测试中尝试完成所有测试的方式相比,这应该是可行的。
Entity Framework和nHibernate都有关于如何使用这些框架进行此类测试的教程。
答案 1 :(得分:1)
约翰尼·格拉伯的回答是类似的,但无论如何我都会加入我的意见。
要特别回答有关测试Linq查询的问题(现在仍然是我的意见,就像上面的评论一样):你不测试它们。
Linq非常简单,在项目中有很多Linq查询基本上就像使用硬编码的SQL语句一样糟糕。
因此,Linq查询应该是数据抽象层的一部分,并且该层是您测试的层。该层提供基本访问方法,主要是CRUD操作。这些操作可以使用Linq针对任何内容实现(SQL,SQLite.Net,XML,您可以命名)。
然后你应该有另一个DAL实现,它返回/生成模拟数据。这里不需要使用Linq。
然后,您可以测试,如果您的应用程序对包含模拟数据的实现起作用,这是快速的,因为它是基于内存的。 你担心这些方法的结果。
您可以不时切换到基于Linq的高效版本并运行较慢的测试。 Linq本身就有效。微软做得很好。您需要担心您的访问方法返回正确的数据。