您好,登錄后才能下訂單哦!
最近研究了下jasmine框架,收益頗豐?;诠疽晃煌碌奈臋n,我這里列舉下jasmine框架的一些特征。
一:介紹
Jasmine框架是一個行為驅(qū)動的開發(fā)框架,用于測試javascript代碼,它不會依賴于任何其他的javascript框架,也不需要一個DOM,并且它有非常簡單和清晰的語法。
二:適用范圍
因為Jasmine框架不依賴瀏覽器,DOM,或者任何javascript框架,所以它特別適合單元測試網(wǎng)站,Node.js項目或者任何有javascript運行的項目。
小例子1:比如要測試是否真實值比期望值小
- beforeEach(function() {
- this.addMatchers({
- toBeLessThan: function(expected) {
- var actual = this.actual;
- var notText = this.isNot ? " not" : "";
- this.message = function () {
- return "Expected " + actual + notText + " to be less than " + expected;
- }
- return actual < expected;
- }
- });
- });
小例子2: 比如要測試Ajax或者其他異步的行為:
- var Klass = function () {
- };
- Klass.asyncMethod = function (callback) {
- someAsyncCall(callback);
- };
- ...
- it('should test async call', function () {
- spyOn(Klass, 'asyncMethod');
- var callback = jasmine.createSpy();
- Klass.asyncMethod(callback);
- expect(callback).not.toHaveBeenCalled();
- var someResponseData = 'foo';
- Klass.asyncMethod.mostRecentCall.args[0](someResponseData);
- expect(callback).toHaveBeenCalledWith(someResponseData);
- });
三:我們?yōu)槭裁催x擇Jasmine框架?
雖然在市面上有許多種類的js單元測試框架,比如TestSwarm, JsTestDriver,Buster.js,YUI Yeti,Sinon等,但是很多單元測試框架只支持和瀏覽器協(xié)同工作,有些單元測試框架無法支持異步回調(diào)代碼的測試。有些代碼,對于IDE很難理解,然而,Jasmine框架則是集各種框架優(yōu)點于一身的好框架。
四:Jasmine框架的優(yōu)秀設計原則:
(1)好的js單元測試框架不應該聯(lián)合到任何瀏覽器,框架,平臺或者宿主機器的語言設置。
(2)好的js單元測試框架應該有符合js語言習慣的語法。
(3)好的js單元測試框架應該在任何js可以運行的地方運行
(4)好的js單元測試框架應該對于被測試的應用是非侵入式的。
(5)好的js單元測試框架應該能和IDE很好融合,比如可以通過IDE的靜態(tài)代碼質(zhì)量檢查。
(6)好的js單元測試框架應該足夠簡單,并且容易上手。(這一點我深有體會,我看5分鐘就學會了,然后寫了第一個demo并且跑通了)
五:實踐
這里給出一個我前幾天實踐的例子,我利用jasmine來測試ext-js的代碼:
首先我們要建立單元測試的目錄結(jié)構(gòu),基于建立在test目錄之下,我們共需要2個目錄和一個文件。
目錄1: lib ---這個目錄是存放jasmine框架本身的代碼
目錄2: spec---這個目錄是存放所有的單元測試代碼
SpecRunner.html--這個文件用于配置整個jasmine單元測試框架,因為我們最簡單的應用只要把測試結(jié)果輸出到控制臺上,所以我們這里只配置了ConsoleReporter.
SpecRunner.html的代碼如下:
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <title>Jasmine Spec Runner</title>
- <link rel="shortcut icon" type="p_w_picpath/png" href="lib/jasmine-1.2.0/jasmine_favicon.png">
- <link rel="stylesheet" type="text/css" href="lib/jasmine-1.2.0/jasmine.css">
- <script type="text/javascript" src="lib/jasmine-1.2.0/jasmine.js"></script>
- <script type="text/javascript" src="lib/jasmine-1.2.0/jasmine-html.js"></script>
- <!-- include the ext-js library here -->
- <!-- load the ext framework work under root folder -->
- <script type="text/javascript" src="/html/js/ext-js/ext-all.js"></script>
- <!-- include the source files here which need to be tested -->
- <script type="text/javascript" src="../app/app.js"></script>
- <!-- include spec files here...they are test cases -->
- <script type="text/javascript" src="spec/ProjectFoundationVerification.js"></script>
- <script type="text/javascript">
- (function() {
- var jasminejasmineEnv = jasmine.getEnv();
- jasmineEnv.updateInterval = 1000;
- var htmlReporter = new jasmine.HtmlReporter();
- jasmineEnv.addReporter(htmlReporter);
- jasmineEnv.specFilter = function(spec) {
- return htmlReporter.specFilter(spec);
- };
- var currentWindowOnload = window.onload;
- window.onload = function() {
- if (currentWindowOnload) {
- currentWindowOnload();
- }
- execJasmine();
- };
- function execJasmine() {
- jasmineEnv.execute();
- }
- })();
- </script>
- </head>
- <body>
- </body>
從這段代碼我們不難看出,13-15行引入了jasmine框架,23行引入了ext-js庫,因為我們要測試ext-js代碼,29行是需要被我們測試的代碼,34行是單元測試代碼,也就是我們寫的測試用例,第40-59行則是創(chuàng)建一個HTMLReporter用于顯示,并且啟動jasmine框架。
我們寫了一個很簡單的測試用例,它用來判定ext-js庫的一些基本信息:
- /**
- * This file is used for verifying the project foundation
- */
- describe("Ext-js Basic Information", function() {
- //test whether ext-js has been loaded
- it(" Ext-js has been loaded", function() {
- expect(Ext).toBeDefined();
- });
- //test whether ext-js major version is 4
- it(" Ext-js has version ,and major version is 4" ,function(){
- expect(Ext.getVersion()).toBeTruthy();
- expect(Ext.getVersion().major).toEqual(4);
- });
- });
最終測試的結(jié)果,就是在瀏覽器上顯示了測試報告,綠條告訴我們測試用例都通過了:
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。