在软件开发过程中,自动化测试是确保软件质量的重要手段。特别是对于Web应用,用户交互测试尤为重要。本文将介绍如何使用Watin和NUnit进行Web应用的用户交互测试,包括登录测试和页面加载测试。
Watin(发音为“watt inn”)是一个免费的开源自动化测试工具,它可以模拟用户与Web应用的交互,包括登录、页面加载、按钮点击和表单提交等操作。Watin使用页面上的HTML元素的ID或文本来填充文本框、点击按钮等,这意味着可以在不更新UI测试的情况下更改页面上的元素位置。
NUnit是一个流行的.NET测试框架,它支持自动化测试的编写和运行。Watin可以与NUnit结合使用,以实现自动化测试的自动化执行。
首先,需要将以下DLL文件添加到测试项目的Assemblies文件夹中,并在测试项目中引用它们:
可以从以下链接下载Watin和NUnit的最新版本:
虽然不需要Resharper来运行NUnit测试,但它提供了一些便利的功能。可以从以下链接下载Resharper的试用版:
接下来,需要为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();
}
在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运行方式,否则可以做以下两件事: