FrontEnd Automates Test 前端全自动化测试html
文章开头先引一个知乎上的问答:如何进行前端自动化测试?前端
我相信作过前端的朋友都有这个疑问。但愿这篇文章里你能看到一些别人的测试方法,帮助你更好的进行测试工做;node
很尴尬的是,在此以前个人开发测试也都不会有单元测试而都是人肉测试,对不起本身 ☹️;git
为了之后可以更好的进行测试工做,记录本身测试学习的过程,但愿能帮本身也能帮到别人。github
假若有这样一个俩数相加的程序功能:segmentfault
function add(a, b){ return a+b }
咱们如今要对这个俩数相加的程序功能进行测试,来测试这个 add 方法的输入输出是否符合咱们的预期,那就要去写测试用例去测试。api
方式一:你可能这么写promise
5 === add(2, 3) // 测试用例(1) (1.7976931348623157e+308 * 2) !== add(1.7976931348623157e+308, 1.7976931348623157e+308 + 1) // 测试用例(2)
测试用例(1)用预期的 5 和 add 方法输入 2 和 3 的输出结果进行比对,是否相等;若是相等,那么 add 方法就经过测试用例,若是不等,就证实咱们的 add 方法存在问题。
能够看到测试用例(1)
结果是相等,经过测试
测试用例(2)用预期的 1079654173767686669 和 add 方法输入 1.7976931348623157e+308 和 1.7976931348623157e+308 的输出结果进行和用例(1)同样的操做。
能够看到测试用例(2)
结果应该不等, 测试不经过异步
缘由:原来是咱们没有考虑大数相加结果溢出的状况,因此咱们的 add 方法是只能在相加的结果不会溢出状况下获得指望的正确结果。函数
咱们就有必要对咱们的方法进行改动以适配大数相加,那么每一次这个方法的改动,咱们就要执行一次上面的测试用例。这样咱们就能进行咱们的而测试工做了。
若是应对简单的需求这样的方式显然够用了,可是事实上应该是没人会这么写测试用例的。
你们会用 nodejs 提供的 assert 模块或者 shouldjs 这类断言库来帮咱们作断言这件事情;并且这些模块被 node 原生提供支持,后面要在此测试基础上进行自动化测试,生成测试报告之类的,都很是方便。
下节咱们以 assert 模块为例来改造这个测试用例;这一节咱们先作一些准备工做,要写测试用例,会用到断言,那么咱们这节就先看看断言的相关内容,以 node 的 Assert 模块为例:
assert 模块提供了断言测试的函数,用于测试不变式。
Error 的一个子类,代表断言的失败。 assert 模块抛出的全部错误都是 AssertionError 类的实例。
这是咱们写测试用例,执行测试,调试测试过程最多见到的一个类,指示遇到断言失败。
assert(value[, message])
assert.ok() 的别名。
附:assert.deepStrictEqual() 的别名。
assert.deepStrictEqual(actual, expected[, message])
测试 actual 参数与 expected 参数是否深度相等。 深度相等意味着子对象中可枚举的自身属性也会按如下规则递归地比较。
assert.deepStrictEqual({a:1}, {a:1}); //这样的测试是能够经过的
注意:脚本中这俩个是不绝对相等的
assert.doesNotReject(block, error)
该函数至关于 assert.doesNotThrow(),除了须要等待完成的异步特性。
等待 block 的 promise 完成,若是 block 是一个函数,则当即调用该函数并等待返回的 promise 完成,而后检查 promise 是否被 reject。
若是 block 是一个函数且同步地抛出一个错误,则 assert.doesNotReject() 会返回一个被 reject 的 Promise 并传入该错误。 若是该函数没有返回一个 promise,则 assert.doesNotReject() 会返回一个被 reject 的 Promise 并传入 ERR_INVALID_RETURN_VALUE 错误。 以上两种状况都会跳过错误处理函数。
assert.doesNotThrow(block, error)
断言 block 函数不会抛出错误。
当 assert.doesNotThrow() 被调用时,它会当即调用 block 函数。
若是抛出错误且错误类型与 error 参数指定的相同,则抛出 AssertionError。 若是错误类型不相同,或 error 参数为 undefined,则抛出错误。
附:assert.strictEqual() 的别名。
assert.fail([message])
抛出 AssertionError,并带上提供的错误信息或默认的错误信息。 若是 message 参数是 Error 的实例,则会抛出它而不是 AssertionError。
附:使用 assert.fail([message]) 代替。
assert.ifError(value)
若是 value 不为 undefined 或 null,则抛出 value。 可用于测试回调函数的 error 参数。 堆栈踪影会包含传入 ifError() 的错误的全部帧,包括潜在的 ifError() 自身新增的帧。
附:使用 assert.notDeepStrictEqual() 代替。
assert.notDeepStrictEqual(actual, expected[, message])
测试 actual 参数与 expected 参数是否不深度全等。 与 assert.deepStrictEqual() 相反。
附:assert.notStrictEqual() 的别名。
附:使用 assert.notStrictEqual() 代替。
assert.notStrictEqual(actual, expected[, message])
使用 SameValue 比较法测试 actual 参数与 expected 参数是否不全等。
assert.ok(value[, message])
测试 value 是否为真值。 至关于 assert.equal(!!value, true, message)。
assert.rejects(block, error)
等待 block 的 promise 完成,若是 block 是一个函数,则当即调用该函数并等待返回的 promise 完成,而后检查 promise 是否被 reject。
若是 block 是一个函数且同步地抛出一个错误,则 assert.rejects() 会返回一个被 reject 的 Promise 并传入该错误。 若是该函数没有返回一个 promise,则 assert.rejects() 会返回一个被 reject 的 Promise 并传入 ERR_INVALID_RETURN_VALUE 错误。 以上两种状况都会跳过错误处理函数。
assert.strictEqual(actual, expected[, message])
使用 SameValue 比较法测试 actual 参数与 expected 参数是否全等。
assert.throws(block, error)
断言 block 函数会抛出错误。
至此,断言模块全部的 api 咱们都清楚了,固然 node 官网对于Assert 模块还有更详细的内容。