Jasmine 单元测试框架——学习

JavaScript 单元测试框架:Jasmine

Jasmine是一个用来编写Javascript测试的框架,它不依赖于任何其它的javascript框架。

jasmine 基本结构:

describe('当前测试内容的标题/描述',()=>{
    let num :number;
    beforeEach(() => {
        // 每个`it`执行前执行
        num = 0;
        num +=1;
    });

    afterEach(() => {
        // 每个`it`执行后执行
        num = 0;
    });

    it('该测试用例要检查的内容的文本描述', () => {
        expect(true).toBe(true);
    })
})

每个测试都在一组测试集中运行, Suite就是一个测试集,用 describe函数封装; Spec表示每个测试用例; 用it函数封装; 通过expect函数,作为程序断言来判断相等关系。setup过程用beforeEach
函数封装; tearDown过程用afterEach封装。

基本概念

Suites

Suites可以理解为一组测试用例(测试集),使用全局的Jasmine函数describe创建。describe函数接受两个参数,一个字符串和一个函数。字符串是这个Suites的名字或标题(通常用来描述测试内容),函数是Suites的代码块。

Specs

Specs可以理解为测试用例,使用全局的Jasmine函数it创建。和describe一样接受两个参数,一个字符串和一个函数,函数就是要执行的测试代码,字符串就是测试用例的名字。一个Spec可以包含多个expectations来测试代码。

Jasmine中的每个expectation是一个断言,可以是true或者false。当每个spec中的所有 expectation都是true,则通过测试。有任何一个expectationfalse都不通过测试。

Expectations

Expectations由expect函数创建。接受一个参数,和Matcher一起联用,设置测试的预期值。

在一个分组(describe)中可以写多个实测用例(it),也可以写多个分组(describe), 在测试用例(it)中定义期望表达式expect和匹配判断(toBe**)。

Matchers

Matcher实现一个 "期望值" 与 "实际值" 的对比,如果为true, 则通过测试, 反之则失败。每一个matcher都可以通过not执行是否判断。

Global

Methods

describe

describeJasmine的全局函数, 作为一个Test Suite的开始,有两个参数:1. 字符串(作为特定的Suite的名字和标题) 2. 方法(实现Suite的代码)。

beforeEach

在当前测试集describe中的 每个 测试用例it执行前运行的函数
beforeEach(function,timeout)
function: 可选
timeout: 可选, 定义超时时间。

afterEach

在当前测试集describe中的 每个 测试用例it执行后运行的函数
afterEach(function, timeout)
function: 可选
timeout: 可选, 定义超时时间。

beforeAll

在当前测试集describe中的 所有 测试用例it执行前运行的函数
beforeAll(function, timeout)
function: 可选
timeout: 可选, 定义超时时间。

afterAll

在当前测试集describe中的 所有 测试用例it执行后运行的函数
afterAll(function, timeout)
function: 可选
timeout: 可选, 定义超时时间。

expect

expect(actual)
spec创建一个期望值

Parameters
actual: Object, 测试预期的实际值

Returns
matchers

it

定义一个spec。一个测试用例应该包含一个或者多个测试代码状态的expectations
所有的expectations成功才会通过, 有一个失败就失败。
it(description, testFunction, timeout)
Parameters

参数 类型 属性 默认值 描述
description string 该测试用例要检查的内容的文本描述
testFunction 可选 包含测试代码的函数。如果没有提供,测试将被挂起pending
timeout number 可选 jasmine.DEFAULT_TIMEOUT_INTERVAL 超时时间

Matchers

 interface Matchers<T> {
    /**
     * toBe: 真实的值和期待的值的 '===' 比较
     * @param expected - 期望值
     * @param expectationFailOutput
     * @example
     * expect(thing).toBe(realThing); 
     */
    toBe(expected: any, expectationFailOutput?: any): Promise<void>;
    /**
     * toEqual: 支持 object 的深度对比, (功能 > toBe )
     * @param expected - 期望值
     * @param expectationFailOutput
     * @example
     * expect(bigObject).toEqual({ "foo": ['bar', 'baz'] });
     */
    toEqual(expected: any, expectationFailOutput?: any): Promise<void>;
    /**
     * toMatch: 通过正则表达式比较
     * @param expected - 期望值
     * @param expectationFailOutput
     * @example
     * expect("my string").toMatch(/string$/);
     * expect("other string").toMatch("her");
     */
    toMatch(expected: string | RegExp | Promise<string | RegExp>, expectationFailOutput?: any): Promise<void>;
    /**
     * toBeDefined: 判断是否定义,非 `undefined`
     * @example
     * var a = undefined;
     * var b = '';
     * var c = null;
     * expect(a).toBeDefined(); // Error
     * expect(b).toBeDefined(); // Ok
     * expect(c).toBeDefined(); // Ok
     */
    toBeDefined(expectationFailOutput?: any): Promise<void>;
    /**
     * toBeUndefined: 值为 `undefined`
     * 与 toBeDefined 相反
     */
    toBeUndefined(expectationFailOutput?: any): Promise<void>;
    /**
     * toBeNull: 值为 `null`
     */
    toBeNull(expectationFailOutput?: any): Promise<void>;
    /**
     * toBeNaN: 值为 `NaN`
     */
    toBeNaN(): Promise<void>;
    /**
     * toBeTruthy: 是否是真实有效的值(非 空字符串,undefined,null)
     */
    toBeTruthy(expectationFailOutput?: any): Promise<void>;
    /**
     * toBeFalsy: 判断是否是false
     * @example
     * expect(result).toBeFalsy();
     */
    toBeFalsy(expectationFailOutput?: any): Promise<void>;
    /**
     * toHaveBeenCalled: 判断函数是否被调用
     * @example
     */
    toHaveBeenCalled(): Promise<void>;
    /**
     * toHaveBeenCalledWith: 函数被调用时的参数
     * @example
     */
    toHaveBeenCalledWith(...params: any[]): Promise<void>;
    /**
     * toHaveBeenCalledTimes: 函数被调用的次数
     * @example
     */
    toHaveBeenCalledTimes(expected: number | Promise<number>): Promise<void>;
    /**
     * toContain: 判断是否含有指定值
     * @example
     * expect(array).toContain(anElement);
     * expect(string).toContain(substring);
     */
    toContain(expected: any, expectationFailOutput?: any): Promise<void>;
    /**
     * toBeLessThan: 小于
     * @example
     * var num = 2;
     * expect(num).toBeLessThan(2); // Error: Expected 2 to be less than 2.
     * expect(num).toBeLessThan(3); // Ok
     */
    toBeLessThan(expected: number | Promise<number>, expectationFailOutput?: any): Promise<void>;
    /**
     * toBeLessThanOrEqual: 小于等于
     */
    toBeLessThanOrEqual(expected: number | Promise<number>, expectationFailOutput?: any): Promise<void>;
    /**
     * toBeGreaterThan: 大于
     */
    toBeGreaterThan(expected: number | Promise<number>, expectationFailOutput?: any): Promise<void>;
    /**
     * toBeGreaterThanOrEqual: 大于等于
     */
    toBeGreaterThanOrEqual(expected: number | Promise<number>, expectationFailOutput?: any): Promise<void>;
    /**
     * toBeCloseTo: 判断是否相似
     * @expected 预期值
     * @precision 精度
     * @example
     * var num = 1.01
     * expect(num).toBeCloseTo(1); // OK
     * expect(num).toBeCloseTo(1, 1); // OK
     * expect(num).toBeCloseTo(1, 2); // Error: Expected 1.01 to be close to 1, 2.
     */
    toBeCloseTo(expected: number | Promise<number>, precision?: any, expectationFailOutput?: any): Promise<void>;
    toThrow(expected?: any): Promise<void>;
    toThrowError(message?: string | RegExp | Promise<string | RegExp>): Promise<void>;
    toThrowError(expected?: new (...args: any[]) => Error | Promise<new (...args: any[]) => Error>, message?: string | RegExp | Promise<string | RegExp>): Promise<void>;
  }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 225,448评论 6 524
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,648评论 3 406
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 172,816评论 0 370
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 61,288评论 1 304
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 70,294评论 6 401
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,739评论 1 316
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 42,076评论 3 431
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 41,071评论 0 280
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,632评论 1 327
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,637评论 3 347
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,755评论 1 355
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,344评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 43,069评论 3 341
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,487评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,646评论 1 277
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,342评论 3 384
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,813评论 2 367