将数据从 SpecFlow 注入 运行 IISExpress

Injecting data into running IISExpress from SpecFlow

我是 ASP.NET MVC 5 世界和 SpecFlow 的新手。我正在尝试将一个简单的示例放在一起以供学习。我在一个程序集中有一个 ASP.NET MVC 项目,在另一个程序集中有一个 SpecFlow 定义。我试图避免在设置中使用数据库,因为我试图保持这种轻量级。我想要做的是在 MVC 服务器上有一个内存中的数据对象集合,我可以从 SpecFlow 定义中对其进行操作。 IE。我想要这样的流程:

(1) 在 SpecFlow 中我说了类似

Given I have the following account data
  | Id  |  Balance | 
  | abc |   123    |

(2) 然后我希望 SpecFlow 绑定将一个新的 Account 对象注入到 运行 在 IISExpress 进程上运行的内存集合中。

(3) 最后我想在 SpecFlow 中要求

Then when I view the account balance of 'abc' 
in the web browser I am shown a balance of '123'

... 绑定将 运行 等待让 IE 打开正确的 URL 并解析结果。

我缺少的是一种将该数据注入 运行ning IISExpress 的方法。我可以通过在 MVC 应用程序中硬编码一些配置来解决问题,但这不是我正在寻找的动态测试解决方案。非常感谢收到任何建议!

我知道这只是一次学习经历,但我将考虑如果这是一个真实的系统,您将如何将其放入生产稳定代码中。这样你也有机会学到更多。

不幸的是,没有灵丹妙药可以解决这个问题。事实上,您需要的可能比乍看起来要复杂一些。

你需要,

  1. 一个 ASP.Net 提供您的 public 界面的 MVC 服务器(假设您使用的是 WaitiN,我假设它是一个网站)。这是你已经拥有的位
  2. 一种配置和启动 ASP.Net MVC 服务器的方法,以便它 运行 使用您的备用数据存储。我见过这些是由主机名、环境变量或启动参数触发的。长篇都有问题运行,所以随便选什么花色开始,遇到问题再看。
  3. 另一个接口(可能只是一个 API 并且有借口学习在 ASP.Net MVC 中开发 JSON API)来处理非生产操作确保您的数据存储中有正确的状态。这可能是一些细粒度的东西,可以让你设置账户和余额(这将意味着在测试中进行大量调用以使数据进入所需状态),或者更粗粒度的东西(即一次调用将其恢复到它的 "known"状态)。
  4. 一种分离非生产操作的方法,使它们在您的最终生产实例中不可用。你举了一个有余额的账户的例子,想象一下如果有人发现他们可以将余额设置为他们想要的值会出现什么问题?就我个人而言,我会找到 "composing" 您的系统的某种方式,因此该代码甚至没有运送到生产域中,但是如果安全性不那么重要,那么您可以简单地找到一种保护它的方法。
  5. 想要运行你的测试并行,因为你得到的测试越多,它们需要更长的时间运行?你有没有想过一种分离并行流的方法?也许每个测试都有自己的帐户?也许您想 运行 每个测试一个单独的 WebServer?

现在我很抱歉,但我会让你质疑你到目前为止的决定。上面我们遇到了从前到后测试所有内容的所有问题。它可以用于验收测试,或用作回归测试,但它对学习如何做这些事情确实没有多大帮助。当您考虑业务流程时,SpecFlow 最有效。那么,您 需要 您的测试来讨论 Web 浏览器吗? (快速阅读Whose domain is it anyway?

如果你写

会怎样
Then the account balance of 'abc' should be '123'

现在你已经完全抽象掉了UI,这就是Subcutaneous testing。这将使您无需 运行 在网络服务器中进行测试,这将使您更容易注入虚假数据存储。

你也可以写成

When I click on 'Check Balance' 
Then it should call the 'CheckBalanceCommand'

这将允许您仅测试 UI 层,并且您可以将命令层替换为 Mock-ed 层,从而避免所有数据存储设置。

事实上,您甚至可能想考虑一个测试架构,例如 - UI -> 命令 - 命令 -> 业务逻辑 - 命令 -> 数据存储

或者您可能只想预先尝试全部以进行一些大的 ole 测试? :-)

为了删除数据库,这太复杂了。您真正需要做的是在本地安装一个数据库并配置您的 Web 应用程序以将其用于您的测试。