我正在寻找建议,以改善该过程的自动化功能测试的一个网站。这里就是我已经试过在过去。

我曾经有一个试验项目使用 WATIN.你有效地写什么看起来像"单元的测试",并使用WATIN自动化浏览器击在你的网站等。

当然,你需要一个网站能运行。所以我做了测试实际上代码复制自我的网项目对当地的目录,并开始了一个网络服务器向该目录之前的任何测试运行。

这样,新的人可以获得最新的自我源的控制和运行我们建立脚本,看看所有试运行。他们也可以简单地运行的所有测试从IDE。

问题是我遇到的是,我花了很多时间保持码设立的测试环境,更多的试验。更不要说它花了很长时间运行,因为所有复制。此外,我需要测试了各种方案,包括安装,这意味着我需要能够设定数据库的各种初始国。

我很好奇你做了什么来实现自动化功能测试,以解决这些问题和仍然保持简单。

更多细节 由于人民要求更多的细节,在这里它是。我跑ASP.NET 使用Visual Studio和卡西尼(该建立在网络服务器)。我的单元测试运行在MbUnit(但是这还不那么重要。可能是关或XUnit.NET).通常,我有一个单独的单元的测试框架内运行的所有我的WATIN测试。在AssemblyLoad阶段,我开始在网络服务器和复制所有我的网应用程序的代码。

我感兴趣的解决方案的平台,但我可能需要更多说明在什么每个事物的装置。:)

有帮助吗?

解决方案

菲尔,

自动化可以只是很难维持,但越用您的自动化部署,更可以利用它测试设置(反之亦然)。

坦率地说,它更容易演变自动化代码,使用的构建工具,没有结果时,保理它,它重构到的特定功能,小户型 只是驱动静态编译,功能的预因式分解单元中,与恶性和的MSBuild的情况。这是许多谁是像楠图尔的比较早的用户人移出到耙的原因之一。自由治疗构建代码的任何其他码 - cotinually发展其内容和形状 - 更大用Rake。你不与自动化文物一样淤滞一样容易与耙最终并以最快速度,并且它比耙或南特的MSBuild更容易脚本很多。

所以,你奋斗的某些部分是天生的工具息息相关。为了使您的自动化明智和维护,你应该警惕障碍物的静态编译工具,如恶性和MSBuild的征收。

我建议你不要对夫妇测试环境从装配负荷启动捆扎。这是一个由内向外的连接,仅提供简单方便。这没有什么错(而且,有可能一切右)要在命令行和执行,要么从IDE或命令行,或从交互式控制台中运行测试之前设置环境的建设任务,想从C#REPL Mono项目,或从IRB。

测试数据的设置是简单地只是在有时一个痛苦的对接。它有许多工作要做。

您会需要,你可以打电话来创建和清理数据库状态库。您可以从您的测试代码这些电话,但我个人倾向于避免这样做,因为有不止一个良好的使用测试数据或样本数据的控制代码。

我开从HTTP所有样本数据的控制。我写的用行动控制器专为控制样本数据和问题得到通过对硒的行动。我用这些来创建和清理数据。我可以撰写获取对这些操作来创建设置数据的常见的情况,我可以如请求参数数据传递特定值(或形式参数如果需要的话)。

我保持在一个区域,这些控制器,我通常所说的“test_support”。

我的自动化部署的网站不部署test_support地区或其路线和映射。正如我的部署验证自动化的一部分,我请确保test_support代码是不是在生产应用程序。

我还使用test_support代码来自动在整个环境控制 - 假货更换服务,关闭子系统以模拟的故障和故障转移,激活或去激活对于不涉及这些方面的功能测试的认证和访问控制,等

有对从网络控制你的web应用程序的样本数据或测试数据有很大辅助值:demoing应用程序时,或做探索性测试时,您可以创建数据情况下,您只需要通过发行一些获得对已知(或猜测的)的URL在test_support区域。实拍纪律的努力,坚持宁静的途径和资源定位,这里将真正的回报。

有很多更该功能自动化(包括测试,部署,demoing等),以便更好地设计了这些资源,更好的你必须保持他们在长期大厅的时候,和更多的机会,你”会发现利用它们在不可预见的,但有利的方式。

例如,在你的网页的语义模型编写域模型的代码将有助于创造更多的可以理解的测试代码和降低脆性。如果你这样做很好,你可以使用那些相同的型号有多种不同的驱动程序,让您可以在压力测试和负载测试以及功能测试利用它们以及使用它们的命令行作为探索性的工具。顺便说一句,这种事情是容易当你因为你是当你使用一个静态的语言会不会绑定到驱动程序类型做。还有一个原因,为什么许多领先的测试思想家和实干家在Ruby中工作,为什么的Watir用Ruby编写的。复用,组合物,和可表达更容易在Ruby来实现比C#测试代码。但是,这是另一个故事了。

让我们赶上了一段时间,并进一步讨论这东西的其余90%:)

其他提示

我们使用等离子的一个项目。它模拟过程中的Web服务器 - 只要指向它在你的web应用项目的根。

这是令人惊奇的稳定 - 没有复制的文件或启动一个出处理服务器的

下面是一种使用等离子体的测试如何寻找我们...

    [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);
    }

所有 “AspNetResponse” 和 “AspNetForm” 类都包含与等离子体。

我们目前正在使用一个自动化的建立过程中对我们的asp.net 软应用程序。

我们使用以下工具:

  • TeamCity
  • SVN

我们使用msbuild脚本上运行建立代理人可以任何数量的机器。请参阅脚本得到最新的版本代码从svn,并建立它。

在成功它然后部署的文物的特定计算机/文件夹和创造的虚拟网站在IIS。

然后,我们使用MSBuild普的任务运行sql脚本以安装的数据库,并负荷的数据,你也可以做到恢复。

在成功,我们启动关的测试。的测试的设置确保硒是建立和运行,然后驱动硒测试以同样的方式,Watin。硒具有良好的记录,用于测试可以导出来。

的好事对硒是,你可以开车FF,Chorme和即不受限制,即其情况与Watin最后一次我看着它。你也可以使用硒做到负荷的测试与硒格因此你可以重复使用相同的试验。

在成功msbuild标签,然后该建立在svn.TeamCity的工作运行过夜,这将部署的最新标签的一个临时的环境,准备为该企业用户的检查项目的状态下午。

在以前的生活,我们有nant&msbuild脚本到完全管理环境(安装java、硒等)然而,这并采取了很多时间以便作为一个预req我们假定每个建立剂有这些安装。随着时间的推移,我们将会包括这些任务。

为什么你需要复制的代码?沟卡西尼让Visual Studio中创建一个虚拟目录为您服务。确保开发者必须记住,如果Web应用程序已经改变了运行的Web测试之前建立。我们发现,这是不是一个大问题,特别是如果你在运行CI网测试。

数据是一大挑战。据我所看到的,你必须不完美的替代品之间进行选择。下面是我们如何处理它。首先,我要说明的是,我们正在使用大型复杂的遗留应用程序的WebForms工作。我还要提到的是,域代码不是非常适合于从测试项目中创建测试数据。

这给我们留下了一对夫妇的选择。我们可以:(1)运行数据的安装脚本生成之下,或(b)通过使用实际的网站Web测试创建的所有数据。与方案(a)的问题是,测试成为加上在一分钟级脚本。它使我的头一阵悸动考虑同步网络测试代码和T-SQL。所以,我们使用(B)。

(b)中的一个好处是你的设置也验证应用程序行为。问题是... 时间的。

理想情况下测试应该是独立的,不具有时间耦合(可以以任何顺序执行),并没有共享任何上下文(例如,共同的测试数据)。处理这种情况常用的方法是建立与每个测试推倒数据。一些深思熟虑之后,我们决定打破这个规则。

我们使用公堂(MbUnit的3),它提供了支持我们的战略一些不错的功能。首先,它可以让你在夹具和测试级别指定的执行顺序。我们已进行排序-4四“设置”固定装置,-3,-2,-1。这些运行在指定的顺序和前的所有“非设置”固定装置,其由缺省具有为0的顺序

我们的网络测试项目取决于为只有一件事构建脚本:一个著名的用户名/密码。这是一个耦合我可以住在一起。作为安装运行测试,他们建立了一个“数据上下文”对象,在整个其他所有灯具持有数据稍后使用(但从来没有改变过)(企业,用户,供应商,客户等)的标识符。 (通过标识,我并不一定意味着键。在大多数情况下,我们的Web UI不会暴露的唯一密钥,我们必须用真正的标识符的名称或其他代理导航的应用程序。更多关于这下面。)

加利奥还允许指定一个测试或夹具依赖于另一个试验或夹具。当一个先例失败中,因被跳过。这通过防止“级联故障”,其可以收获很大的混乱减少时间耦合的恶

创建基线测试数据一次,而不是每个测试之前,加速了很多东西。但是,安装测试,可能仍然需要花费10分钟来运行。当我工作的新测试中,我想运行,并经常重新运行它们。输入另一个很酷的功能加利奥:氛围。气氛是围绕DB4的包装,提供了一个非常简单的方法来坚持的对象。我们用它来自动持久化数据上下文。因此,设置的测试只能进行一次数据库的重建之间运行。之后,你可以反复运行的任何或所有其他附着物。

那么,关于清理测试数据?难道我们需要从已知状态开始?这是我们发现它的权宜之计,以打破规则。这为我们工作策略是使用长随机值之类的公司名称,用户名等我们发现,它不是很难保持一个试运行逻辑“数据空间”的内部,这样它不会碰到其他数据。当然,我担心我花几个小时追逐幻影失败的测试才发现,它的一些数据冲突的一天。这是关闭该交易目前正在为我们。

我们正在使用华廷。我挺喜欢它的。成功的另一个关键是什么斯科特Bellware暗示。当我们创建测试,我们正在建立我们的UI的抽象模型。因此,而不是这样的:

browser.TextField("ctl0_tab2_newNote").TypeText("foo");

您无线会在我们的测试中看到这一点:

User.NotesTab.NewNote.TypeText("foo");

此方法提供了三个好处。首先,我们永不重复一个神奇的字符串。这大大降低了脆性。其次,测试更容易阅读和理解。最后,我们隐藏了大部分我们自己的抽象背后的华廷框架。在第二个例子中,仅是的TypeText一个华廷方法。这将使它更容易为架构的改变而改变。

希望这有助于。

它是困难的,但不是不可能的,建立一个融入试验阶段进入建造过程中使用的家.发生了什么事基本上是这样的:

  • 忽略所有JUNit测试在一个特定的目录,除非一体化试验阶段的火灾。
  • 增加一个家档案执行的集成试验。
  • 预的集成试验阶段-

  • 开始码头运行的应用程序撞测试的数据库。

  • 开始的硒服务器
  • 运行硒一体化测试的集成试验阶段
  • 停止硒服务器
  • 停止硒

困难在这一步骤是真的设立的码头-我们不能让它只是启动从一场战争,所以我们实际上必须要有解码头的战争,然后运行服务器的-但是它的工作,以及,并是自动化的-你所要做的就是类型ant war-PintegrationTest(这是我们的集成试验档案名称)和关闭它去了。

你的意思是自动启动建设后,测试完了吗? 你可以写自动化脚本,同时构建符合成功到构建文件复制到工作IIS。然后通过呼叫mstest.exe或其他方法开始自动BVT。

您可以得到与autoitx尝试或某些功能的语言,如Python和Ruby。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top