Chapter 01

はじめに

zoetro
zoetro
2022.08.22に更新

本書の内容

本書では、Kubernetes Operatorを開発する際のテスト手法について解説します。

Kubernetes Operatorの開発には、Kubebuilderを利用します。
Kubebuilderの利用方法に関しては、以下のページをぜひご覧ください。

https://zoetrope.github.io/kubebuilder-training/

Kubebuilderでは、BDDテストフレームワークであるGinkgoと、AssertionライブラリであるGomegaを採用しています。
これらの基本的な使い方と、Kubernetes Operatorをテストする際に便利なテクニックを紹介していきます。

なお、本書で利用するKubebuilder, Ginkgo, Gomegaは以下のバージョンを対象としています。

  • Kubebuilder: v3.6.0
  • Ginkgo: v2.1.4
  • Gomega: v1.20.0

テストの分類

Kubernetes Operatorを開発する際には、さまざまな観点でのテストが必要となります。
例えば、Unit Test、Kindminikubeを利用したEnd-to-End Test、性能テスト、アップグレードテスト、コンテナイメージのテスト、Helm Chartsのテストなどがあります。

テストピラミッドの考え方では、Unit Testのような低レベルなテストでできるだけ広い範囲をカバーし、End-to-End Testのような高レベルなテストは下位のレベルのテストでカバーできなかった範囲のみをテストするのがよいとされています。
End-to-End Testのような高レベルなテストは、書くのも実行するのも時間がかかり、またFlakyなテストを生み出しやすいためです。

Kubernetes Operatorのテストにおいても、Kindやminikubeを利用したEnd-to-End Testは、Kubernetesクラスタを立ち上げるだけでも数分かかってしまい、開発中に何度も繰り返し実行するのには向いていません。
そこでEnd-to-Endテストの代わりに、EnvTestというパッケージを利用し、ローカルにetcdとkube-apiserverだけを立ち上げてテストする手法がよく用いられます。

本書でも、このEnvTestを利用したテスト手法を中心に解説します。

テスティングフレームワーク

Goはテストを書くためのtestingパッケージが標準で用意されていますが、このパッケージには他の言語で見られるようなAssertionやフレームワークは含まれていません。

理由は以下のとおりです。

  • テストに失敗したときの処理をAssertionに任せると、プログラマが適切なメッセージを書かなくなってしまう
  • フレームワークを採用すると、新しいミニ言語を覚えなくてはならない
  • もし似たようなコードがたくさん現れるなら、テーブル駆動テストを利用すれば良い

一方で、Kubernetes Operatorを開発するためのツールであるKubebuilderでは、BDDテストフレームワークであるGinkgoと、AssertionライブラリであるGomegaを利用したテストコードのひな形を自動生成してくれます。

KubebuilderがGinkgoとGomegaを採用している理由は以下のIssueで説明されています。

理由は以下のとおりです。

  • Assertionライブラリを利用することで同じようなコードの繰り返しを避けられる
  • 期待される振る舞いを書かなければならないので、テストすべき内容が明確になる
  • テストを論理的に整理することができる

では、実際のテスティングフレームワークの利用状況はどうなっているのか、GitHub上でいくつかのKubernetes Operatorの実装を調べてみました。

  • Ginkgo/Gomegaのみを利用: 5
  • testifyのみを利用: 9
  • ユニットテストにtestify、e2eテストにGinkgo/Gomegaを利用: 4
  • testingパッケージのみを利用: 2
  • 自作フレームワークを利用: 1

以上のように、testingパッケージのみを利用しているものは少なく、何らかのフレームワーク・ライブラリを利用しているものがほとんどでした。
ちなみにtestifyというのは、Assertionとモック機能を提供する軽量なテストライブラリです。

https://github.com/stretchr/testify

筆者は、testingパッケージを利用する方法と、Ginkgo/Gomegaを利用する方法のどちらでもテストを書いたことがありますが、後者の方が便利で楽だと感じています。
本書でもGinkgo/Gomegaの機能を活用したテスト手法を紹介していきたいと思います。

なお、GinkgoはBDD(Behavior Driven Development)のフレームワークではありますが、Ginkgoを利用して自動化したからといってBDDを実践していることにはなりません。
本書では、Ginkgoを便利なテスティングフレームワークとして利用するだけであり、BDDについては扱いませんのでご注意ください。