javascriptMVC教程 -- 14.FuncUnit实例:完成jquery焦点图插件的自动化功能测试

简介:   FuncUnit相关的知识我在之前的博文已有简单介绍,大家可以自行阅读《javascriptMVC入门 -- 12.FuncUnit》。他提供了很多api方法,我的文章中没有涉及,大家可以去官网查看,地址:http://www.javascriptmvc.com/。

  FuncUnit相关的知识我在之前的博文已有简单介绍,大家可以自行阅读《javascriptMVC入门 -- 12.FuncUnit》。他提供了很多api方法,我的文章中没有涉及,大家可以去官网查看,地址:http://www.javascriptmvc.com/。

  今天我们将通过一个简单的例子,介绍如何把FuncUnit引入项目中,对无法执行单元测试的js文件进行自动化的功能测试。我例子是对jquery焦点图插件进行测试,先来看一下项目结构:

  蓝框选中的就是测试文件。根目录下面的documentjs、funcunit、jquery、steal四个文件夹对应于javascriptMVC框架源代码文件夹。

  channel/focusScroll/funcunit下面的js文件是测试脚本。funcunit.js是入口文件,has-prev-next-btn@scroll-left.js和scroll-top@thumb-click.js测试脚本分别对应的测试页面是has-prev-next-btn@scroll-left.html和scroll-top@thumb-click.html。

  FuncUnit.Master母版页里面包含QUnit相关内容:

<head runat="server">
    <title>
        <%=this.Page.Title %> FuncUnit Test</title>
    <link rel="stylesheet" type="text/css" href="/funcunit/qunit/qunit.css" />
    <asp:ContentPlaceHolder ID="head" runat="server">
    </asp:ContentPlaceHolder>
</head>
<body>
    <h1 id="qunit-header">
        <%=this.Page.Title %> Test Suite</h1>
    <h2 id="qunit-banner">
    </h2>
    <div id="qunit-testrunner-toolbar">
    </div>
    <h2 id="qunit-userAgent">
    </h2>
    <ol id="qunit-tests">
    </ol>
</body>

  funcunit.aspx是FuncUnit.Master的子页面,用来加载funcunit/funcunit.js。

<asp:Content ID="head" ContentPlaceHolderID="head" runat="server">
    <script type='text/javascript' src='/steal/steal.js?channel/focusScroll/funcunit'></script>
</asp:Content>

   funcunit/funcunit.js加载测试js脚本,运行测试。

steal("funcunit", "jquery")
    .then('./has-prev-next-btn@scroll-left.js')
    .then('./scroll-top@thumb-click.js')

  我们来看has-prev-next-btn@scroll-left.js都做了什么事情。

  说句题外话,大家文件命名的时候最好能体现出代码功能,一眼就知道他是干什么的。就像‘has-prev-next-btn@scroll-left.js’,一看我就知道他主要的测试关注点是:prev和next按钮是否工作正常,图片切换是左右切换。除文件命名外,还可以通过注释来描述测试的功能点包括哪些,这样方便日常维护。我们来看代码:

/*
主要测试点:
1.页面包含prev-next按钮,测试相关功能是否正常
2.图片切换方式为左右切换,测试图片测试时候正常
3.测试导航图片class属性是否正确
4.鼠标经过导航图片时(hover效果),大图是否正确切换
*/

steal("jquery", function () {
    module("test", {
        setup: function () {
            S.open("//channel/focusScroll/has-prev-next-btn@scroll-left.html");
        }
    });

    //设置导航图片功能
    test("thumb hover works", function () {
        S("#myTab_btns li:nth-child(1)").move("#myTab_btns li:nth-child(2)");
        S("#myTab_btns li:nth-child(2)").move("#myTab_btns li:nth-child(3)");

        S("#main li:nth-child(3)").offset({ top: 0, left: 0 }).then(function () {
            ok(S("#main li:nth-child(2)").offset().left === -755);
            ok(S("#main li:nth-child(4)").offset().left === 755);

            equal(S("#myTab_btns li:nth-child(2)").hasClass('hot'), false);
            equal(S("#myTab_btns li:nth-child(3)").hasClass('hot'), true);
        });

    });

    //测试‘prev’按钮
    test("prev btn works", function () {
        S("#btnPrev").click();

        S("#main li:nth-child(4)").offset({ top: 0, left: 0 }).then(function () {
            ok(S("#main li:nth-child(1)").offset().left === -755*3);

            equal(S("#myTab_btns li:nth-child(4)").hasClass('hot'), true);
            equal(S("#myTab_btns li:nth-child(1)").hasClass('hot'), false);
        });
    });

    //测试‘next’按钮
    test("next btn works", function () {
        S("#btnNext").click();

        S("#main li:nth-child(2)").offset({ top: 0, left: 0 }).then(function () {
            ok(S("#main li:nth-child(1)").offset().left === -755);
            ok(S("#main li:nth-child(3)").offset().left === 755);

            equal(S("#myTab_btns li:nth-child(1)").hasClass('hot'), false);
            equal(S("#myTab_btns li:nth-child(2)").hasClass('hot'), true);
        });
    })
})

  下面我来对代码中一些关键点做简单说明。

  1. module的setup会在每次运行test方法之前运行,S.open用来打开一个窗口。

  2. S("#myTab_btns li:nth-child(1)").move("#myTab_btns li:nth-child(2)");实现的功能是,从导航图1移动到导航图2,会触发鼠标移入移出的事件。

  3. S("#main li:nth-child(3)").offset({ top: 0, left: 0 }).then(function () {...}); 等待第三章大图的offset变为{ top: 0, left: 0 }后,执行then里面的方法。在编码的过程中我在这里碰到了钉子,看官网api,他说offset()是一个wait类型的函数。那么就应该支持 .offset({ top: 0, left: 0 }, function () {...}) 的写法,但是代码运行错误。我去官网发帖求助也没有得到任何帮忙。之后通过看源代码才发现有then()方法,随后问题得以解决。

 

  我们来看项目运行之后的结果,红框选中的是QUnit显示的测试报告(FuncUnit基于QUnit),蓝框选中的是FuncUnit运行时打开的测试页面(has-prev-next-btn@scroll-left.html 和 scroll-top@thumb-click.html)。

 

  demo项目无法直接运行,因为javascriptMVC源代码有30M,博客园提供的上传文件空间有限,所以我只上传了测试相关代码。需要首先下载javascriptMVC源代码,替换到demo中的funcunit、steal和jquery文件夹,才能运行项目。

  demo下载地址:FuncUnit_Test.zip

adpics.aspx?source=kbh1983&sourcesuninfo
目录
相关文章
|
17天前
|
Java 测试技术 Python
《手把手教你》系列技巧篇(二十九)-java+ selenium自动化测试- Actions的相关操作上篇(详解教程)
【4月更文挑战第21天】本文介绍了Selenium中处理特殊测试场景的方法,如鼠标悬停。Selenium的Actions类提供了鼠标悬停功能,用于模拟用户在网页元素上的悬停行为。文中通过实例展示了如何使用Actions悬停并展开下拉菜单,以及在搜索时选择自动补全的字段。代码示例包括了打开百度首页,悬停在“更多”元素上显示下拉菜单并点击“音乐”,以及在搜索框输入关键词并自动补全的过程。
38 0
|
9天前
|
Java 测试技术 Python
《手把手教你》系列技巧篇(三十六)-java+ selenium自动化测试-单选和多选按钮操作-番外篇(详解教程)
【4月更文挑战第28天】本文简要介绍了自动化测试的实战应用,通过一个在线问卷调查(&lt;https://www.sojump.com/m/2792226.aspx/&gt;)为例,展示了如何遍历并点击问卷中的选项。测试思路包括找到单选和多选按钮的共性以定位元素,然后使用for循环进行点击操作。代码设计方面,提供了Java+Selenium的示例代码,通过WebDriver实现自动答题。运行代码后,可以看到控制台输出和浏览器的相应动作。文章最后做了简单的小结,强调了本次实践是对之前单选多选操作的巩固。
23 0
|
2天前
|
Web App开发 JavaScript 前端开发
《手把手教你》系列技巧篇(三十九)-java+ selenium自动化测试-JavaScript的调用执行-上篇(详解教程)
【5月更文挑战第3天】本文介绍了如何在Web自动化测试中使用JavaScript执行器(JavascriptExecutor)来完成Selenium API无法处理的任务。首先,需要将WebDriver转换为JavascriptExecutor对象,然后通过executeScript方法执行JavaScript代码。示例用法包括设置JS代码字符串并调用executeScript。文章提供了两个实战场景:一是当时间插件限制输入时,用JS去除元素的readonly属性;二是处理需滚动才能显示的元素,利用JS滚动页面。还给出了一个滚动到底部的代码示例,并提供了详细步骤和解释。
25 10
|
2天前
|
JavaScript 前端开发 测试技术
《手把手教你》系列技巧篇(三十八)-java+ selenium自动化测试-日历时间控件-下篇(详解教程)
【5月更文挑战第2天】在自动化测试过程中,经常会遇到处理日期控件的点击问题。宏哥之前分享过一种方法,但如果输入框是`readonly`属性,这种方法就无法奏效了。不过,通过修改元素属性,依然可以实现自动化填写日期。首先,定位到日期输入框并移除`readonly`属性,然后使用`sendKeys`方法输入日期。这样,即使输入框设置了`readonly`,也能成功处理日期控件。
21 1
|
3天前
|
SQL 安全 数据处理
Web 测试神器:HackBar 保姆级教程
Web 测试神器:HackBar 保姆级教程
|
4天前
|
Java 测试技术 Python
《手把手教你》系列技巧篇(三十七)-java+ selenium自动化测试-日历时间控件-上篇(详解教程)
【5月更文挑战第1天】该文介绍了使用Selenium自动化测试网页日历控件的方法。首先,文章提到在某些Web应用中,日历控件常用于选择日期并筛选数据。接着,它提供了两个实现思路:一是将日历视为文本输入框,直接输入日期;二是模拟用户交互,逐步选择日期。文中给出了JQueryUI网站的一个示例,并展示了对应的Java代码实现,包括点击日历、选择日期等操作。
18 0
|
11天前
|
存储 前端开发 测试技术
《手把手教你》系列技巧篇(三十五)-java+ selenium自动化测试-单选和多选按钮操作-下篇(详解教程)
【4月更文挑战第27天】本文介绍了使用Java+Selenium进行Web自动化测试时,如何遍历和操作多选按钮的方法。文章分为两个部分,首先是一个本地HTML页面的示例,展示了多选按钮的HTML代码和页面效果,并详细解释了遍历多选按钮的思路:找到所有多选按钮的共同点,通过定位这些元素并放入list容器中,然后使用for循环遍历并操作。 第二部分介绍了在JQueryUI网站上的实战,给出了被测网址,展示了代码设计,同样使用了findElements()方法获取所有多选按钮并存储到list中,然后遍历并进行点击操作。最后,文章对整个过程进行了小结,并推荐了作者的其他自动化测试教程资源。
19 0
|
12天前
|
前端开发 测试技术 Python
《手把手教你》系列技巧篇(三十三)-java+ selenium自动化测试-单选和多选按钮操作-上篇(详解教程)
【4月更文挑战第25天】本文介绍了自动化测试中如何处理单选和多选按钮的操作,包括它们的定义、HTML代码示例以及如何判断和操作这些元素。文章通过一个简单的HTML页面展示了单选和多选框的示例,并提供了Java+Selenium实现的代码示例,演示了如何检查单选框是否选中以及如何进行全选操作。
18 0
|
14天前
|
前端开发 Java 测试技术
《手把手教你》系列技巧篇(三十二)-java+ selenium自动化测试-select 下拉框(详解教程)
【4月更文挑战第24天】本文介绍了在自动化测试中处理HTML下拉选择(select)的方法。使用Selenium的Select类,可以通过index、value或visible text三种方式选择选项,并提供了相应的取消选择的方法。此外,文章还提供了一个示例HTML页面(select.html)和相关代码实战,演示了如何使用Selenium进行选择和取消选择操作。最后,文章提到了现代网页中类似下拉框的新设计,如12306网站的出发地选择,并给出了相应的代码示例,展示了如何定位并选择特定选项。
24 0
|
15天前
|
数据采集 前端开发 测试技术
《手把手教你》系列技巧篇(三十一)-java+ selenium自动化测试- Actions的相关操作-番外篇(详解教程)
【4月更文挑战第23天】本文介绍了网页中的滑动验证码的实现原理和自动化测试方法。作者首先提到了网站的反爬虫机制,并表示在本地创建一个没有该机制的网页,然后使用谷歌浏览器进行验证。接着,文章详细讲解了如何使用WebElement的click()方法以及Action类提供的API来模拟鼠标的各种操作,如右击、双击、悬停和拖动。
12 2