Asp.net 将自动化Web测试集成到构建过程中

Asp.net 将自动化Web测试集成到构建过程中,asp.net,testing,automated-tests,functional-testing,web-testing,Asp.net,Testing,Automated Tests,Functional Testing,Web Testing,我正在寻找改进网站功能测试自动化过程的建议。这是我过去试过的 我曾经有一个测试项目使用。您可以有效地编写类似于“单元测试”的内容,并使用WATIN自动化浏览器来点击您的站点等 当然,您需要一个正在运行的站点。因此,我让测试实际上将代码从我的web项目复制到本地目录,并在任何测试运行之前启动指向该目录的web服务器 这样,新用户只需从我们的源代码管理中获取最新版本并运行构建脚本,就可以看到所有测试都在运行。他们还可以简单地从IDE运行所有测试 我遇到的问题是,我花了很多时间维护代码来设置测试环境,

我正在寻找改进网站功能测试自动化过程的建议。这是我过去试过的

我曾经有一个测试项目使用。您可以有效地编写类似于“单元测试”的内容,并使用WATIN自动化浏览器来点击您的站点等

当然,您需要一个正在运行的站点。因此,我让测试实际上将代码从我的web项目复制到本地目录,并在任何测试运行之前启动指向该目录的web服务器

这样,新用户只需从我们的源代码管理中获取最新版本并运行构建脚本,就可以看到所有测试都在运行。他们还可以简单地从IDE运行所有测试

我遇到的问题是,我花了很多时间维护代码来设置测试环境,而不是测试。更不用说,由于所有的复制,它需要很长时间才能运行。此外,我还需要测试各种场景,包括安装,这意味着我需要能够将数据库设置为各种初始状态

我很好奇你做了些什么来自动化功能测试,以解决其中一些问题,并保持简单

更多详细信息 既然人们要求更多的细节,这里就是了。我正在使用Visual Studio和Cassini(内置web服务器)运行ASP.NET。我的单元测试在MbUnit中运行(但这并不重要,可以是NUnit或XUnit.NET)。通常,我有一个单独的单元测试框架来运行我的所有WATIN测试。在AssemblyLoad阶段,我启动web服务器并在本地复制所有web应用程序代码


我对任何平台的解决方案都感兴趣,但我可能需要更多关于每件事含义的描述。:)

使用maven在构建过程中构建集成测试阶段是困难的,但并非不可能。发生的事情基本上是这样的:

  • 忽略特定目录中的所有JUNit测试,除非启动集成测试阶段
  • 添加maven概要文件以执行集成测试
  • 对于预集成测试阶段-

  • 启动Jetty,运行应用程序访问测试数据库

  • 启动selenium服务器
  • 在集成测试阶段运行selenium集成测试
  • 停止selenium服务器
  • 停止硒
这一步的困难在于真正设置jetty-我们不能让它仅仅从战争中启动,所以我们实际上必须让jetty解包战争,然后运行服务器-但它可以正常工作,而且是自动化的-您所要做的就是键入mvn-pintegorationtest(这是我们的集成测试配置文件名称)并关闭它。

Phil

自动化可能很难维护,但是您在部署中使用的自动化越多,就越能利用它进行测试设置(反之亦然)

坦白地说,当使用一个不是
只是驱动静态编译的、预先考虑因素的功能单元,就像NAnt和MSBuild一样。这也是许多像NAnt这样的工具早期用户迁移到Rake的原因之一。使用Rake时,可以像对待任何其他代码一样自由地处理构建代码,从而不断地改进其内容和形状。在自动化工件中,使用Rake不会像使用Rake那样容易和快速地导致相同的停滞,而且在Rake中编写脚本要比使用NAnt或MSBuild容易得多

因此,你斗争的一部分内在地与工具有关。为了保持自动化的可感知性和可维护性,您应该警惕静态构建工具(如NAnt和MSBuild)带来的障碍

我建议您不要将测试环境引导与程序集负载耦合起来。这是一个由内而外的耦合,只提供短暂的方便。在从IDE或命令行或交互式控制台(如Mono项目的C#REPL或IRB)运行测试之前,转到命令行并执行构建任务来设置环境并没有什么错(很可能一切正常)

测试数据设置有时只是一个麻烦。必须这样做

您需要一个库,可以调用它来创建和清理数据库状态。您可以直接从测试代码中进行这些调用,但我个人倾向于避免这样做,因为测试数据或示例数据控制代码有不止一种很好的用途

我从HTTP驱动所有示例数据控件。我编写的控制器带有专门用于控制样本数据的操作,并通过Selenium针对这些操作发出命令。我使用这些来创建和清理数据。我可以编写这些操作来创建设置数据的公共场景,并且我可以将数据的特定值作为请求参数(或表单参数,如果需要的话)

我把这些控制器放在一个我通常称之为“测试支持”的区域

我部署网站的自动化不会部署测试支持区域或其路由和映射。作为部署验证自动化的一部分,我确保测试支持代码不在生产应用程序中

我还使用test_支持代码来自动控制整个环境——用假货替换服务,关闭子系统以模拟故障和故障转移,激活或停用与这些方面无关的功能测试的身份验证和访问控制,等等

控制web应用程序的示例数据或web测试数据有一个很好的次要价值:当演示应用程序或进行探索性测试时,您可以通过在测试支持区域中针对已知(或可猜测)URL发出一些GET来创建所需的数据场景。真正有纪律地坚持restful路线和资源导向
    [Test]
    public void Can_log_in() {
        AspNetResponse response = WebApp.ProcessRequest("/Login.aspx");
        AspNetForm form = response.GetForm();

        form["UserName"] = User.UserName;

        form["Password"] = User.Password;

        AspNetResponse loggedIn = WebApp.ProcessRequest(Button.Click(form, "LoginUser"));


        Assert.IsTrue(loggedIn.IsRedirect());

        AspNetResponse homePage = WebApp.ProcessRequest(loggedIn.GetRedirectUrl());

        Assert.AreEqual(homePage.Status, 200);
    }
browser.TextField("ctl0_tab2_newNote").TypeText("foo");
User.NotesTab.NewNote.TypeText("foo");