测试
对于微服务来说,服务的拥有者应该负责测试代码的编写。
测试运行的缓慢会影响修复错误的效率,从而影响开发
类型
- 面向技术的测试:如单元测试,非功能性测试(安全、性能)
- 面向业务的测试:验收测试,探索性测试
范围
测试金字塔
测试象限
单元测试
但测试通常是只测试一个函数和方法调用,并且应该跟外部环境无关
同时,单元测试对代码重构非常重要
服务测试
只对单个服务进行测试可以提高测试的隔离性,针对服务所需要的外部合作者,一般都是mock或者打桩
契约测试
侧重于验证服务提供者的参数定义是否符合消费者的期望
org.springframework.cloud.contract.spec.Contract.make { request { // (1) method 'PUT' // (2) url '/fraudcheck' // (3) body([ // (4) "client.id": $(regex('[0-9]{10}')), loanAmount : 99999 ]) headers { // (5) contentType('application/json') } } response { // (6) status OK() // (7) body([ // (8) fraudCheckStatus : "FRAUD", "rejection.reason": "Amount too high" ]) headers { // (9) contentType('application/json') } }}
用户界面测试
这种测试覆盖了整个系统
各种测试的比例
根据经验,下面一层的测试通常要比上面一层的测试多一个数量级,因为越往上的测试,反馈周期越长,出了错误就没有那么快可以解决
实现服务测试
打桩:为被测服务的一些请求创建一些预设的响应
mock:mock会验证请求是否被正确调用
引入mock可能会更加复杂,所以可以创建一个智能的打桩服务
用户界面测试
集成的服务数量越多,测试就会越脆弱,不确定性也就越强
- 消费者驱动测试:针对消费者的需求产生测试
部署后再测试
- 平均修复时间胜于平均故障时间
跨功能测试
性能测试
性能测试需要有目标