(一)测试背景概述
接上篇《HTTP JSON协议接口测试自动化实例》所述:
产品1和产品2为待测试对象,抽象出来可以归结为【http json协议接口测试】与【http web功能测试】。
其中【http web功能测试】针对未曾接触的一种数据库,还包含了大量数据库和SQL级别的专有操作测试内容,此处不予讨论。测试对象无论是由C/C++还是Java还是JS/Html实现,对于协议测试和功能测试(白盒测试和单元测试另当别论),都不需要深入了解该语言,熟悉任一种高级语言(最好还有一种脚本语言)+自动化思维意识 +快速学习能力,完全能实施测试自动化策略。
同样,先来分析一下【http web功能】的特点。
(二)测试需求分析
1. ExtJs框架+Html/Css纯网页,逻辑全部由JS脚本代码控制,不需编译,浏览器直接解释执行。
2. 网页上每个控件元素的ID属性等由ExtJs框架动态分配,每次打开可能都不一样。如:登录按键本次ID为Login-1055,下次打开网页可能为Login-1056。故基于录制和回放脚本的流程行不通。
3. 查找网上流行的WEB自动化测试框架或工具,均实际尝试使用,最终选择开源的WEB自动化测试工具Selenium,利用其提供的XPath和WEB Driver类库 + NUnit(.NET平台单元测试工具)。
* 扩展: Selenium是ThoughtWorks公司开发的一套基于WEB应用的测试工具,直接运行在浏览器中,核心browser bot是用 Javascript 编写的,模拟用户的操作,主要包括三个部分Selenium-IDE, Selenium-Core, Selenium-RC。它可以被用于单元测试,回归测试,冒烟测试,集成测试,验收测试等。Selenium支持Firefox、IE、Chrome等多种浏览器和多种操作系统(Firefox含有录制脚本插件,可导出为其他语言用例脚本),提供包括Java/C#/Python/Ruby多种语言的RC类库和Driver类库,即可以使用其中任一种语言进行自动化测试,其Driver类库一般都和相应语言的单元测试工具结合使用,如C#+ Selenium Driver + NUnit, Java + Selenium Driver + JUnit, Python + Selenium Driver +PyUnit等。
(三)设计和技术细节准备
1. 使用Firefox的录制脚本插件Selenium IDE录制一段WEB操作脚本并导出为C#代码(参照格式)。
2. 创建NUnit的工程(需要安装Visual Studio的NUnit插件),导入刚才的代码。
3. 进行WEB操作,设计测试用例单元,分析操作中每个控件元素的XPath(参见http://blog.csdn.net/w565911788/article/details/7616966),唯一标示网页上每个控件元素,然后调用Selenium Driver提供的API,通过XPath寻找到该控件并模拟操作。
4. 检查点:使用Selenium Driver提供的API,通过XPath寻找到该控件并取得对应属性,利用NUnit的断言进行比较,得出期望结果是否一致。
5.扩展结合(封装引入其他有用API更加方便的测试和检查):其他公用方法实现,利用Windows API引入关闭程序进程、浏览器窗口前置/最大化/最小化、模拟键盘发送按键消息到OS、模拟鼠标点击、屏幕(浏览器窗口/区域)截图(断言失败时调用)等自动操作。
(四)开发实施和自测
1. 引用命名空间和基本结构属性
using System.Threading;//Thread.Sleep
using NUnit.Framework;//NUint
using OpenQA.Selenium;
using OpenQA.Selenium.IE;
using OpenQA.Selenium.Firefox;
using OpenQA.Selenium.Support.UI;
using System.Windows.Forms;//SendKeys
using WugWinAPI;//API扩展
namespace AutoTestCWM
{
[TestFixture]
publicclassFrameTest
{
privateIWebDriver driver;
privateStringBuilder verificationErrors;
privatestring baseURL;
[SetUp]
publicvoid SetupTest()
{
//……
}
[TearDown]
publicvoid TeardownTest()
{
//……
}
[Test]
publicvoid Frame001()
{
//……
}
[Test]
publicvoid Frame002()
{
//……
}
}
}
2. 打开浏览器网页
[SetUp]
publicvoid SetupTest()
{
PublicUtil.KillFirefox();
Thread.Sleep(100);
driver = new FirefoxDriver();
baseURL = "https://10.34.130.44:8282/";
verificationErrors = new StringBuilder();
driver.Navigate().GoToUrl(PublicUtil.BaseURL +"/");
Thread.Sleep(1000);
}
3. 关闭和清理资源
[TearDown]
publicvoid TeardownTest()
{
try
{
if (verificationErrors.ToString().Equals(""))
{
driver.Quit();
}
}
catch (Exception)
{
// Ignore errors if unable to close the browser
}
Assert.AreEqual("", verificationErrors.ToString());
}
4. 测试单元举例
[Test]
publicvoid Frame002()
{
//测试数据XPath
string btnID = "//div[@class='x-panel x-column x-panel-default']//img[@src='resources/images/status_group.png']";
string check_point = "//div[@id='memGridInView-body']//table/tbody/tr[3]/td[2]";
string check_result = "";
//调用登录
F_Login();
//调用API激活浏览器窗口
PublicUtil.ActiveWindow();
//点击按键
driver.FindElement(By.XPath(home_btnID)).Click();
Thread.Sleep(1000);
//点击按键
driver.FindElement(By.XPath(btnID)).Click();
Thread.Sleep(10000);
//检查点,取得被校验值
check_result = driver.FindElement(By.XPath(check_point)).Text;
int data_space = Convert.ToInt32(check_result.Replace(" MB",""));
//调用退出
F_Logout();
//断言,检查是否小于等于1024MB
Assert.LessOrEqual(check_result, "999 MB");//字符串比较
Assert.LessOrEqual(data_space, 1024);//数值比较
//自动保存当时截图
IntPtr whand = ApiMethod.GetProcessMainFormHandle("firefox");
ScreenCapture.CaptureWindowToFile(whand, @"C:\firefox\test_table_" +DateTime.Now.ToString("HHmmss") +".jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
}
(五)结果演示
附:通用自动化测试工具效果
1. 主体框架实现特定功能,高级语言完成,并开放大量实用API,且不断增加和完善
2. 嵌套或封装一种或多种脚本语言解析器,能够动态执行测试用例脚本,对Windows窗体、Web、代码、接口、协议或性能等若干方面进行测试(扩展:录制功能)
3. 流程完善,能够准确高效的解放人力和深入测试,手工尽可能少的参与或专注于测试用例脚本工作
4. 可扩展性强,能够远程操控多个多种平台(分布集群,通过网络通信、协议通信等),能够并行调度执行,可配置可存储,资源共享方便
5. 自动化框架工作:检测新的版本à下载、编译、批量部署à调用指定测试脚本执行测试à邮件或消息通知QA测试结果报告路径和发现的bug。
6. 手工工作:编写修改测试脚本并上传、收邮件校验bug、喝咖啡。