angularjs中的e2e測試實例
在上一篇文章里有講到ng的單元測試,今天來說說e2e(端對端)測試.
當(dāng)我們測試某個模塊的單個功能點時,單元測試最適合,不過當(dāng)面臨用戶進(jìn)行多個頁面交互的時候產(chǎn)生bug了,單元測試就不行了,這時候就得用e2e來模擬用戶操作還原問題現(xiàn)場.當(dāng)然利用e2e測試也能夠測試程序的健壯性,很多單元測試辦不到的事情,e2e測試都能夠辦到.
之前,ng是利用Angular Scenario Runner來運行e2e測試,現(xiàn)在已經(jīng)換成Protractor來跑e2e了.
Protractor
Protractor是Angularjs里用來測試e2e的框架,它本身是一個npm模塊,內(nèi)部是構(gòu)建在WebDriverJS之上的,Protractor能夠真正讓你的測試用例運行在瀏覽器上,完全模擬用戶的真實行為.
下面貼上它的一些資源地址:
1.Protractor提供的測試api
2.Protractor簡單使用例子
3.WebDriverJs指南,這是Protractor依賴的核心,npm模塊名為selenium-webdriver
Protractor運行原理
Protractor運行e2e測試所依賴的主要有以下幾個東西:
1.WebDriver APIs,就是上面提到的WebDriverJs,是由Selenium提供給前端測試用的相關(guān)js api
2.Selenium Server,一個后端jar包,用來負(fù)責(zé)跟瀏覽器驅(qū)動進(jìn)行通訊用的
3.WebDriver browser drivers,用來顯示真實網(wǎng)站內(nèi)容并與Selenium Server通訊用,這里才是傳遞真實瀏覽器操作的地方
整個運行過程如下圖

想了解更多關(guān)于這幾個組件之前交互的可以點擊這里
利用ng種子項目來講解e2e
我們利用ng官方提供的種子項目來講解一個真實的e2e例子,首先利用下面命令獲取種子項目
git clone https://github.com/angular/angular-seed.git
然后運行
npm install
安裝相關(guān)的所有依賴文件
這里先說下運行e2e測試需要的配置文件,可以看到test/protractor-conf.js這個文件就是用來配置相關(guān)功能的,重點說下幾個屬性
1.specs 代表要運行的測試文件路徑,這里寫的是e2e/*.js
2.baseUrl 代表測試文件中瀏覽器間跳轉(zhuǎn)頁面的根地址
3.capabilities 代表使用哪個瀏覽器來運行測試用例,比如使用chrome,可以這樣設(shè)置
capabilities: {
'browserName': 'chrome'
}
framework 代表使用的哪種測試框架,這里使用的是jasmine
想了解更多關(guān)于這個配置文件的可以點擊這里查看
說完了配置文件,我們再來看看測試用例的寫法,先貼上一個官網(wǎng)上的例子
'use strict';
/* https://github.com/angular/protractor/blob/master/docs/getting-started.md */
describe('my app', function() {
browser.get('index.html');
it('should automatically redirect to /view1 when location hash/fragment is empty', function() {
expect(browser.getLocationAbsUrl()).toMatch("/view1");
});
describe('view1', function() {
beforeEach(function() {
browser.get('index.html#/view1');
});
it('should render view1 when user navigates to /view1', function() {
expect(element.all(by.css('[ng-view] p')).first().getText()).
toMatch(/partial for view 1/);
});
});
describe('view2', function() {
beforeEach(function() {
browser.get('index.html#/view2');
});
it('should render view2 when user navigates to /view2', function() {
expect(element.all(by.css('[ng-view] p')).first().getText()).
toMatch(/partial for view 2/);
});
});
});
首先上面的語法是jasmine框架支持的寫法,不了解它的用法的可以點擊這里
這里只說下上面例子里關(guān)于protractor提供的一些常用方法與屬性
1.browser,全局對象,代表當(dāng)前瀏覽器的一個實例,常用的get方法用來實現(xiàn)瀏覽器改變地址
2.element,全局對象,提供像jquery里負(fù)責(zé)查找文檔元素的功能,常于by對象聯(lián)合使用
3.by, 全局對象,提供一個選擇器類型,比如可以通過css,model,bind等特性來查找一個元素
關(guān)于element與by的方法可以參考上面的protractor api文檔
說了這么多,該跑一跑上面的測試用例了,命令比較簡單
npm run update-webdriver
這個負(fù)責(zé)下載相關(guān)的瀏覽器驅(qū)動與selenium-server 本地jar包,一般情況下這個都是會失敗的,因為這兩個資源都在google服務(wù)器那,所以可以利用瀏覽器翻墻單獨下載,地址如下:
1.Chrome Driver地址,一般下載chromedriver_2.9.zip這個文件.
2.selenium-server 本地jar包 下載,一般下載selenium-server-standalone-2.40.0.jar這個文件.
然后把selenium-server拷到protractor包里的selenium文件夾里去,假如上面的命令超時之后,這里也會出現(xiàn)文件不過是空的,直接替換就可以;還要把chromedriver_2.9.zip解壓之后的文件拷到這里
最后運行下面的命令可以看到測試結(jié)果了
npm run protractor
想了解更多關(guān)于ng種子項目里的命令行,可以點擊這里查看
總結(jié)
ng的e2e測試要比單元測試配置要繁瑣的多,不過它能做的事情也很多,非常值的你也試一試,有什么問題可以回復(fù)到評論里去.
相關(guān)文章
angular中實現(xiàn)控制器之間傳遞參數(shù)的方式
本篇文章主要介紹了angular中實現(xiàn)控制器之間傳遞參數(shù)的方式,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-04-04
AngularJS中控制器函數(shù)的定義與使用方法示例
這篇文章主要介紹了AngularJS中控制器函數(shù)的定義與使用方法,結(jié)合具體實例形式分析了AngularJS控制器函數(shù)的定義、綁定及相關(guān)使用技巧,需要的朋友可以參考下2017-10-10
AngularJS對動態(tài)增加的DOM實現(xiàn)ng-keyup事件示例
這篇文章主要介紹了AngularJS對動態(tài)增加的DOM實現(xiàn)ng-keyup事件示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03
AngularJS基礎(chǔ) ng-mouseenter 指令示例代碼
本文主要介紹AngularJS ng-mouseenter 指令,這里對ng-mouseenter 指令基礎(chǔ)資料做了詳細(xì)整理,并附代碼實例,有需要的小伙伴可以參考下2016-08-08
Angular 2.x學(xué)習(xí)教程之結(jié)構(gòu)指令詳解
結(jié)構(gòu)指令通過添加和刪除 DOM 元素來更改 DOM 布局。Angular 中兩個常見的結(jié)構(gòu)指令是 *ngIf 和 *ngFor,下面這篇文章主要給大家介紹了關(guān)于Angular 2.x結(jié)構(gòu)指令的相關(guān)資料,需要的朋友可以參考下。2017-05-05

