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

目录
相关文章
|
6月前
|
设计模式 前端开发 测试技术
告别脆弱:构建稳定UI自动化测试的3个核心策略
告别脆弱:构建稳定UI自动化测试的3个核心策略
589 113
|
6月前
|
数据采集 JSON JavaScript
Cypress 插件实战:让测试更稳定,不再“偶尔掉链子”
本文分享如何通过自定义Cypress插件解决测试不稳定的痛点。插件可实现智能等待、数据预处理等能力,替代传统硬性等待,有效减少偶发性失败,提升测试效率和可维护性。文内包含具体实现方法与最佳实践。
|
7月前
|
人工智能 数据可视化 测试技术
Postman 性能测试教程:快速上手 API 压测
本文介绍API上线后因高频调用导致服务器告警,通过Postman与Apifox进行压力测试排查性能瓶颈。对比两款工具在批量请求、断言验证、可视化报告等方面的优劣,探讨API性能优化策略及行业未来发展方向。
Postman 性能测试教程:快速上手 API 压测
|
7月前
|
存储 关系型数据库 测试技术
玩转n8n测试自动化:核心节点详解与测试实战指南
n8n中节点是自动化测试的核心,涵盖触发器、数据操作、逻辑控制和工具节点。通过组合节点,测试工程师可构建高效、智能的测试流程,提升测试自动化能力。
|
9月前
|
JSON JavaScript 测试技术
用Postman玩转电商API:一键测试+自动化请求教程
Postman 是电商 API 测试的高效工具,涵盖基础配置、自动化测试、环境管理与请求自动化,助你快速提升开发效率。
|
9月前
|
XML jenkins 机器人
JMeter+Ant+Jenkins实现接口自动化测试持续集成
本文介绍了如何使用Ant生成JMeter接口测试报告,并集成到Jenkins中实现自动化测试。内容涵盖Ant与JMeter环境配置、build.xml文件设置、测试执行及报告生成,同时包括Jenkins插件安装、项目配置和钉钉消息通知的集成,帮助实现持续测试与结果可视化。
1062 0
|
7月前
|
机器学习/深度学习 人工智能 测试技术
EdgeMark:嵌入式人工智能工具的自动化与基准测试系统——论文阅读
EdgeMark是一个面向嵌入式AI的自动化部署与基准测试系统,支持TensorFlow Lite Micro、Edge Impulse等主流工具,通过模块化架构实现模型生成、优化、转换与部署全流程自动化,并提供跨平台性能对比,助力开发者在资源受限设备上高效选择与部署AI模型。
613 9
EdgeMark:嵌入式人工智能工具的自动化与基准测试系统——论文阅读
|
6月前
|
弹性计算 人工智能 前端开发
在阿里云ECS上部署n8n自动化工作流:U2实例实战
本文介绍如何在阿里云ECS的u2i/u2a实例上部署开源工作流自动化平台n8n,利用Docker快速搭建并配置定时任务,实现如每日抓取MuleRun新AI Agent并推送通知等自动化流程。内容涵盖环境准备、安全组设置、实战案例与优化建议,助力高效构建低维护成本的自动化系统。
1520 5
|
7月前
|
自然语言处理 前端开发 测试技术
使用 Playwright MCP 实现 UI 自动化测试
本文介绍如何结合Playwright与MCP协议实现智能化UI自动化测试。通过自然语言指令控制浏览器,降低技术门槛,提升效率,并涵盖环境搭建、核心功能、实战案例及最佳实践,展现对话式自动化的未来趋势。