【发布时间】:2015-07-01 21:57:48
【问题描述】:
我目前正在使用 Entity Framework 5 进行 MVC 5 项目(我可能很快会切换到 6)。我首先使用数据库,然后将 MySQL 与现有数据库(大约 40 个表)一起使用。这个项目最初是作为“概念验证”的,现在我的公司决定使用我正在开发的软件。我在测试部分苦苦挣扎。
我的第一个想法是主要使用集成测试。这样我觉得我可以测试我的代码以及我的底层数据库。我创建了一个脚本,将现有数据库模式转储到 MySQL 中的“测试数据库”中。我总是从一个没有数据的干净数据库开始我的测试,并为每个测试创建/删除一些数据。问题是我运行测试需要相当长的时间(我经常运行测试)。
我正在考虑用单元测试替换我的集成测试,以加快运行它们的时间。我会“删除”测试数据库,而只使用模拟。我已经测试了一些方法,似乎效果很好,但我想知道:
- 您是否认为模拟我的数据库可以“隐藏”仅当我的代码针对真实数据库运行时才会出现的错误?请注意,我不想测试 Entity Framework(我确信微软的优秀人员在这方面做得很好),但是我的代码能否很好地针对模拟和针对 MySQL 的中断运行?
- 您认为从集成测试到单元测试是“降级”之王吗?
- 您认为放弃集成测试并采用单元测试来考虑速度是否可行。
- 我知道存在一些针对内存数据库运行测试的框架(即 Effort 框架),但我看不出这与模拟相比有什么优势,我缺少什么?
我知道这类问题很容易出现“这取决于您的需求”类型的回答,但我相信有些人可能已经经历过这个问题并且可以分享他们的知识。我也知道,在一个完美的世界里,我会同时做这两个(使用模拟和使用数据库进行测试),但我没有这样的时间。
作为一个附带问题,您会推荐什么工具来模拟。有人告诉我“起订量”是一个很好的框架,但它有点慢。你怎么看?
【问题讨论】:
-
单元测试用于测试你编写的代码,集成测试用于测试与其他的事物的交互> 写道。您不应该消除集成测试,但它们不应该是您每 10 分钟运行一次的测试。
-
通常,良好的关注点分离和依赖注入将允许您测试应用程序中的几乎每个函数,就好像它是整个应用程序本身一样。如果你的函数依赖于其他函数/服务/库的结果来给出正确的响应,那么它很可能重构得不够充分。
标签: entity-framework unit-testing asp.net-mvc-5 integration-testing