一、测试概述
测试主要用来确保代码的质量,防止发布到线上环境,出现一些的重大bug;没有经过测试的服务,是脆弱不堪的;
- 单元测试:测试某一个具体的函数或者类是否功能ok;
- 接口测试:测试服务的健康状态,结果是否如期返回;
- 压力测试:测试服务的响应速度,评估能否达到业务上线要求;
- 回归测试:服务发布前,跑完所有的测试用例,防止本次改动引入新的bug;
- 自动化测试:上述测试类型,都应该自动化完成;
二、测试类型
1、单元测试
测试某一个具体的函数或者类是否功能ok
- 测试函数以
test_
开头; - 在函数体加入assert,让unittest知道当前测试成功还是失败;
- 在setUp()和tearDown()函数里声明测试开始前和结束后的命令;
2、接口测试
测试服务的健康状态,
结果是否如期返回;
3、压力测试
测试服务的响应速度,
评估能否达到业务上线要求;
siege工具
当前,qps(每秒请求数)为:1095/59.48=18.41,当然,还没到百度的极限,实践中应该提供极限qps。
实践中,需要得到:
- 一个进程下,能处理的特定字数下的qps,并观察其内存、CPU、显存占用;
- 然后根据业务方处理需求,估算机器资源;
例子:
1个分词服务,500字文本,最大qps为100,资源占用(内存4G,CPU2核,显存2G),要达到业务的 1000万/天 的处理量,平均字数为500,需要开多少实例(进程)、需要多少硬件资源?
4、回归测试
服务发布前,跑完所有的测试用例;
尽管本次只加了一个小功能,但仍需要回测所有的测试用例,防止本次改动对其它代码带来影响;
5、自动化测试
测试全丢给测试工程师来写?
- 开发同学的代码,自己最清楚,要别人给完成单元测试、接口测试等,沟通成本高;
- 微服务下,单个服务不会很复杂,开发同学自己完成这些绰绰有余;
- 前述测试都可以自动化,成本也不高;
测试工程师干嘛呢?进行端到端测试,即在产品页面上操作,黑盒测试
测试金字塔
- 越往下,测试用例数量越多;
- 越往下,测试周期越快,越容易找到问题;
- 越往上,信心越充足;