【问题标题】:Using specflow to write acceptance tests for an Mvc4/WebApi website使用 specflow 为 Mvc4/WebApi 网站编写验收测试
【发布时间】:2013-01-22 17:33:05
【问题描述】:

我已经阅读了一些关于验收测试的内容,我想在我们的 Web 应用程序中添加一些内容。我们最近经历了一些回归,我认为这会对我们有所帮助。

我们使用 MVC4 框架来传递视图,但也使用 knockout.js 和 webapi 通过 json 数据驱动 html 的生成。这是一个相当繁重的 javascript 应用程序。

我读过一些关于SpecFlow 的文章,我认为它看起来不错。我们的测试人员可以用 gerkin 语法编写他们的测试用例,然后让程序员来实现它们或类似的东西。

我对此有几个问题,也许我的理解有点有限。总的来说,这可能是一个糟糕的问题,但我们将不胜感激任何关于此的建议。

  1. 验收测试是否是实时产品的端到端测试?我读过一些是的,一些不是的。
  2. 是否可以使用Specflow 编写操作浏览器的测试?
  3. 我应该进行端到端测试,还是应该只对 c#、javascript 进行单元测试,并可能在 webapi 路由上进行一些集成测试?
  4. 我应该使用RanorexSelenium 之类的东西进行端到端吗?

【问题讨论】:

    标签: asp.net-mvc-4 automated-tests specflow acceptance-testing web-testing


    【解决方案1】:

    SpecFlow 是一个框架,允许开发人员和业务人员以可执行规范的形式协作定义系统的业务功能,这些规范可以重复和一致地运行,并用作定义系统如何​​运行的“活文档”系统应该在任何给定点表现。为了有效地做到这一点,需要从外向内编写规范,即点击应用程序的入口点,对于基于 Web 的应用程序来说,入口点可以是网站 URL 或某种服务端点,并为此目的验证业务需求观点。回答您的问题:

    验收测试是实时产品的端到端测试吗?我读过一些是的,一些不是的。 我应该进行端到端测试还是应该只对 c#、javascript 进行单元测试,并可能在 webapi 路由上进行一些集成测试?

    验收测试是其中很大一部分,但不应孤立地进行。如果您正在使用集成测试或验证外部系统是否按预期进行通信,您可能还需要实际访问您的数据存储的集成测试。您当然应该对您的各个组件进行单元测试并酌情模拟/排除依赖关系,但这不会告诉您系统的不同层是否作为一个整体相互依赖地运行。这就是 SpecFlow 真正闪耀的地方。我不一定提倡在您的实时站点上运行验收测试,但是专门为验证验收测试设置一个实时镜像将是一项非常值得的努力,最好是作为您的 CI 构建过程的一部分。

    是否可以使用 Specflow 编写操作浏览器的测试? 我应该使用 Ranorex 或 Selenium 之类的东西进行端到端吗?

    绝对有可能。您可以使用Selenium WebDriverWatin 之类的东西(Selenium 的.NET 包装器)。上次我查看时,Watin 只在 IE 中工作。它可以与 Firefox 3.6 一起使用,但是当他们发布 5 时,FF 核心的变化停止了它的工作。很遗憾,因为它是一个非常好的框架。 SpecFlow 提供了可用于在每次测试运行期间启动和关闭浏览器的挂钩。下面是一个使用 Selenium WebDriver 的简单示例:

    [Binding]
    public class FeatureHooks
    {
        [BeforeFeature]
        public static void StartWebDriver()
        {
            Runner.InitialiseHost(HostTypeOption.Firefox);
        }
    
        [AfterFeature]
        public static void StopWebDriver()
        {
            Runner.StopHost();
        }
    
    }
    

    Runner 是一个静态类,我将其用作我正在开发的页面框架的一部分,以帮助实现验收测试自动化。这是主机初始化部分:

    public static class Runner
    {
        internal static IWebDriver Host { get; private set; }
    
        public static void InitialiseHost(HostTypeOption hostType, int windowWidth = 1024, int windowHeight = 768)
        {
            switch (hostType)
            {
                case HostTypeOption.Firefox:
                    Host = new FirefoxDriver();
                    break;
                case HostTypeOption.InternetExplorer:
                    Host = new InternetExplorerDriver();
                    break;
                case HostTypeOption.Chrome:
                    Host = new ChromeDriver();
                    break;
                case HostTypeOption.Safari:
                    Host = new SafariDriver();
                    break;
                default:
                    throw new ArgumentOutOfRangeException("hostType");
            }
            Host.Manage().Window.Size = new System.Drawing.Size(windowWidth, windowHeight);
            Host.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(3));
        }
    
        public static void StopHost()
        {
            Host.Quit();
            Host = null;
        }
    }
    

    如果您想使用 IE 或 Chrome,您需要下载特定的驱动程序并将其添加到验收测试项目的 bin 目录中,但 Firefox 可以正常工作。

    【讨论】:

    • 谢谢,很好的回答。我会将它开放几天以鼓励更多答案,否则我会标记你的。我想我希望 specflow 成为一站式商店,而不是同时使用 specflow 和 selenium。在项目中,我们已经进行了单元测试和集成测试,但我真的很想进行一些端到端的测试,以确保 javascript 的行为符合预期。再次感谢您的出色回答并花时间帮助我!
    • 不用担心。如果您在愤怒中开始使用它时还有任何其他问题,请联系他们!
    猜你喜欢
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-08
    • 1970-01-01
    相关资源
    最近更新 更多