自动化Web应用测试:使用Watin进行用户交互测试

在软件开发过程中,自动化测试是确保软件质量的重要手段。特别是对于Web应用,用户交互测试尤为重要。本文将介绍如何使用Watin和NUnit进行Web应用的用户交互测试,包括登录测试和页面加载测试。

Watin和NUnit简介

Watin(发音为“watt inn”)是一个免费的开源自动化测试工具,它可以模拟用户与Web应用的交互,包括登录、页面加载、按钮点击和表单提交等操作。Watin使用页面上的HTML元素的ID或文本来填充文本框、点击按钮等,这意味着可以在不更新UI测试的情况下更改页面上的元素位置。

NUnit是一个流行的.NET测试框架,它支持自动化测试的编写和运行。Watin可以与NUnit结合使用,以实现自动化测试的自动化执行。

设置测试环境

首先,需要将以下DLL文件添加到测试项目的Assemblies文件夹中,并在测试项目中引用它们:

  • nunit.framework.dll
  • WatiN.Core.dll
  • Interop.SHDocVw.dll

可以从以下链接下载Watin和NUnit的最新版本:

  • Watin下载链接:[链接]
  • NUnit下载链接:[链接]

虽然不需要Resharper来运行NUnit测试,但它提供了一些便利的功能。可以从以下链接下载Resharper的试用版:

  • Resharper下载链接:[链接]

配置app.config

接下来,需要为Watin设置app.config。在配置节点中添加以下部分:

<sectionGroup name="NUnit"> <section name="TestRunner" type="System.Configuration.NameValueSectionHandler" /> </sectionGroup>

由于Internet Explorer浏览器实例需要在单线程模式下运行,所以在配置节点中添加以下部分:

<NUnit> <TestRunner> <add key="ApartmentState" value="STA" /> </TestRunner> </NUnit>

最后,由于根URL可能会根据环境(如集成服务器)而变化,所以在appSettings节点中添加以下键:

<add key="RootURL" value="http://localhost/1423/" />

创建基础测试

接下来,创建一个BaseUITest类,它包含Internet Explorer实例,用于打开浏览器并访问Web应用。不希望在测试运行时浏览器实例到处弹出,所以需要在打开浏览器实例之前将MakeNewIeInstanceVisible设置为false。这样,在测试运行时会隐藏所有测试浏览器实例。如果想看到幻影用户打开浏览器窗口并填写表单(这非常酷),可以注释掉这行代码或将其设置为true:

Settings.Instance.MakeNewIeInstanceVisible = false;

个别测试将使用相同的浏览器会话,并使用单个浏览器实例导航到不同的页面。在测试中,希望从访问登录页面开始(如果网站的其余部分需要登录才能继续,可能还希望登录):

browser = new IE(rootURL + "Account/LogOn");

最后,应该始终等待页面或操作完成,否则在运行时可能会出错:

browser.WaitForComplete();

在TestFixtureTearDown中,关闭任何打开的浏览器实例(即使它们是隐藏的)。注意:这将关闭桌面上的任何Internet Explorer浏览器,但Internet Explorer将允许重新打开浏览器时立即恢复这些会话:

if (browser != null) { browser.ForceClose(); }

创建UI测试

在TestAccount类中,将创建一个烟雾测试,验证否可以:

  • 访问登录页面
  • 实际登录

首先,创建一个TestAccount类,它扩展了BaseUITest。创建一个用Test标签装饰的方法,称为CorrectlyGetsToLoginPage,它简单地访问登录页面,等待页面加载,然后验证页面包含“Log On”短语并且标题为“Log On”:

[Test] public void CorrectlyGetsToLoginPage() { browser.GoTo(rootURL + "Account/LogOn"); browser.WaitForComplete(); Assert.IsTrue(browser.Title == "Log On"); Assert.IsTrue(browser.Text.Contains("Log On")); }

接下来,创建CorrectlyLogsIn测试方法,它首先访问登录页面,等待页面加载,找到用户名和密码文本框并用适当的值填充它们。注意,测试通过HTML元素的ID找到文本框,这意味着UI设计师可以随意更改UI,而永远不需要像使用其他测试产品一样更新测试中的新元素位置:

browser.GoTo(rootURL + "Account/LogOn"); browser.WaitForComplete(); browser.TextField(Find.ById("username")).TypeText("robert.corvus"); browser.TextField(Find.ById("password")).TypeText("secretpw");

然后,找到提交按钮并点击它。注意,在这种情况下,通过值(即输入元素的文本)找到提交按钮,因为没有在该控件上设置ID。请注意,Internet Explorer实例存在问题,所以想使用ClickNoWait和WaitForComplete方法而不是简单的Click方法(注意互联网上的示例代码使用Click,可能在运行时看到错误):

browser.Button(Find.ByValue("Log On")).ClickNoWait(); browser.WaitForComplete();

最后,验证访问了正确的页面,并且它包含登录的用户名:

Assert.AreEqual(rootURL, browser.Url); Assert.IsTrue(browser.Text.Contains("Welcome robert.corvus!"));

运行测试

在环境遇到的一个问题是,Watin测试需要在NUnit应用程序中以“与桌面交互”的方式运行,并且需要有用户登录。这意味着Watin测试在Resharper的Run Unit Tests运行时运行得很好,但不会在Cruise Control下运行,因为Cruise Control作为服务在特定用户下运行。除非想改变Cruise Control运行方式,否则可以做以下两件事:

  • 可以用Ignore标签标记Watin测试,这意味着它们将被跳过与正常测试,但可以通过Resharper插件手动运行,方法是右键单击它们并点击"Run Selected Tests"。
  • 可以将Watin测试移动到一个单独的测试项目中(就像在演示中所做的),这个项目不会被Cruise Control构建项目调用。这样Cruise Control永远不会调用Watin测试,但Watin测试将始终在使用Resharper的"Run All Tests In Solution"时运行。
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485