学习 NightWatch - 断言

断言

使用时,若断言失败,则停止运行测试,否则继续

// ...
// .logo 会出现
// 否则终止运行
browser.assert.visible('.logo')
// ...

来自 Node.js 的断言模块也可以使用

.not

用于取反

// ...
// .logo 不会出现
// 否则终止运行
browser.assert.not.visible('.logo')
// ...

自动重试

默认情况下,NightWatch 会自动重试失败的断言,可在配置文件中配置超时时间(单位:ms)

// nightwatch.conf.js
{ 
    // ...
    retryAssertionTimeout: 5000
    // ...
}

BDD式断言

提高可读性 只是连接词,无具体作用
  • to
  • be
  • been 曾经
  • is
  • that 那个
  • which 哪一个
  • and
  • has
  • have
  • with 具有
  • at
  • of 属于
  • same 相同的
  • but 但是
  • does
  • still
  • also 而且
方法
测试值
  • .ok 断言目标为真值
  • .true 断言目标为 true,不做类型转换,即 true === true
  • .false 断言目标为 false,不做类型转换,即 false === false
  • .null 断言目标为 null,不做类型转换,即 null === null
  • .undefined 断言目标为 undefined,不做类型转换,即 undefined === undefined
  • .NaN 断言目标为 NaN
  • .exist 断言目标存在,即非 null 也非 undefined
  • .empty 断言目标长度为 0,对于数组、字符串,检查 length 属性,对于对象,检查可枚举属性数量
  • .arguments 断言对象是一个参数对象 arguments
  • .instanceof(Constructor) 断言目标是 构造函数Constructor 的实例
  • .a(String) / .an(String) 是否是某个类型 可作为语言链亦可作为断言使用
判断
  • .equal(value) 断言 目标 === value

  • .eql(value) 断言 目标深等于 value 相等于 deep.equal(value) 缩写

  • .above(Number) 断言目标大于(超过)Number

  • .least(Number) 断言目标大于或等于 Number

  • .below(Number) 断言目标小于 Number

  • .most(Number) 断言目标不小于或等于 Number

  • .within(Start, End) 断言目标在 Start - End 区间内

    以上 皆可在 length 后跟随,相比直接提供长度好处为提供了更详细的错误信息

  • closeTo(Number1, Number2) 期望目标为 Number1, 误差在 Number2 上下

  • .not 对之后的断言取反

对象
  • .extendsible 断言目标是可拓展(可添加新属性)

  • .sealed 断言目标是封闭的(无法添加新属性和删除属性,但可被修改)

  • .frozen 断言目标是冻结的(无法增删改属性)

  • .keys(key1[, key2, ...])

    • key: String | Array | Object 属性名

    断言目标包含传入的属性名,与 any, all, contains,或 have 前缀配合使用时会影响结果

    与 any 结合时,无论是 have 或 contains 前缀,必须存在任意传入属性才能通过,any 或 all 至少使用一个,否则默认 all

    结合 all 和 contains 时,必须包含全部传入属性,但是可以拥有其他未传入属性

    结合 all 和 have 时,必须且只能包含传入属性

  • .include(Object | String | Number) / contains(Object | String | Number) 判断数组,字符串是否包含某值

    可作为属性类断言前缀语言链,当作为语言链使用时,常用于 keys() 断言之前

  • ownProperty(key) 断言目标具有名为 key 的自有属性

  • ownPropertyDescription(key[, descriptor]) 断言目标自有属性 key 存在描述符对象

    如果给定描述符对象 descriptor,则必须匹配

  • .any & .all

    • .any 在 keys 断言之前使用 any 标记 (与 all 相反) 任意一个
    • .all 在 keys 断言之前使用 all 标记 (与 any 相反) 全部所有
函数
  • .change(Object, String) 断言目标方法会更改Object[String]

  • .increase(Object, String) 断言目标方法会增加Object[String]

  • .decrease(Object, String) 断言目标方法会删除Object[String]

  • .throw(ErrorConstructor | String | RegExp)

    断言目标函数会抛出一个指定错误或错误类型(使用 instanceOf 计算)也可使用正则表达式或字符串检查错误信息

数组
  • .members(Array) 断言目标是 Array 的超集,或目标有 Array 所有 === 的成员,若设置 deep 标记,则成员进行深度比较

    (include / contains 只能接受单个值,可判断数组字符串,members 接受数组,只判断数组)

  • .oneOf(Array) 断言目标出现在 Array 的某个顶层位置(直接子元素,严格相等)

字符串
  • .match(RegExp) 断言目标匹配 RegExp 正则表达式

  • .string(String) 断言目标字符串包含 String

.deep

设置 deep 标记,然后使用 equal 或 peoperty 断言,该标记可让之后的断言不比较对象本身而是递归比较对象键值对

deep.property 中特殊符号通过 \\ 转义,第一个 \ 转义第二个 \, 第二个 \ 在 property 中进行转义

expect(foo).to.deep.equal({ bar: 'baz'})
expect({ foo: { bar: { baz: 'quux'}}})
  .to.have.deep.property('foo.bar.baz', 'quux')
.property(key, [value]) 断言目标是否具有某个为 key 的属性

如果提供了 value 则值必须严格等于 value,若设置了 deep,则可使用 . 或 [] 指向对象和数组的深层属性

同时,property 会将断言主语由原先对象变更为当前属性值,使其后可以针对此属性值测试

只有使用 deep 时,property 中的 . [] 才必须使用 \\ 转义

.length 设置 .have.length 标记作为 length 比较属性值的前缀
.lengthOf(Number) 断言目标的 length 为 Number
.respondTo(String) 断言目标类或对象会响应一个方法(存在此方法)
.itself 设置 itself 标记,然后使用 .respondTo 检查是否为挂载于构造函数本身的方法
.satisfy(value:any => Boolean) 传入 value 代表目标值,返回一个布尔值
count 计数
expect.elements(Elements).count.to.equal(5);

学习 NightWatch - 断言
http://localhost:8080/archives/74d78da1-e2f8-42ed-964a-bdbe8868b50c
作者
inksha
发布于
2024年09月14日
许可协议