[置顶] 自动化测试开发实际应用系列(四)应用Selenium + NUNIT对动态WEB测试自动化

(一)测试背景概述

接上篇《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框架动态分配,每次打开可能都不一样。如:登录按键本次IDLogin-1055,下次打开网页可能为Login-1056。故基于录制和回放脚本的流程行不通。

3.       查找网上流行的WEB自动化测试框架或工具,均实际尝试使用,最终选择开源的WEB自动化测试工具Selenium,利用其提供的XPathWEB Driver类库 + NUnit.NET平台单元测试工具)。

* 扩展: SeleniumThoughtWorks公司开发的一套基于WEB应用的测试工具,直接运行在浏览器中,核心browser bot是用 Javascript 编写的,模拟用户的操作,主要包括三个部分Selenium-IDE, Selenium-Core, Selenium-RC。它可以被用于单元测试,回归测试,冒烟测试,集成测试,验收测试等。Selenium支持FirefoxIEChrome等多种浏览器和多种操作系统(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 StudioNUnit插件),导入刚才的代码。

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]

    public class FrameTest

    {

        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://127.0.0.1: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、喝咖啡。

 

你可能感兴趣的:([置顶] 自动化测试开发实际应用系列(四)应用Selenium + NUNIT对动态WEB测试自动化)