Kubernetes e2e test and test framework
6377 ワード
前言
Kubernetesの成功には多くのエンジニアの共同参加が欠かせないが、彼らの間でどのように効率的に協力するかは、私たちが探究する価値がある.最近、彼らのe 2 eテストとフレームワークを研究し、使用したのは、まだ啓発的だ.
どのようにして良いe 2 eテストですか?
異なる人が書いたテスト用例は千差万別で、特に用例が開発者によって作成される可能性がある場合、その状況は考えられる.ほとんどの開発者は、多くのテスト例シーンの薫陶を経験したことがない可能性があります.したがって、高品質のe 2 eテスト例をどのように出力し続けるかは、確かに課題である.しかし、Kubernetesコミュニティは非常に聡明で、彼らはいくつかの共通のものを抽象化して、みんなが守ることを望んでいます.例えば
また、コミュニティはルールを定めただけでなく、一連のインフラを開発し、維持し、上記のルールの定着を支援しています.次にお話しするe 2 eフレームワークはその1つです.
e 2 e検収試験
テストをしたことがある人はすべて知っているはずです.複雑なシステムテストに直面するとき、私たちは通常多くのテスト環境を持っていますが、テストコードは通常1部しかありません.したがって、テスト用例をよりよく区別するためには、通常、用例を分類するためにラベルを付ける方法が採用される.これはKubernetesのe 2 eにあり、これも例外ではありません.
Kubernetesはデフォルトでテスト用例を以下のように分類し,開発者が実際に用例を開発する際に適切に使用する必要がある.
もちろん、上記のラベルに加えて、Kubernetesクラスタの最小機能セット、つまり私たちがよく言うMATテストを検収するために使用される[Conformance]という重要なラベルもあります.プライベートで導入されたk 8 sクラスタがあれば、この例で検収することができます.方法も簡単で、次の手順で実行できます.
# under kubernetes folder, compile test cases and ginkgo tool
make WHAT=test/e2e/e2e.test && make ginkgo
# setup for conformance tests
export KUBECONFIG=/path/to/kubeconfig
export KUBERNETES_CONFORMANCE_TEST=y
export KUBERNETES_PROVIDER=skeleton
# run all conformance tests
go run hack/e2e.go -v --test --test_args="--ginkgo.focus=\[Conformance\]"
注意、kubernetesのテストで使用したミラーはすべてGCRに置かれています.もしあなたのクラスタが国内にあり、FQ機能を持っていない場合は、podがミラーをダウンロードできないために起動に失敗する可能性があります.
Kubernetes e2e test framework
Kubernetesのe 2 eテストフレームワークを研究し、私たちのこれまでの経験に比べて、個人的には、次のいくつかの特性が参考になると思います.
All e 2 e compiled into one binary、単一独立バイナリ
サービス・エンド・プログラムのAPIテストでは、各サービスに対してginkgo suiteを作成してテスト・インスタンスの範囲を定義することがよくあります.これにより、インスタンスの目標は非常に明確になりますが、サービス数が増えるにつれて、このようなsuiteはますます多くなります.組織的には、やや乱雑に見え、テストサービスの出力に不利です.
例えば、QAは新しい機械室の配置、またはプライベート機械室のサービス検証を行う必要があるシーンを考えています.この場合、通常、指定されたクラスタにcopyのすべてのコードが実行される必要があり、非常に不便であり、コードの漏洩も起こりやすい.
kubernetesにも明らかにこの需要があるので、彼らは書き方を変えて、すべてのテスト例をe 2 eにコンパイルします.testのバイナリは、上記のシーンに対して、この実行可能なファイルを直接使用して操作することができ、非常に便利です.
もちろん、実行可能なファイルの便利さには、外部パラメータの自由な注入と、全体的なテスト例の丹念なマークが欠かせません.そうでなければ、テストコードの書き込みが規範化されていないため、特定の環境に対して頻繁に修正する必要があり、不便である.
Each case has a uniqe namespaceは、各caseに一意の空間を持つ
各テスト例に独立した空間を作成することは、kubernetes e 2 e frameworkの大きなエッセンスです.各テスト例は1つの空間を独占し、互いに衝突しないため、合併の悩みを根本的に回避し、ginkgoのCLIを利用して実行すると、実行効率が大幅に向上します.
また、このコードの方式も非常に優美で、参考になります.
func NewFramework(baseName string, options FrameworkOptions, client clientset.Interface) *Framework {
f := &Framework{
BaseName: baseName,
AddonResourceConstraints: make(map[string]ResourceConstraint),
Options: options,
ClientSet: client,
}
BeforeEach(f.BeforeEach)
AfterEach(f.AfterEach)
return f
}
ginkgoのBeforeEachのネスト特定を利用して、Describeの下でframeworkの初期化(以下)を定義しますが、各Itが実行される前に、上のBeforeEachが実際に実行されるので、競合はありません.
var _ = framework.KubeDescribe("GKE local SSD [Feature:GKELocalSSD]", func() {
f := framework.NewDefaultFramework("localssd")
It("should write and read from node local SSD [Feature:GKELocalSSD]", func() {
...
})
})
もちろんe 2 eフレームワークはcaseが実行した環境クリーンアップを担当し、必要に応じて柔軟に構成されています.たとえば、caseが失敗してフィールドを保持し、namespaceを削除しないことを望む場合は、flagパラメータdelete-namespace-on-failureをfalseに設定して実装できます.
Asynchronous wait,非同期待機
ほとんどのKubernetes操作は非同期なので、製品コードでもテスト例でも、この非同期待機ライブラリ:kubernetes/vendor/k 8 sが広く使用されています.io/apimachinery/pkg/util/wait.このライブラリは、実現が簡単で、精悍で、とても勉強に値します.
また,テストの非同期検証に対してginkgo(gomega)自身が提供するEventualyも,非常に使いやすい.
Suitable logs、適切なlogを印刷
Kubernetes e 2 eは主にglogライブラリとframeworkの2つの方式でlogを出力する.Logfメソッド.glog自体はgolang公式に提供されているlogライブラリで、使用が柔軟です.しかし、ここで主にお勧めするのはFrameworkです.Logf.この方法を使用するロゴはGinkgoWriterに出力されるのでginkgoWriterを使用するとRunSpecsWithDefaultAndCustomReportersメソッドの場合、logはコンソールだけでなくjunit形式のxmlファイルにも保存され、jenkinsでテスト結果を表示するのに便利です.
Clean code、テストコードもきれいで、優美です
多くの場合、テストコードはlowだと思っていますが、実はそうではありません.コードは優劣を問わず、良し悪しはコードを書く人に頼る.そして、テストコードもいいし、美しく書くべきだと思います.そうしないと、どうやって追い詰められますか?!の
私たちはKubernetes e 2 eから多くの良い参考を見ることができます.例えば、
Kubernetes環境適応性のe 2 eテストフレームワーク
現実的には、k 8 sの周りで仕事をする必要がある場合は、自分のテストフレームワークが必要かもしれません.さまざまなカスタムコントローラor watcherをテストしても、k 8 sで実行されるプライベートサービスをテストしても構いません.このフレームワークはすべてあなたに適用されます.
https://github.com/CarlJi/golearn/tree/master/src/carlji.com/experiments/k8s_e2e_mat_framework
論理的変更は小さく,既存のkubernetes e 2 eフレームワークに基づいて最小集合を抽出しただけである.すばやく使用できます.
親切ではないでしょうか.
童鞋,点赞吧(⊙o⊙)?
リファレンスドキュメント
Contact me ?
Email: [email protected]
Blog: http://www.cnblogs.com/jinsdu/
Github: https://github.com/CarlJi
転載先:https://www.cnblogs.com/jinsdu/p/7465434.html