【问题标题】:Too much testing on simple view?对简单视图进行过多测试?
【发布时间】:2012-04-17 07:18:13
【问题描述】:

您好,我正在整理我的网站,虽然它非常简单,但我决定尽可能多地测试它。使用只编写有用测试的精神,这些测试可以解释我可以想象的情况(重命名脚本或 css 文件等)

我正在使用 Steve Sanderson 的 MVC 集成测试框架,我的测试如下。

我的问题有两个,这个级别的测试是否“太多”,如果不是,您还能想到哪些其他场景(与开发人员相关,例如重命名或其他任何内容)。

using System.Web;
using System.Web.Mvc;
using MvcIntegrationTestFramework.Hosting;
using NUnit.Framework;
using website.Properties;

namespace website.tests
{
    [TestFixture]
    public class HomeControllerIndexTests
    {
        [TestFixtureSetUp]
        public void Setup()
        {
            appHost = AppHost.Simulate("Website");
        }

        [Test]
        public void HomeControllerIndexReturnsTheIndexView()
        {
            appHost.Start(session =>
            {
                var result = session.Get("/Home/Index");
                Assert.AreEqual("Index", ((ViewResult)result.ActionExecutedContext.Result).ViewName);
            });
        }

        [Test]
        public void HomeControllerIndexReturnsCorrectRouteData()
        {
            appHost.Start(session =>
            {
                var result = session.Get("/Home/Index");
                Assert.AreEqual("Home", result.ActionExecutedContext.RouteData.Values["controller"]);
            });
        }

        [Test]
        public void HomeControllerIndexReturnsViewResult()
        {
            appHost.Start(session =>
            {
                var result = session.Get("/Home/Index");
                Assert.IsInstanceOf(typeof(ViewResult), result.ActionExecutedContext.Result);
            });
        }

        [Test]
        public void HomeControllerIndexReturnsNoError()
        {
            appHost.Start(session =>
            {
                var result = session.Get("/Home/Index");
                Assert.IsNull(result.ResultExecutedContext.Exception);
            });
        }

        [Test]
        public void HomeControllerIndexReturnsViewWithSiteCssFile()
        {
            appHost.Start(session =>
            {
                var result = session.Get("/Home/Index");
                Assert.IsTrue(result.ResponseText.Contains("/Content/Site.css"));
            });
        }

        [Test]
        public void HomeControllerIndexReturnsViewWithCorrectTitle()
        {
            appHost.Start(session =>
            {
                var result = session.Get("/Home/Index");
                Assert.IsTrue(result.ResponseText.ToLowerInvariant().Contains("<title>{ me: danielelliott.info(); }</title>"));
            });
        }

        [Test]
        public void HomeControllerIndexReturnsViewContainingBanner()
        {
            appHost.Start(session =>
            {
                var result = session.Get("/Home/Index");
                var expected = HttpUtility.HtmlEncode(Resources.SiteName);
                Assert.IsTrue(result.ResponseText.Contains(expected));
            });
        }

        [Test]
        public void HomeControllerIndexViewIncludesBioParagraph()
        {
            appHost.Start(session =>
            {
                var result = session.Get("/Home/Index");
                var expected = HttpUtility.HtmlEncode(Resources.Bio.ToLowerInvariant());
                Assert.IsTrue(result.ResponseText.ToLowerInvariant().Contains(expected));
            });
        }

        [Test]
        public void HomeControllerIndexViewIncludesServicesParagraph()
        {
            appHost.Start(session =>
            {
                var result = session.Get("/Home/Index");
                var expected = HttpUtility.HtmlEncode(Resources.Services.ToLowerInvariant());
                Assert.IsTrue(result.ResponseText.ToLowerInvariant().Contains(expected));
            });
        }

        [Test]
        public void HomeControllerIndexViewIncludesHistoryParagraph()
        {
            appHost.Start(session =>
            {
                var result = session.Get("/Home/Index");
                var expected = HttpUtility.HtmlEncode(Resources.History.ToLowerInvariant());
                Assert.IsTrue(result.ResponseText.ToLowerInvariant().Contains(expected));
            });
        }

        private AppHost appHost;
    }
}

【问题讨论】:

    标签: c# asp.net-mvc testing integration-testing


    【解决方案1】:

    测试始终取决于上下文,您看到的风险应该指导测试量。

    • 如果某些部分在某些更改后无法正常工作,会有多严重?
    • 您是否认为这些部件在发生更改时会损坏?
    • 如果页面结构发生变化,维护这些测试的任务有多大?
    • 您认为这些部件会经常变化吗?将它们自动化是否值得?
    • 当数量增加时,运行测试需要多长时间?您是否准备好经常等到那个时候,看看最新的变化没有破坏任何东西?

    如果页面的变化不是很频繁,这个数量似乎相当多。您还可以考虑仅测试一个样本是否就足够了。例如,您似乎在页面中包含多个部分。如果它们来自同一个位置并且包含在相同的机制中,那么如果其他人在那里,包含一个似乎不太可能失败。

    另一方面,减少金额总是更容易。你可以在学习的时候从这个开始,然后看看你以后是否需要改变方法。

    【讨论】:

      【解决方案2】:

      当我看到您的测试时,我的反应是它们主要验证实现细节。我建议你专注于行为。测试最终用户与站点的交互。验证信息是否存在,而不是其呈现方式。

      【讨论】:

      • 我确实试图指出这些是集成测试。完全同意 re:在单元测试中测试行为!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-24
      • 1970-01-01
      • 2016-01-30
      • 1970-01-01
      • 2012-03-29
      • 2011-01-18
      • 1970-01-01
      相关资源
      最近更新 更多