golangci-lint
静态代码检查工具,是对golint、gofmt的集成,速度更快。
1、安装
go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.38.0
golangci-lint run [目录]/[文件]
最新的版本是1.42.0,社区使用的是1.38.0,总体来说是规则越来越严,我们和社区保持一致即可;
2、Linters
- deadcode,未使用函数和方法的检查;
- errcheck,未处理错误,例子+1;
- gosimple,简化代码;
- govet,锁拷贝检查、循环变量捕获问题、printf 参数不匹配;
- ineffassign,无效的资源申请,分配了内存但是没有使用,例子+1;
- staticcheck,ge vet的加强版,例子+1;
- structcheck,检查结构体中未使用的字段;
- typecheck,检查类型是否合理;
3、例子
golangci-lint run .\pkg\addon\
golangci-lint run .\pkg\apiserver\rest\webservice\
e2e测试
e2e,端到端测试,即k8s的集成测试。
e2e测试需要一个真实的k8s集群,主要借助controller-runtime/pkg/envtest,在运行时,它会启动一个真正的 API Server 和 etcd,随后把 CRD 注册到 Scheme 中,但是并不会启动Controller Manager、kubelet等,这也意味着来自 API Server 的关于 Kubernetes 资源的事件不会真正被处理。
测试框架是ginkgo+gomega
1、安装
go install github.com/onsi/ginkgo/ginkgo
go install github.com/onsi/gomega/...
2、基础知识
ginkgo 提供了多个类型的 block,包括Describe、Context、It等,
Describe, Context, When组织成Tree结构: Describe是root, Context和When是普通TreeNode.
BeforeSuite() :在Describe 容器运行之前执行;
BeforeEach() :每个测试用例运行前执行的操作,位于 Describe 中,可以有多个
JustBeforeEach() :和BeforeEach()类似,在所有的 BeforeEach()之后和It()之前执行
AfterEach() :每个测试用例运行后执行的操作
JustAfterEach() :紧跟在It()之后执行;
AfterSuite() :在Describe容器之后执行
Describe() :最顶层的测试用例包裹容器,同一目标的测试用例,可以嵌套
Context() :比 Describe 低一级的测试用例包裹容器,同一个条件下的测试用例
It() :单一的测试用例,位于 Describe 或者 Context 中
Specify() :It()的别名,用途和 It() 完全相同
Eventually() :测试异步逻辑: 如发送请求到队列, 需持续polling. 在Gomega实现:
断言方式
type Assertion interface {
Should(matcher types.GomegaMatcher, optionalDescription ...interface{}) bool
ShouldNot(matcher types.GomegaMatcher, optionalDescription ...interface{}) bool
To(matcher types.GomegaMatcher, optionalDescription ...interface{}) bool
ToNot(matcher types.GomegaMatcher, optionalDescription ...interface{}) bool
NotTo(matcher types.GomegaMatcher, optionalDescription ...interface{}) bool
}
3、购物车的例子
4、addon的例子
PR前的准备
win10-1903、wsl2、ubuntu18.04、kind、docker desktop;
readme-generator生成测试覆盖率报告。
sign-off-by