开发了那么多年,还从来没有让自己的代码跑过自动化测试,一般项目也不会去使用自动化测试,毕竟编写测试用例代码所花费的时间比开发还要多很多。今天只是了解一些自动化测试的几个概念。
所谓自动化测试,就是你开发完需求,可以自动帮你检测代码是否存在问题。一般类或者库会去编写测试代码,当你对一个库扩展或者修复bug,要保证之前的代码不会因为这次的修改出现不可预测的问题,所以对之前的代码要进行自动化测试,保证之前的代码不会受影响。
能够通过自动化测试的代码一般质量很高,出现bug的机率很低,就算出现了问题,对于定位问题和解决修复也能很快响应。整体来说对代码的维护性很有帮助。
黑盒测试:
也叫功能测试,主要检测功能,将代码看成一个黑盒,不考虑内部代码,只检测代码是否能够按照设计需求正常使用。一般是测试人员编写的。
白盒测试:
也叫结构测试,虽然也是检测程序是否有错误,但是关注代码内部的结构和逻辑,可能某个功能实现了,但是你的代码语法等出现了问题。一般白盒测试是开发人员编写的。
单元测试:
对最小单元进行测试,比如一个函数、一个模块、一个类等。单元测试主要针对的就是最小可测试单元,不同语言对最小单元不太一样。有一点要注意,单元测试的测试代码也要非常简单,如果测试代码太复杂,那么测试代码本身就可能存在bug。
集成测试:
在单元测试的基础上,将所有模块按照需求组装起来进行测试叫做集成测试。因为单元测试是针对最小单元,当我们每一个函数单元测试都没有问题,但是实现功能的时候,可能参数类型之类的不同,导致功能出现问题,这时候就需要集成测试来检测功能。
TDD:
Test-Driven Development,测试驱动开发,算是一种设计方法,简单来说就是开发功能代码之前,先根据需求编写单元测试用例,然后根据测试代码进行功能代码的开发。其实我觉得这种方法并不是很好,很难想象在没有实现出功能之前,怎么去编写测试代码,也不清楚TDD是否用的很多。
BDD:
Behavior-Driven Development,行为驱动开发,并不是很理解,大概意思就是从需求出发,然后测试就通过这个需求编写测试代码,开发人员根据这个需求进行代码开发,之后通过测试代码去测试功能代码。
常见单元测试库:
Karma、mocha、jest、jasmine,一般这些库都会配合一些断言库一起使用,比如chai、expect、should、assert等。当我们对某个函数或者功能先做出一个假设,比如确定这个函数输入一个参数之后,输出的结果是什么,断言就是捕捉这个假设,判断是否正确。比如判断一个数据是否是字符串:
expect('foo').to.be.a('string');
通过断言库进行判断,是否正确。
不同测试库区别还是很大的,比如karma可以跑在浏览器上,可以测试样式,jest这个是Facebook开源的,用js模拟浏览器环境,不能测试样式,默认就具备断言库chai,还提供了覆盖率。
今天只是分享自动化测试的几个概念,真正编写测试用例是很复杂的,就我自己认知中,要对项目进行单元测试几乎不可能,如果是对类库编写测试用例,还算合理。
(完)