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

标签 asp.net testing automated-tests functional-testing web-testing

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

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

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

这样,新来的人可以简单地从源代码管理中获取最新信息并运行我们的构建脚本,并查看所有运行的测试。他们还可以直接从IDE运行所有测试。

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

我很好奇您为使功能测试自动化以解决其中的某些问题而仍然保持简单性所做的事情。

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

我对任何平台的解决方案都感兴趣,但可能需要对每件事的含义进行更多说明。 :)

最佳答案

菲尔

自动化可能很难维护,但是您使用自动化进行部署的次数越多,就可以将其更多地用于测试设置(反之亦然)。

坦白说,使用不使用自动生成工具的构建工具,可以更轻松地发展自动化代码,对其进行分解并将其重构为特定的小功能单元。
就像NAnt和MSBuild一样,仅驱动静态编译的,预先构造的功能单元。这是许多像NAnt这样的相对较早使用牙齿的人迁移到Rake的原因之一。使用Rake,可以将构建代码与其他任何代码一样自由地(以连续地扩展其内容和形状)。在Rake中,最终您不会像使用Rake那样轻松快捷地获得自动化工件的停滞状态,并且在Rake中编写脚本要比使用NAnt或MSBuild容易得多。

因此,您的工作中的某些部分与工具固有地联系在一起。为了使您的自动化保持合理性和维护性,应该警惕NAnt和MSBuild之类的静态构建工具施加的障碍。

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

有时,测试数据的设置只是痛苦中的一件事。必须要做的。

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

我从HTTP驱动所有示例数据控件。我为控制器编写了专门用于控制样本数据的操作,并通过Selenium针对这些操作发出GET。我用这些来创建和清理数据。我可以将GET组合到这些操作中,以创建通用的设置数据方案,并且可以将数据的特定值作为请求参数(或根据需要提供表单参数)进行传递。

我将这些控制器放在通常称为“ test_support”的区域中。

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

我还使用test_support代码自动控制整个环境-用伪造品替换服务,关闭子系统以模拟故障和故障转移,激活或停用身份验证以及针对与这些方面无关的功能测试的访问控制等。

控制Web应用程序的样本数据或Web上的测试数据具有很大的辅助价值:在演示应用程序或进行探索性测试时,只需针对已知(或可猜测的)URL发出一些获取,即可创建所需的数据方案。在test_support区域。真正做出纪律努力,坚持轻松的路线和以资源为导向的做法,一定会奏效。

这种功能自动化(包括测试,部署,演示等)还有很多,因此,对这些资源进行更好的设计,可以在较长的时间范围内维护它们的时间越多,找到的机会就越多。以无法预见但有益的方式利用它们。

例如,在网页的语义模型上编写域模型代码将有助于创建更易理解的测试代码,并减少脆弱性。如果做得好,则可以将这些相同的模型与各种不同的驱动程序一起使用,以便可以在压力测试和负载测试以及功能测试中利用它们,也可以从命令行将其用作探索性工具。顺便说一句,当您不受驱动程序类型的约束时,与使用静态语言时一样,这种事情更容易实现。有很多原因导致许多领先的测试思想家和执行者使用Ruby工作,而Watir用Ruby编写。与C#测试代码相比,在Ruby中更容易实现重用,合成和表达。但这是另一个故事。

让我们赶快来聊一聊其他90%的东西:)

关于asp.net - 将自动Web测试集成到构建过程中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1240057/

相关文章:

spring - JUnit 4 - 在运行单元测试之前以编程方式创建 HSQLDB 表

c# - 使用 specflow 从 excel 读取数据并写入特征文件

javascript - Nock 不会拦截对第 3 方的调用

unit-testing - RPG(或其他 ILE 语言)中的自动化测试

c# - 在 Web 窗体项目中禁用自动友好 URL

c# - 是否可以从 ASP.net 中的 SQL/MySQL 数据库导入表单的按钮位置?

c# - System.Data.DataRowView' 不包含名称为 'State' 的属性

css - CKEditor 删除内联 CSS

python - 假设策略 : for each "bucket", 从桶中取一个值

http - 我如何测试 Angularjs 工厂 stub $http?