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

  1. ​deadcode​​,未使用函数和方法的检查;
  2. ​errcheck​​,未处理错误,例子+1;
  3. ​gosimple​​,简化代码;
  4. govet,锁拷贝检查、循环变量捕获问题、printf 参数不匹配;
  5. ​ineffassign​​,无效的资源申请,分配了内存但是没有使用,例子+1;
  6. ​staticcheck​​,ge vet的加强版,例子+1;
  7. ​structcheck​​,检查结构体中未使用的字段;
  8. typecheck,检查类型是否合理;

3、例子

golangci-lint run .\pkg\addon\ 
golangci-lint run .\pkg\apiserver\rest\webservice\

社区的代码规范及e2e测试_ci

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生成测试覆盖率报告。

社区的代码规范及e2e测试_ci_02

sign-off-by

社区的代码规范及e2e测试_golang_03