|
在开发的过程中,除了代码本身,测试也是重要的一环。大体来说,测试分为以下几种类型:
单元测试
功能测试
性能测试
安全测试
对于普通开发者而言,单元测试和功能测试是最常见的两种测试方式,本系列文章要介绍的几个工具是针对这两个方面的。
单元测试是对某一块独立的业务模块进行测试,可以是一个小功能,甚至一个函数。在前端开发中,我们可以选用 Karma进行代码的单元测试,这个工具十分强大,它集成了像Jasmine(基于BDD的测试框架),PhantomJS(无界面的浏览器)这些测试套件。还有一些其他有用的功能,比如生成代码覆盖率的报告等。
本文只介绍 Karma的基本使用。
单元测试工具Karma
要使用Karma对代码进行单元测试,首先需要安装一系列的相关插件。我们来新建一个名为myKarmDemo的目录,并安装相关的插件:
npminstallkarma-cli-g
npminstallkarmajasmine-corekarma-jasminekarma-phantomjs-launcher-D
接下来对我们的工程进行初始化:
karmainit
之后会弹出一些选项,其中包含了一些初始化的配置工作,使用上下方向键可以在配置项之间进行切换。我这里选择使用 Jasmine测试框架,使用PhantomJS无界面浏览器,整体的配置选项如下:
- myKarmDemokarmainit
- Whichtestingframeworkdoyouwanttouse?
- Presstabtolistpossibleoptions.Entertomovetothenextquestion.
- >jasmine
- DoyouwanttouseRequire.js?
- ThiswilladdRequire.jsplugin.
- Presstabtolistpossibleoptions.Entertomovetothenextquestion.
- >no
- Doyouwanttocaptureanybrowsersautomatically?
- Presstabtolistpossibleoptions.Enteremptystringtomovetothenextquestion.
- >PhantomJS
- Whatisthelocationofyoursourceandtestfiles?
- Youcanuseglobpatterns,eg."js/*.js"or"test/**/*Spec.js".
- Enteremptystringtomovetothenextquestion.
- >
- Shouldanyofthefilesincludedbythepreviouspatternsbeexcluded?
- Youcanuseglobpatterns,eg."**/*.swp".
- Enteremptystringtomovetothenextquestion.
- >
- DoyouwantKarmatowatchallthefilesandrunthetestsonchange?
- Presstabtolistpossibleoptions.
- >no
- Configfilegeneratedat"/home/charley/Desktop/myKarmDemo/karma.conf.js".
- 初始化完成之后,会在我们的项目中生成一个 karma.conf.js文件,这个文件就是Karma的配置文件。
- 配置文件比较简单,能够比较轻松的看懂,这里我对原始的配置文件进行简单的修改,结果如下:
- //Karmaconfiguration
- //GeneratedonSunOct29201721:45:27GMT+0800(CST)
- module.exports=function(config){
- config.set({
- //basepaththatwillbeusedtoresolveallpatterns(eg.files,exclude)
- basePath:'',
- //frameworkstouse
- //availableframeworks:https://npmjs.org/browse/keyword/karma-adapter
- frameworks:['jasmine'],
- //listoffiles/patternstoloadinthebrowser
- files:[
- "./src/**/*.js",
- "./test/**/*.spec.js",
- ],
- //listoffilestoexclude
- exclude:[
- ],
- //preprocessmatchingfilesbeforeservingthemtothebrowser
- //availablepreprocessors:https://npmjs.org/browse/keyword/karma-preprocessor
- preprocessors:{
- },
- //testresultsreportertouse
- //possiblevalues:'dots','progress'
- //availablereporters:https://npmjs.org/browse/keyword/karma-reporter
- reporters:['progress'],
- //webserverport
- port:9876,
- //enable/disablecolorsintheoutput(reportersandlogs)
- colors:true,
- //leveloflogging
- //possiblevalues:config.LOG_DISABLE||config.LOG_ERROR||config.LOG_WARN||config.LOG_INFO||config.LOG_DEBUG
- logLevel:config.LOG_INFO,
- //enable/disablewatchingfileandexecutingtestswheneveranyfilechanges
- autoWatch:false,
- //startthesebrowsers
- //availablebrowserlaunchers:https://npmjs.org/browse/keyword/karma-launcher
- browsers:['PhantomJS'],
- //ContinuousIntegrationmode
- //iftrue,Karmacapturesbrowsers,runsthetestsandexits
- singleRun:true,
- //Concurrencylevel
- //howmanybrowsershouldbestartedsimultaneous
- concurrency:Infinity
- })
- }
- 然后创建一个 src目录和一个test目录,在其中分别创建index.js和index.spec.js文件。
- 我要做的测试内容比较简单,对 index.js中的两个函数(一个加法函数,一个乘法函数)进行测试。
- index.js文件如下:
- //加法函数
- functionadd(x){
- returnfunction(y){
- returnx+y;
- }
- }
- //乘法函数
- functionmulti(x){
- returnfunction(y){
- returnx*y+1;
- }
- }
- index.spec.js文件如下:
- describe("运算功能单元测试",function(){
- it("加法函数测试",function(){
- varadd5=add(5)
- expect(add5(5)).toBe(10)
- });
- it("乘法函数测试",function(){
- varmulti5=multi(5)
- expect(multi5(5)).toBe(25)
- })
- })
- 单测的代码写好后,就可以使用 karmastart来运行单元测试。由于我们的乘法代码中有错误,因此测试结果是这样的:
- myKarmDemokarmastart
- 2910201722:21:56.283:INFO[karma]:Karmav1.7.1serverstartedathttp://0.0.0.0:9876/
- 2910201722:21:56.287:INFO[launcher]:LaunchingbrowserPhantomJSwithunlimitedconcurrency
- 2910201722:21:56.294:INFO[launcher]:StartingbrowserPhantomJS
- 2910201722:21:56.549:INFO[PhantomJS2.1.1(Linux0.0.0)]:Connectedonsocket0h6boaepSUMwG7l2AAAAwithid44948955
- PhantomJS2.1.1(Linux0.0.0)运算功能单元测试乘法函数测试FAILED
- Expected26tobe25.
- test/index.spec.js:9:31
- PhantomJS2.1.1(Linux0.0.0):Executed2of2(1FAILED)(0.048secs/0.002secs)
- 将乘法函数的代码改为正常,再次启用 karmastart进行测试:
- 2910201722:23:08.670:INFO[karma]:Karmav1.7.1serverstartedathttp://0.0.0.0:9876/
- 2910201722:23:08.673:INFO[launcher]:LaunchingbrowserPhantomJSwithunlimitedconcurrency
- 2910201722:23:08.685:INFO[launcher]:StartingbrowserPhantomJS
- 2910201722:23:08.940:INFO[PhantomJS2.1.1(Linux0.0.0)]:Connectedonsocketpl_pZDcAK4rBTpr0AAAAwithid40770640
- PhantomJS2.1.1(Linux0.0.0):Executed2of2SUCCESS(0.045secs/0.001secs)
-
复制代码 对了,如果使用PhantomJS作为代码的运行环境,其对于ES6的支持性不是太好,我在代码中使用了箭头函数,在运行时就报错了。为了解决这个问题,你可以使用Chrome或其他浏览器进行测试,也需要安装相应的launcher,如果你使用Chrome浏览器测试,需要安装karma-chrome-launcher插件。
或者,你可以使用Babel等工具对代码进行转码后进行测试。
使用PhantomJS的好处在于其是一个无界面的浏览器运行环境,可以跑在命令行环境中,在某些没有Chrome等浏览器服务器环境下比较好用,方便代码验收和集成。
对于Karma的介绍就到这里了,本文只是对Karma的安装和使用进行了简单的介绍,权当抛砖引玉,至于更多的用法,您可以再进行研究。
|
|