Angular單元測試系列-簡介

本文將探討如何搭建測試環(huán)境喷好、以及Angular測試工具集卧抗。

測試環(huán)境

絕大部分都是利用Angular Cli來創(chuàng)建項目,因此底燎,默認(rèn)已經(jīng)集成我們所需要的npm包與腳本刃榨;當(dāng)然,如果你是使用自建或官網(wǎng) quickstart 的話双仍,需要自行安裝枢希;但所有核心數(shù)據(jù)全都是一樣的。

Angular單元測試我們可以將其分成兩類:獨立單獨測試與Angular測試工具集朱沃。

Pipe與Service適為獨立單獨測試晴玖,因為它們只需要 new 實例類即可;同樣是無法與Angular組件進(jìn)行任何交互。

與之相反就是Angular測試工具集呕屎。

測試框架介紹

Jasmine

Jasmine測試框架提供了編寫測試腳本的工具集让簿,而且非常優(yōu)秀的語義化,讓測試代碼看起來像是在讀一段話秀睛。

Karma

有測試腳本尔当,還需要Karma來幫忙管理這些腳本,以便于在瀏覽器中運行蹂安。

Npm 包

如果你非要折騰椭迎,那么最簡單的辦法便是通過Angular Cli創(chuàng)建一個新項目,然后將以下Npm包復(fù)制到您折騰的項目中田盈。

    "jasmine-core": "~2.5.2",
    "jasmine-spec-reporter": "~3.2.0",
    "karma": "~1.4.1",
    "karma-chrome-launcher": "~2.1.1",
    "karma-cli": "~1.0.1",
    "karma-jasmine": "~1.1.0",
    "karma-jasmine-html-reporter": "^0.2.2",
    "karma-coverage-istanbul-reporter": "^0.2.0"

那么畜号,我們重要還是看配置腳本部分。

配置腳本

我們核心是需要讓 karma 運行器運行起來允瞧,而對于 Jasmine简软,是在我們編寫測試腳本時才會使用到,因此述暂,暫時無須過度關(guān)心痹升。

我們需要在根目錄創(chuàng)建 karma.conf.js 文件,這相當(dāng)于一些約定畦韭。文件是為了告知karma需要啟用哪些插件疼蛾、加載哪些測試腳本、需要哪些測試瀏覽器環(huán)境艺配、測試報告通知方式察郁、日志等等。

karma.conf.js

以下是Angular Cli默認(rèn)提供的 karma 配置文件:

// Karma configuration file, see link for more information
// https://karma-runner.github.io/0.13/config/configuration-file.html

module.exports = function(config) {
    config.set({
        // 基礎(chǔ)路徑(適用file转唉、exclude屬性)
        basePath: '',
        // 測試框架皮钠,@angular/cli 指Angular測試工具集
        frameworks: ['jasmine', '@angular/cli'],
        // 加載插件清單
        plugins: [
            require('karma-jasmine'),
            require('karma-chrome-launcher'),
            require('karma-jasmine-html-reporter'),
            require('karma-coverage-istanbul-reporter'),
            require('@angular/cli/plugins/karma')
        ],
        client: {
            // 當(dāng)測試運行完成后是否清除上文
            clearContext: false // leave Jasmine Spec Runner output visible in browser
        },
        // 哪些文件需要被瀏覽器加載,后面會專門介紹  `test.ts`
        files: [
            { pattern: './src/test.ts', watched: false }
        ],
        // 允許文件到達(dá)瀏覽器之前進(jìn)行一些預(yù)處理操作
        // 非常豐富的預(yù)處理器:https://www.npmjs.com/browse/keyword/karma-preprocessor
        preprocessors: {
            './src/test.ts': ['@angular/cli']
        },
        // 指定請求文件MIME類型
        mime: {
            'text/x-typescript': ['ts', 'tsx']
        },
        // 插件【karma-coverage-istanbul-reporter】的配置項
        coverageIstanbulReporter: {
            // 覆蓋率報告方式
            reports: ['html', 'lcovonly'],
            fixWebpackSourcePaths: true
        },
        // 指定angular cli環(huán)境
        angularCli: {
            environment: 'dev'
        },
        // 測試結(jié)果報告方式
        reporters: config.angularCli && config.angularCli.codeCoverage ?
            ['progress', 'coverage-istanbul'] :
            ['progress', 'kjhtml'],
        port: 9876,
        colors: true,
        // 日志等級
        logLevel: config.LOG_INFO,
        // 是否監(jiān)聽測試文件
        autoWatch: true,
        // 測試瀏覽器列表
        browsers: ['Chrome'],
        // 持續(xù)集成模式酝掩,true:表示瀏覽器執(zhí)行測試后退出
        singleRun: false
    });
};

以上配置基本上可以滿足我們的需求鳞芙;一般需要變動的眷柔,我想是測試瀏覽器列表了期虾,因為karma支持所有市面上的瀏覽器。另外驯嘱,當(dāng)你使用 Travis CI 持續(xù)集成時镶苞,啟動一個禁用沙箱環(huán)境Chrome瀏覽器會讓我們少了很多事:

        customLaunchers: {
            Chrome_travis_ci: {
                base: 'Chrome',
                flags: ['--no-sandbox']
            }
        }

有關(guān)karma config文件的所有信息,請參與官網(wǎng)文檔鞠评。

test.ts

在編寫 karma.conf.js 時茂蚓,我們配置過瀏覽器加載的文件指向的是 ./src/test.ts 文件。作用是為了引導(dǎo) karma 啟動,代碼也簡單許多:

// This file is required by karma.conf.js and loads recursively all the .spec and framework files

import 'zone.js/dist/long-stack-trace-zone';
import 'zone.js/dist/proxy.js';
import 'zone.js/dist/sync-test';
import 'zone.js/dist/jasmine-patch';
import 'zone.js/dist/async-test';
import 'zone.js/dist/fake-async-test';
import { getTestBed } from '@angular/core/testing';
import {
  BrowserDynamicTestingModule,
  platformBrowserDynamicTesting
} from '@angular/platform-browser-dynamic/testing';

// Unfortunately there's no typing for the `__karma__` variable. Just declare it as any.
declare var __karma__: any;
declare var require: any;

// Prevent Karma from running prematurely.
__karma__.loaded = function () {};

// First, initialize the Angular testing environment.
getTestBed().initTestEnvironment(
  BrowserDynamicTestingModule,
  platformBrowserDynamicTesting()
);
// Then we find all the tests.
// 所有.spec.ts文件
const context = require.context('./', true, /\.spec\.ts$/);
// And load the modules.
context.keys().map(context);
// Finally, start Karma to run the tests.
__karma__.start();

一切就緒后聋涨,我們可以嘗試啟動 karma 試一下晾浴,哪怕無任何測試代碼,也是可以運行的牍白。

如果是Angular Cli那么 ng test脊凰。折騰的用 node "./node_modules/karma-cli/bin/karma" start

最后,打開瀏覽器:http://localhost:9876茂腥,可以查看測試報告狸涌。

簡單示例

既然環(huán)境搭好,那么我們來寫個簡單示例試一下最岗。

創(chuàng)建 ./src/demo.spec.ts 文件帕胆。.spec.ts為后綴這是一個約定,遵守它般渡。

describe('demo test', () => {
    it('should be true', () => {
        expect(true).toBe(true);
    })
});

運行 ng test 后懒豹,我們可以在控制臺看到:

Chrome 58.0.3029 (Windows 10 0.0.0): Executed 1 of 1 SUCCESS (0.031 secs / 0.002 secs)

或者瀏覽器:

1 spec, 0 failures
demo test
  true is true

DEBUG

Karma 運行后打開的頁面的右上角有一個【DEBUG】,會打開另一個頁面诊杆,此時歼捐,如果你打開 DevTools (chrome快捷鍵:Ctrl+Shift+I),當(dāng)你重新刷新頁面后晨汹,遇到 debugger; 時會進(jìn)入斷點狀態(tài)豹储。

不管怎么樣,畢竟我們已經(jīng)進(jìn)入Angular單元測試的世界了淘这。

Angular測試工具集

普通類諸如Pipe或Service剥扣,只需要通過簡單的 new 創(chuàng)建實例。而對于指令铝穷、組件而言钠怯,需要一定的環(huán)境。這是因為Angular的模塊概念曙聂,要想組件能運行晦炊,首先得有一個 @NgModule 定義。

工具集的信息量并不很多宁脊,你很容易可以掌握它断国。下面我簡略說明幾個最常用的:

TestBed

TestBed 就是Angular測試工具集提供的用于構(gòu)建一個 @NgModule 測試環(huán)境模塊。當(dāng)然有了模塊榆苞,還需要利用 TestBed.createComponent 創(chuàng)建一個用于測試目標(biāo)組件的測試組件稳衬。

異步

Angular到處都是異步,而異步測試可以利用工具集中 async坐漏、fakeAsync 編寫優(yōu)雅測試代碼看著是同步薄疚。

工具集還有更多碧信,這一切我們將在Angular單元測試-組件與指令單元測試逐一說明。

那么下一篇街夭,我們將介紹如何使用Jasmine進(jìn)行Angular單元測試砰碴。

happy coding!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市板丽,隨后出現(xiàn)的幾起案子衣式,更是在濱河造成了極大的恐慌,老刑警劉巖檐什,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碴卧,死亡現(xiàn)場離奇詭異,居然都是意外死亡乃正,警方通過查閱死者的電腦和手機(jī)住册,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瓮具,“玉大人荧飞,你說我怎么就攤上這事∶常” “怎么了叹阔?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長传睹。 經(jīng)常有香客問我耳幢,道長,這世上最難降的妖魔是什么欧啤? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任睛藻,我火速辦了婚禮,結(jié)果婚禮上邢隧,老公的妹妹穿的比我還像新娘店印。我一直安慰自己,他們只是感情好倒慧,可當(dāng)我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布按摘。 她就那樣靜靜地躺著,像睡著了一般纫谅。 火紅的嫁衣襯著肌膚如雪炫贤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天系宜,我揣著相機(jī)與錄音照激,去河邊找鬼发魄。 笑死盹牧,一個胖子當(dāng)著我的面吹牛俩垃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播汰寓,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼口柳,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了有滑?” 一聲冷哼從身側(cè)響起跃闹,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎毛好,沒想到半個月后望艺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡肌访,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年找默,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吼驶。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡惩激,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蟹演,到底是詐尸還是另有隱情风钻,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布酒请,位于F島的核電站骡技,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏羞反。R本人自食惡果不足惜哮兰,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望苟弛。 院中可真熱鬧喝滞,春花似錦、人聲如沸膏秫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缤削。三九已至窘哈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間亭敢,已是汗流浹背滚婉。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留帅刀,地道東北人让腹。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓远剩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親骇窍。 傳聞我的和親對象是個殘疾皇子瓜晤,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,947評論 2 355

推薦閱讀更多精彩內(nèi)容