Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/39.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
Entity framework MVC5单元测试与集成测试_Entity Framework_Unit Testing_Asp.net Mvc 5_Integration Testing - Fatal编程技术网

Entity framework MVC5单元测试与集成测试

Entity framework MVC5单元测试与集成测试,entity-framework,unit-testing,asp.net-mvc-5,integration-testing,Entity Framework,Unit Testing,Asp.net Mvc 5,Integration Testing,我目前正在使用EntityFramework5进行一个MVC5项目(我可能很快会切换到6)。我首先使用数据库,然后使用MySQL和一个现有的数据库(大约有40个表)。这个项目一开始是“概念验证”,现在我的公司决定使用我正在开发的软件。我正在努力完成测试部分 我的第一个想法是主要使用集成测试。这样我觉得我可以测试我的代码和底层数据库。我创建了一个脚本,将现有数据库模式转储到MySQL中的“测试数据库”中。我总是从一个干净的数据库开始测试,没有数据,每次测试都会创建/删除一些数据。问题是,当我运行我

我目前正在使用EntityFramework5进行一个MVC5项目(我可能很快会切换到6)。我首先使用数据库,然后使用MySQL和一个现有的数据库(大约有40个表)。这个项目一开始是“概念验证”,现在我的公司决定使用我正在开发的软件。我正在努力完成测试部分

我的第一个想法是主要使用集成测试。这样我觉得我可以测试我的代码和底层数据库。我创建了一个脚本,将现有数据库模式转储到MySQL中的“测试数据库”中。我总是从一个干净的数据库开始测试,没有数据,每次测试都会创建/删除一些数据。问题是,当我运行我的测试时(我经常运行我的测试),它需要相当多的时间

我正在考虑用单元测试取代集成测试,以加快运行它们所需的时间。我将“删除”测试数据库,而只使用mock。我已经测试了一些方法,似乎效果不错,但我想知道:

  • 你认为模仿我的数据库可以“隐藏”只有在我的代码运行于真实数据库时才会出现的错误吗?请注意,我不想测试实体框架(我相信微软的优秀人员在这方面做得很好),但我的代码能否在模拟和MySQL上运行良好
  • 你认为从集成测试到单元测试是“降级之王”吗
  • 您认为放弃集成测试并采用单元测试来考虑速度是否合适
  • 我知道存在一些针对内存中数据库运行测试的框架(即努力框架),但我看不到这与模拟相比的优势,我缺少什么
  • 我知道这类问题很容易得到“这取决于你的需要”这样的回答,但我相信有些人可能已经经历了这一过程,可以分享他们的知识。我也知道,在一个完美的世界里,我会同时做这两件事(使用mock和使用数据库进行测试),但我没有这样的时间

    作为一个附带问题,你会推荐什么样的工具进行模拟。我被告知“moq”是一个很好的框架,但它有点慢。你觉得怎么样

  • 你认为模仿我的数据库可以“隐藏”只有在我的代码运行于真实数据库时才会出现的错误吗?请注意,我不想测试实体框架(我相信微软的优秀人员在这方面做得很好),但我的代码能否在模拟和MySQL上运行良好
  • 是的,如果只使用mock测试代码,很容易对代码产生错误的信任。当您模拟数据库时,您所做的是说“我希望这些调用会发生”。如果您的代码进行了这些调用,它将通过测试,但是如果它们是错误的调用,它将无法在生产环境中工作。简单地说,如果从数据库中添加/删除列,数据库交互可能需要更改,但是添加/删除列的过程在更新模拟之前对测试是隐藏的

  • 你认为从集成测试到单元测试是“降级之王”吗
  • 这不是降级,这是不同的。单元测试和集成测试有着不同的好处,在大多数情况下,它们是相辅相成的

  • 您认为放弃集成测试并采用单元测试来考虑速度是否合适
  • Ok很主观。我会说不,但是你不必一直运行所有的测试。大多数测试框架(如果不是全部的话)允许您以某种方式对测试进行分类。这允许您创建测试的子集,例如,您可以将所有数据库集成测试放在“DatabaseIntegration”类别中,或者将完整的端到端测试放在“EndToEnd”类别中。我首选的方法是有单独的构建。我在每次签入之前/之后运行的常规/连续构建只运行单元测试。这将提供快速反馈和验证,确保没有任何问题。不太常见的/每日/隔夜构建,除了运行单元测试外,还将运行较慢的/可重复的集成测试。如果代码可能会影响集成,那么在签入代码之前,我还倾向于对我一直在处理的区域运行集成测试

  • 我知道存在一些针对内存中数据库运行测试的框架(即努力框架),但我看不到这与模拟相比的优势,我缺少什么
  • 我没有用过,所以这只是猜测。我认为主要的好处是,您不必模拟数据库与mock的交互,而是设置数据库并测量post状态。测试变得越来越少,你如何做的事情,更多的是什么数据移动。从表面上看,这可能会导致不那么脆弱的测试,但是您实际上是在针对另一个不打算在生产中使用的数据提供者编写集成测试。如果这是正确的事情,那也是非常主观的

    我想第二个好处可能是,为了利用内存中的数据库,您不必重构代码。如果您的代码还没有被构造成支持依赖项注入,那么您很可能需要执行某种级别的重构以支持模拟

    我也知道,在一个完美的世界里,我会同时做这两件事(使用mock和使用数据库进行测试),但我没有这样的时间

    我真的不明白你为什么觉得这样。您已经说过,您已经有了集成测试,并且计划用单元测试来代替。除非您需要进行重大重构以支持单元测试,否则您的集成测试仍然可以工作。您通常不需要那么多集成测试