对于一个高质量的代码,在发布新的代码的同时开发者也绑定大量的测试用例来确保代码的code coverage以及功能可用性。对于开发方法以及模块最基础的两部分就是Unit Test(单元测试), Integration Test(集成测试) 以及 Functional Test(功能性测试)。但这些测试具体需要做什么以及有什么不同呢?
![](https://i-blog.csdnimg.cn/blog_migrate/fdded53d431c3cb03d40176a4c0fc3c6.png)
下面是维基百科对于这些测试的定义:
- 单元测试Unit Test: 也可称为模块测试,是一种白盒测试。针对程序模块正确性的检测工作,单元测试是一个程序之中最小的可测试部件。对于Java这种面向对象语言,单元测试也就是方法测试(Class Method)。
- 简而言之,就是在不考虑外界依赖的情况下只针对函数方法内部逻辑测试。一切外界依赖(调用某个方法,API,第三方模型等) 我们应该假设都会成功执行。
- 集成测试 Integration Test: 也可称为组装测试。当单元测试完成后,将程序模块组装起来,对系统的接口进行正确性检验。这是测试会包含所有真实外部依赖进行测试。
- 功能测试 Functional Test: 是一种黑盒测试,通过输入功能并检查输出功能,这时测试不再考虑内部程序结构,而是来评估程序功能是否满足要求。(输出结果正确性,响应时间,等等)
- 端到端测试 E2E Test: 是来测试整个产品从开始到结束整套工作流。
- 举例:一个电商支付E2E Test就可以理解为从用户点击“支付” 到最后银行数据库账户更新这工作流全部过程的测试。
- 测试逻辑:Unit Test < Integration Test < Functional Test < E2E Test
那么对于单元测试和集成测试,定义上都是对于模块的测试,那么他们具体有什么区别呢?下面是摘自Michael Feathers大佬,如果一个测试满足下面任何一项那都不是Unit-Test
- 需要与数据库连接
- 需要通过网络调用某些API
- 需要使用文件系统
- 不能与其他Unit Tests同步执行
- 需要定义或者编辑项目环境来运行
Reference