网页前端持续集成(2) - qunit+JSCoverage+PhantomJS使用小记

利用Jasmine编写的几个前端测试语句 利用Jasmine编写的几句前端测试语句,用于测试你编写的js是否能正常运行 立即下载

今年早些时候为公司项目做过一些网页前端程序的持续集成(CI),在过去的几个月中不断地给不同的人讲解过之后,我决定开一篇介绍一下。

公司项目是一个ASP.net的网站,其中核心是一些JavaScript 的框架库以及扩展函数。基本目标是在Jenkins上集成单元测试(Unit Test), 和代码覆盖率的统计。由于是前端程序,所以我们采用qunit来做单元测试,代码覆盖率使用JSCoverage(使用简介可移步helloworld)。不过CI需要的是后台自动运行各个步骤,怎么办?我们找到了一个很好用的工具PhantomJS, 它通过一个webkit浏览器内核,实现了后台隐式的打开网址或网页,可以极大的方便前端程序的测试。那么,怎么把这几样宝贝集成起来?这篇介绍的就是这样一个windows上的例子,把它做一遍,可以对这几项工具有基本的了解。

0. 环境搭建

下载qunit, JSCoverage, PhantomJS, ant(apache-ant)。除qunit外,把其余三项的bin目录添加到环境变量Path中去。

用到的压缩包下载地址会列在文末。其解压缩后的根目录列表如下,数目稍多因为把qunit, jscoverage,phantomjs的exe和一些默认配置辅助文件都放过来了,省得来回切换。

1. 定义待测试JavaScript 文件及函数

testme.js:

function add(){
    var sum =0;
    var count=0;
    for (var i=0; i<arguments.length; i++){   
        if(arguments[i] < 10){
            sum += arguments[i];
            count++;
        }
    }
    if(count < arguments.length){
        for (var i=0; i<arguments.length; i++){   
            if(arguments[i] >= 10){
                sum += arguments[i];   
            }
        }    
    }
    return sum;   
}
testme02.js:

function divide(){
	if(arguments.length == 0){
	    return 0;
        }
        if(arguments[0] == 0)
	    return 0;
	var quotient = arguments[0];   
        for (var i=1; i<arguments.length; i++){
            if(arguments[i] == 0){
                continue;
            }else{
	        quotient /= arguments[i];
            }
        }
    return quotient;   
} 

2. 编辑待测试网页
testme.test.html

<!DOCTYPE html>  
<html>  
<head>  
    <!-- we need QUnit as a test runner -->  
    <link rel="stylesheet" href="qunit.css" type="text/css" media="screen" />  
    <script src="qunit.js"></script>    
    <!-- we'd like to have the file we're going to test -->  
    <script src="testme.js"></script>
    <script src="testme02.js"></script>     
    <script src="test-support.js"></script>	
    <!-- and finally lets write some tests -->  
    <script>
		test("add(1, 2, 10, 9)", function(){
			equal(add(1, 2, 10, 9), 22);
		});		
		test("divide ()", function(){
			equal(divide(), 0);
		});
		test("divide (0, 1, 2)", function(){
			equal(divide(0, 1, 2), 0);
		});
		test("divide (10, 0, 5)", function(){
			equal(divide(10, 0, 5), 2);
		});
		test("add (int, divide())", function(){
			equal(add(1, divide(12, 3)), 5);
		});
    </script>
    <style>  
        .code {   
            white-space: pre;   
            font-family: courier new;   
            width: 100%;               
        }   
           
        .miss {   
            background-color: #FFFFFF;   
        }   
           
        .hit {   
            background-color: #94FF7C;   
        }   
           
        .undef {   
            background-color: #00FF9E;   
        }           
    </style>
</head>  
<body>  
     <h1 id="qunit-header">QUnit Tests</h1>  
     <h2 id="qunit-banner"></h2>  
     <div id="qunit-testrunner-toolbar"></div>  
     <h2 id="qunit-userAgent"></h2>  
     <ol id="qunit-tests"></ol>  
     <div id="qunit-fixture"></div>       
</body>  
</html>

其中写了5个测试用例,并加载了qunit.js

3.在build.xml中定义目录结构。

<project name="jsunittests" basedir="." default="main">  
    <property name="basedir" location="."/>
    <property name="builddir" location="${basedir}/target"/>
    <proerty name="jstestdir" location="${builddir}/testjs"/>
    <property name="jsdir" location="${jstestdir}/js"/>
    <property name="jsinstrumenteddir" location="${jstestdir}/jsinstrumented"/>
    <property name="testhtmdir" location="${builddir}/testhtm"/>
    <condition property="phantom.filename" value="phantomjs.bat"><os family="windows"/></condition>  	
    <property name="jscoverage.filename" value="jscoverage.bat"/>
...
</project>
$basedir 是当前目录,$jstestdir下的两个目录存放待测试js文件,其中\js是原始文件,\jsinstrumented是经过JSCoverage注入过锚标记的文件。$testhtmdir是测试用的HTML目录。
4.在build.xml中定义各项任务

任务clean是清空全部已有文件,prep是准备工作,把所有用到的文件拷贝到目标目录中去。

    <target name="clean">  
        <delete dir="${builddir}"/>  
    </target>     
    <target name="prep">  
        <mkdir dir="${builddir}"/>
        <mkdir dir="${jstestdir}"/>
        <mkdir dir="${jsdir}"/>
        <mkdir dir="${jsinstrumenteddir}"/>
        <mkdir dir="${testhtmdir}"/>
        <!--copy test source js files to target-->
        <copy todir="${jsdir}">   
            <fileset dir="${basedir}">   
                <include name="testme.js" />
		<include name="testme02.js" />
            </fileset>   
        </copy>       
	<!-- run jscoverage to produce a version of the file instrumented for code coverage -->   
        <exec executable="${jscoverage.filename}" failonerror="true">   
            <arg value="${jsdir}"/>   
            <arg value="${jsinstrumenteddir}"/>   
        </exec>   		
        <!-- copy our test htm files and modify them to point to the coverage indexed version of the test file. -->  		
        <copy todir="${testhtmdir}">   
            <fileset dir="${basedir}">   
                <include name="*.test.html" />   
            </fileset>   
        </copy>                 
        <!-- copy core resources to testhtmdir so we can load them with same paths as when executing test htm files directly -->  		 
        <copy todir="${testhtmdir}">   
            <fileset dir="${jsinstrumenteddir}">   
                <include name="**/*.js" />   
                <exclude name="jscoverage.js"/>   
            </fileset>   
        </copy>                  
        <copy todir="${testhtmdir}">   
            <fileset dir="${basedir}">   
                <include name="test-support.js" />   
                <include name="run-qunit.js" />   
                <include name="qunit.css" />   
                <include name="qunit.js" />
            </fileset>   
        </copy>  		    		
    </target>  
接下来,定义实际做测试的任务jstest。我们用PhantomJS打开一个HTML文件,这个html包含qunit文件,并调用已经带有JSCoverage标记的JS待测试函数。这样如果运行成功,我们可以得到测试例子的通过率和代码覆盖率。

    <target name="jstest">  
      <!--Run all tests via phantom, fail if tests fail. Execute all files with extension .test.htm. -->  
      <apply executable="${basedir}/${phantom.filename}" failonerror="true" dir="${testhtmdir}" relative="false">  
         <arg value="run-qunit.js"/>  
         <srcfile/>
         <!--arg[0]-->
	 <fileset dir="${testhtmdir}">  
             <include name="*.test.html" />  
         </fileset>
	 <!--argp[1]-->
	 <arg value="${basedir}"/>		 
      </apply>               
    </target> 
这里的run-qunit.js是PhantomJS的启动文件,它从中得知该从哪个网址/网页启动,导入后又该执行什么动作。之后的第一个参数是输入的网页文件,第二个参数是输出路径。

到目前为止,各项任务定义完毕,可以调用了。

    <target name="main" depends="clean, prep, jstest">  
    </target>  

5. 编辑jscoverage.bat

注意定义成本地的绝对路径。最后一行的末尾 %* 意思是接受后续的参数。

set JSCov_Dir=D:\Product\VEF-CI-ref\jsunit\
%JSCov_Dir%\jscoverage.exe %*

6. 编辑phantomjs.bat

set PhantomJS_Dir=D:\Product\VEF-CI-ref\jsunit\
%PhantomJS_Dir%/phantomjs.exe %*

7. 编辑run-qunit.js

这个文件告诉PhantomJS如何启动。最重要的是要定义onReady函数,在网页启动完成后执行。这里我们仅仅基于JSCoverage的各行执行次数,计算了总的文件覆盖率。

额外的还有test-support.js文件,定义了一些辅助函数。因这两文件较长,此处就不列了,文件细节可以在压缩包中找到。

8.执行ant

运行成功的输出如下,注意到这里两个文件的覆盖率均为100%。


9.检查输出网页

打开.\target\testhtm\testme.test.html,可以看到qunit的执行结果。


打开.\target\testhtm\testme.coverage.testme.js.html,能够看到以不同颜色标示的代码覆盖部分。怎么样?还算清楚吧:)有同学可能注意到了,这些颜色就是在testme.test.html中<style>部分定义的。


当然 testme.coverage.testme02.js.html也能带来同样的显示。

小结:

1. qunit+JSCoverage+PhantomJS 的组合能够满足前端程序对于持续集成的基本需要。对于目标程序,其开发语言限制较少,比如Java完全可以。

2. 如果想要集成到Jenkins的平台中,只需要将JSCoverage, PhantomJS等执行步骤单独设置成Jenkins的一个任务即可。

3. 如果想把相应的测试结果,代码覆盖率等输出到文件,可以编辑PhantomJS.exe 后紧跟的第一个文件,比如这里的run-qunit,js,在onReady()函数中加入你所需要的部分。

注:压缩包下载地址phantomjs-jscoverage.zip

第4章-上下文管理-对话历史记忆系统与窗口优化-《Agentic AI 智能体应用开发》 当上下文窗口接近极限时,需要对已有内容进行压缩。压缩不是简单的截断——你需要保留核心语义,去除冗余。# Python: 对话摘要压缩# 使用 Haiku 做摘要任务,成本最低"""将一段对话历史压缩为摘要"""system="你是一个对话摘要专家。请生成简洁但有信息量的摘要。",f"'用户' 阅读详情

相关推荐

ROS学习笔记之——无人机PID调参过程记录

For cooperaive inquiries, please visit the website:guanweipeng.com

gwpscut的博客 6828

【JS单元测试】Qunit 和 jsCoverage使用方法

近日在网上浏览过很多有关js单元测试相关的文档,工具,但是,针对Qunit 和 jsCoverage使用方法,缺少详细说明,对于初入前端的人来说,很难明白其中的意思,特此整理这篇文章,希望能够减少大家学习Qunit 和 jsCoverage使用方法的时间。 Qunit:js单元测试工具 jsCoverage: 显示单元测试覆盖率 参考资料:http://silico...

weixin_33831673的博客 177

ROS2与Gazebo协同实现多机器人避障仿真

本文详细介绍了如何利用ROS2与Gazebo协同搭建多机器人避障仿真环境。通过创建SDF机器人模型、编写多机器人启动文件以及集成基础避障算法,构建了一个低成本、高效率的虚拟测试平台,为AGV编队、机器人集群等项目的算法验证与迭代提供了完整解决方案。

weixin_29065659的博客 293

JavaScript 测试框架 ( QUnit , javascript code coverage , JSCoverage , Pavlov , Jasmine )

changelist: -------------------------------- 1.0 如何利用QUnit来进行javascript的TDD 1.1 添加javascript code coverage 添加Pavlov介绍,如果利用Qunit进行BDD -------------------------------- 现下有很多JavaScript的测试框架,比

weixu_2008的专栏 2297

Xtract or Ucfyber的最条理的整理入门级教程

XTRACT可以对任意截面进行全过程截面分析。工程中常用来分析各种截面(如异形柱、组合截面等)的非线性特征点及承载力校核。 xtract主要思路也是根据各种材料本构关系,基于平截面假定,用fiber划分截面进行全过程非线性分析。......

→★佐佑思维★← 8395

NSGA-Ⅱ算法:从原理到实战,解锁多目标优化难题

本文深入解析NSGA-Ⅱ算法在多目标优化中的应用,从原理到实战全面覆盖。通过快速非支配排序、精英策略和拥挤度比较三大创新,NSGA-Ⅱ有效解决了传统算法的效率与多样性问题。结合工业案例展示其在注塑工艺优化中的显著效果,为工程师提供实用解决方案。

weixin_29207149的博客 365

基于TFS的持续集成搭建流程

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、pandas是什么? 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、使用步骤 1.引入库 代码

Estelle的博客 1441

Python 3.13.7 (64-bit)安装弹窗提示:Setup failed:0x80070643 - 安装时发生严重错误...如何解决?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 2114

QUnit——对JavaScript 进行单元测试的利器

QUnit——对JavaScript 进行单元测试的利器 1.QUnit下的简单测试: 简单说明(本次框架采用的是QUnit-V2.0.0版本): 如上图:从左到右从上倒下一次说明如下: a.QUnit.module()是定义当前测试用例属于哪个模块下。注意:对于V1.0.0版本中不需要QUnit,对于V2.0.0中必须添加QUnit.开始。 b.QUnit.test

chr23899的专栏 2286

第42章:AI代码生成的质量标准——何时用AI、何时自己写

> - AI代码生成的质量分级标准:可用、稳定、安全、优雅 > - 一个决策矩阵:什么场景适合用AI,什么场景必须人工编写 > - 如何评估AI生成的代码质量(复杂度、可读性、安全性) > - 实战对比:同一需求下AI生成代码 vs 人工编写代码 > - 团队落地:将质量标准集成到Code Review和CI流程 > - 我如何将团队AI代码接受率从70%提升到90%

sfishfly的博客 161

Kubernetes 集群升级与备份恢复:从 1.24 到 1.30 的平滑升级实战

详解 Kubernetes 集群版本升级流程(kubeadm 方式),包括前置检查、组件逐个升级、节点排水与恢复,同时演示 etcd 备份与集群灾难恢复方案。

kaixin110a的博客 35

win7安装grunt-contrib-qunit

grunt-contrib-qunit是基于phantomjs .exe,所以会首先安装 phantomjs.exe,安装是使用npm上注册的模块phantomjs来安装的,该模块实现了下载,及解压提取phantomjs.exe安装包的功能,并返回了phantomjs.exe安装的绝对路径,phantomjs是安装在: phantomjs模块的当前路径 / lib / phantomjs / ph

crystalNB的专栏 1699

【漏洞复现】Apache Tomcat远程代码执行漏洞(CVE-2024-56337)

CVE-2024-56337是一个存在于Apache Tomcat中的TOCTOU(Time-of-Check Time-of-Use)竞争条件漏洞。此漏洞源于对先前漏洞(CVE-2024-50379)的不完整修复。若默认servlet是可写的(参数readonly设置值为false,该设置为非默认设置)表示不区分大小写文件系统,在负载下并发读取和上传同一文件可以绕过Tomcat的大小写检查。攻击者可以通过构造恶意请求上传含恶意JSP代码的文件,使其触发解析并执行这些文件,从而导致远程代码执行。

李同學AI安全 3195

QUnit介绍

QUnit QUnit是一个强大的JavaScript单元测试框架,用于调试代码。该框架是由jQuery团队的成员所开发,并且是jQuery的官方测试套件。任意正规JavaScript代码QUnit都能测试。  项目官网  文件下载地址  qunit-test-demo.zip: Demo程序 建立测试程序 建立html测试页面,引入 qunit.js 和 qunit.

army的专栏 2116

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Junit自动单元测试以及测试覆盖率简单使用

前言 众所周知,测试对于一个工程而言是至关重要的,而现在绝大多数团队都配有专门的测试人员来使用各种工具进行专业的测试,这里介绍的Junit的更多是作为开发同学在开发过程或最后提供自测的工具,使用起来非常方便,并且可以提供出测试覆盖率,以及具体没有覆盖的代码。 下面还是使用Idea做为演示IDE,使用Eclipse或者其他IDE的同学请自行搜索搭建方式,应该都是大同小异。 这里网上有很多详细的...

Roy_70的专栏 2万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

网页前端持续集成(1) - JSCoverage的使用简介

公司项目组使用jscoverage对被测试过的js文件作代码覆盖率检测。上一个tag的代码,jscoverage运行的好好的。到了新的tag,由于工程文件作了调整,js源代码文件所在路径改动较大,导致jscoverage页面上始终无法显示各个js文件的覆盖率。前两天我依照jscoverage文档的介绍,自己实现了一个小的demo,通过这个过程,搞清楚了jscoverage使用中的各文件之间相互关系

teaspring的技术专栏 3509

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

JSCoverage--> JavaScript 测试覆盖率检测工具(转)

原文链接.http://sourceforge.jp/projects/freshmeat_jscoverage/releases/ 最近在用 Jasmine 给 KISSY 项目添加测试代码,遇到一个困惑:如何保证测试能完整覆盖到源码的所有分支? 用 Google 搜索了下JavaScriptCoverage 工具,琳琅满目。有商业版的JavaSc...

weixin_30667649的博客 310

使用QUnit测试JavaScript

本章的主要内容:1.如何在项目中配置QUnit测试框架2.组织单元测试以提高覆盖率和可维护性3.QUnit中不同类型的测试4.确保有效测试的最佳实践5.QUnit之外的其他测试一:如何在项目中配置QUnit测试框架1.下载QUnit 可以在官方网站下载QUnit框架,地址:http://qunitjs.com/。网站上有稳定版和开发版可供下载。这两个版本除JavaScript文件之外,都包含一个用

pangliwang的博客 664

jsCoverage

JSCoverage是一个用于度量JavaScript程序的代码覆盖率的工具。 1.下载地址: http://siliconforks.com/jscoverage/

mochile的博客 634

测试函数JavaScript单元测试工具使用—QUnit

发一下牢骚和主题无关:     本文绝大部分来自于http://www.oncoding.cn/2010/javascript-unit-testing-qunit/,由于最新版的QUNIT更改了API接口,本文稍作修改。     QUnit是jQuery队团发开的JavaScript单元测试工具,应用方便,界面雅观。     什么是单元测试?     单元测试又称为模块测试,是针对序程模

love android 1003

JavaScript的测试覆盖率工具 - JSCoverage

JSCoverage是一个用于度量JavaScript程序的代码覆盖率的工具。能显示哪些行被执行过了,哪些行尚未执行,这些信息对于测试覆盖率的分析和测试质量的衡量都很有用。 JSCoverage通过度量Web页面使用的JavaScript代码,收集被Web浏览器执行的JavaScript代码信息来达到测试覆盖率统计的功能。 JSCoverage支持IE6、IE7、Firefox

软件质量优化 7249

单元测试既模块测试

javascript单位测试 Admin 2012年8月3日名人名言:从智慧的土壤中生出三片绿芽:好的思想,好的语言,好的行动。——希腊谚语 前端测试一向是困扰大师的一个困难,本文参考了能找到的一些牛博,列举了几种常见的javascript单位测试框架,迎接批驳领导。   1.      什么是单位测试 在策画机编程中,单位测试(又称为模块测试)是针对法度模块(

yangnuowei88的专栏 6607

前端里的持续集成

什么是持续集成,什么是统一代码仓库,前端工程化,自动化构建 持续集成 持续集成需求 持续集成式通过平台串联各个开发环节,实现和沉淀工作自动化的方法; 线上代码和代码仓库不同步,影响迭代和团队协作; 静态资源发布依赖人工,浪费开发人力; 缺少自动化测试, 产品质量得不到保障; 文件简单修改上线,需要技术介入 持续集成解决 统一代码厂库通过分支管理合并主干svn / ...

陈靖 2925

jscoverage 统计js代码覆盖率

我们以 cookie 模块为范例。命令行模式,在 cookie 的上级目录 src 下输入: jscoverage.exe cookie cookie_ --encoding=utf-8 --no-instrument=tests 运行后,就会生成 cookie_ 目录。原理是将需要检测的 js 文件重新编译,分析原始语句,并插入相应的监测代码。有兴趣的可以打开 cookie_/cookie

pangfeng134300的专栏 2660

QUnit(三)API文档及资料

1、开始写测试用例 QUnit.test( name, expected, test ) :一个常规的测试用例。测试用例名、期待断言数、测试内容(一般是一个function)。 QUnit.asyncTest( name, expected, test ) :一个异步测试用例。默认的test都是同步的。内容中必须显示地调用start(),测试才会开始。 QUnit.module( name,...

Yichair的博客 888

javascript 单元测试覆盖率工具,及Grunt集成

js单元测试Unit Test的工具包括Jasmine, Mocha, NodeUnit, JsTestDriver等。 以Jasmine最为流行,因为其良好的语义和丰富的Mocking机制。 无论使用Grunt.js或是Maven来作为项目构建工具,Jasmine都有良好的插件支持。 js单元测试其实并不为前端开发者重视,近年开始node.js以及单页面web app流行起来后,越

申导 www.JackyShen.com 2633
上一篇: 二分查找-两已排序数组中找中位数二题
下一篇: 判断回文整型数
teaspring
博客等级 码龄19年 350粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值