【问题标题】:.net MVC functional testing.net MVC 功能测试
【发布时间】:2011-07-12 17:19:19
【问题描述】:

如何对 .net mvc 控制器/动作进行功能测试。

我刚刚从多年的 Rails 开发工作中走出来,我在 .net mvc 上进行黑客攻击。这很痛苦,但我希望其中很大一部分只是学习曲线。

对我来说不是很明显的是 .NET 世界中 Rails 功能和集成测试的模拟。 Rails 使功能测试变得如此简单明了,以至于如果您不花时间进行覆盖,那就太愚蠢了。使用 .NET - 我还没有让 Google 产生一个似乎值得的结果。我希望是我刚起步的 .net 状态让我无法输入正确的搜索词或错过一些范例。

帮助!

【问题讨论】:

  • 控制器动作只是一种方法,可以这样进行测试(使用伪装/模拟进行隔离)。除了针对每个条件的 Arrange、Act、Assert 模式并提供类的具体实例来防止隔离和测试整个应用程序之外,还有什么比功能测试更特别的吗?
  • 部分原因可能是术语。在 Rails 世界中,我们谈论的是功能测试,但我们真正指的是控制器的单元测试。据我所见,大多数 Rails 程序员将真正的单元测试(仅测试代码)和功能测试(包括数据库等外部依赖项)混合在一起。 .NET 社区似乎更密切地关注这些。 Roy Osherove 有一本关于 .NET 测试的不错的书artofunittesting.com

标签: .net asp.net-mvc functional-testing


【解决方案1】:

请原谅我对 Rails 的了解不足,并告诉您您对 Rails 的了解,但我希望以比较的形式提供给其他用户。

Rails 有 3 种类型的测试单元、功能和集成。

单元测试测试你的模型

控制器的功能测试

用于测试控制器动作之间流的集成测试

这种范式似乎是从一开始就用 Rails 教授的。

然而,在 .NET MVC 世界中,测试方法的布局不像在 Rails 中那样。

许多开发人员会在他们的控制器上编写单元测试,就像在 Rails 中的模型上编写单元测试一样。您基本上调用一个方法(控制器操作)并从该方法中获取一个对象。然后,您可以断言它具有您期望的值。这样做很麻烦,因为您必须模拟很多废话(HttpContext 等)。另外,它不是功能测试。您只测试一种方法,而不是测试应用程序的功能。

在 Rails 中,您不是在控制器上编写单元测试,您实际上是在发出 Web 请求并获得 Web 响应。您可以检查状态码、cookie 等。您正在对系统进行端到端的测试。

在 .NET MVC 中有几种方法可以做到这一点

1) Steven Sanderson 有一个小工具可以帮助解决这个问题。

http://blog.stevensanderson.com/2009/06/11/integration-testing-your-aspnet-mvc-application/

当我第一次看到并开始使用它时,我觉得它很棒,但我遇到了问题。

2) RestSharp + NUnit - 这是我目前对进行此类测试的偏好。它允许您将 Web 请求放在一起并非常容易地获得响应。使用一些通用方法,您可以使用 restsharp 快速移动。 NUnit 会给你你需要的断言。我只是向我的本地 IIS 服务器发出请求,并在响应中声明我期望的不同项目。您将无法像在 rails 中那样测试将哪个模型分配给视图,但这对我来说不是问题。

如果你习惯了 RSpec,那么你可以得到应该类似的 SpecFlow。

Rails 将测试直接构建到框架中,它是一等公民。太糟糕了,在 .NET MVC 中不是这样的。

希望对您有所帮助。

【讨论】:

    【解决方案2】:

    如果您真的想测试功能,而不是标准的“单元”测试,您有几个选择。

    1. 发挥创意并使用 MS 测试设置更多基于功能的测试。
    2. 使用 BDD 类型的框架 (specFlow?)
    3. 使用功能更强大的测试框架,例如 Selenium

    如果您的目标是功能测试更自动化的 UAT,您还可以使用 FIT 框架(和 Fitnesse)等项目。

    这些是否直接类似于 Rails 中的工具和框架?不,但 .NET 不是 Rails。

    【讨论】:

    • 正确 - 明白这是苹果和橙子。真正的问题应该是:“在功能上测试 mvc 控制器/动作的正确方法是什么”。不知道是否有规定的模式或是否是开放式的。我想我正在寻找 .NET noob 功能测试初学者指南。
    • @Cory,请参阅我对有关“单元测试”和“功能测试”术语的原始帖子的评论。我还推荐了一本书:)
    【解决方案3】:

    对 MVC 应用程序进行单元测试的最佳方法是在解决方案中添加一个新的单元测试项目。只需右键单击项目解决方案,单击添加然后添加 -> 测试项目。

    您将看到一个测试类,其中包含具有 [TestMethod] 属性的方法。您将在这些方法中编写单元测试逻辑。

    在测试项目中添加要执行单元测试的 MVC 项目的新引用 .dll。这将使测试项目能够发现主项目的实际控制器动作。

    添加对 System.Web.MVC 命名空间的引用。

    请参考下面的测试方法示例:

    [TestMethod]
    public void DisplayCustomer()
    {
       CustomerController obj = new CustomerController();
       var testResult = obj.DisplayCustomer();
       Assert.AreEqual("DisplayCustomer",testResult.ViewName);
    }
    

    构建并运行项目以在 Test Results 窗口中查看通过/失败的测试

    希望这会有所帮助!

    谢谢。

    【讨论】:

      猜你喜欢
      • 2015-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-23
      • 2020-12-09
      相关资源
      最近更新 更多