AI・機械学習チームの鴨田です。このブログはAI・機械学習チームブログリレー 9日目の記事です。
年末休みに話題の書籍『Tidy First?』を読みました。コード整理の実践的な手法や作業粒度によるトレードオフなどを学び、「最初から完璧な設計なんてできるわけない。コード品質を保つための整理が大切だよなー」と改めて実感しました。
品質を保ちながら開発速度を上げるには、信頼できるテストが欠かせません。これは開発における普遍的な真理ですが、特にQA環境でのテストは地道で骨の折れる作業になりがちです。皆さんの現場でも、似たような課題を抱えているのではないでしょうか?
今回は手動で実施しているQAテストをkjというOSSを利用して自動化した話を紹介していきます。
QAテストの実施方法
私が携わっているプロダクトでは、Kubernetes上に機能ごとのCronJobをデプロイしており、そのQAテストにkjというOSSを利用していました。
kjの詳しい説明はリポジトリをご覧いただくのが一番ですが、簡単に言えば「kubectl create job --from=CRONJOB」と「kubectl edit」が一体となった、CronJobのデバッグを強力にサポートしてくれる素晴らしいツールです。
QA環境内でkjを用いて、CronJobからQAシナリオ用のパラメータに変更したJobを手動で作成・実行し、期待する処理が行われるかを確認していました。
QAテストの課題
プロダクトが成長し新機能を追加するにつれ、コードの複雑化とメンテナンス性の低下が深刻な問題となりました。そこで、初期設計の大幅なリファクタリングに踏み切ることにしました。
言うまでもなく、大規模な設計変更の後には、関連する全ての機能が正しく動作するかを確認する網羅的なQAテストが必要です。しかし、kjはJobのリソースフィールドをターミナルのエディタ(VimやEmacsなど)で手動で書き換える必要があり、テスト項目が増えるにつれて、QAにかかるコストが雪だるま式に膨れ上がってしまいます。
このままでは、リファクタリングに踏み切れない。品質担保のコストが、プロダクト改善の足かせになってしまう。この状況を打破するため、大規模なリファクタリングの前に、まずQAの自動化を進めることを決意しました。
kjへの機能追加
このQAを自動化するためには、kjで逐次的にjob定義を編集しているところをどうにか改善する必要があります。 そこで、kjにJobのリソースフィールドを宣言的に、かつ自動で書き換える機能をコントリビュートすることにしました。
具体的には、既存の実装に加えてkubectl patchの機能を取り込み、あらかじめ用意したパッチファイル(YAML形式)を読み込ませることで、コマンド一発でJobのリソースフィールドを変更できるようにしました。
PRはこちらです。
当初、CronJobリソースへのPatch適用処理を独自に実装していましたが、kubectlの公式実装を調べたところ、strategicpatch.StrategicMergePatchが利用されていました。この実装を参考にしたことで約220行のコードを削減でき、とても勉強になりました。
// kubectl公式実装から抜粋 case types.StrategicMergePatchType: // get a typed object for this GVK if we need to apply a strategic merge patch obj, err := creater.New(gvk) if err != nil { return nil, fmt.Errorf("strategic merge patch is not supported for %s locally, try --type merge", gvk.String()) } return strategicpatch.StrategicMergePatch(originalJS, patchJS, obj)
この機能追加により、これまで手作業で行っていた煩雑な編集作業が一切不要になり、DBの初期化など一部手動作業が残るものを除いた約30項目のQAテストにかかっていた時間が劇的に短縮されました。 (従来は、キャッシュ削除 → パラメータ編集 → Job実行 → 結果確認というサイクルに1項目あたり5〜10分、合計で2時間30分以上を要していました)それが、一連のJobの実行時間のみで完了するようになったのです。
自動QAによる恩恵
今回の件に限らず自動QAのいいところも含めて記載すると、
心理的安全性の向上
「この大きな変更が、他の機能を壊していないだろうか?」というリリース前の不安は、開発者にとって大きなストレスです。
自動化されたテストが「セーフティネット」として機能してくれることで、この不安が大幅に軽減されました。その結果、以前は躊躇していたような抜本的なコードや設計の改善にも、チーム全体でより積極的に取り組めるようになりました。
新規機能追加スピードの向上
これはリファクタリング自体の成果でもありますが、そのリファクタリングを可能にしたのがQAの自動化です。
設計変更にかかる工数と精神的なハードルが下がったことで、結果的にプロダクト全体の開発サイクルが改善し、新規機能のリリーススピード向上に繋がりました。
まとめ
今回はkjという優れたツールにコントリビュートする形で、QAテストの課題を解決しました。(Star(高評価)、Watch(通知オン)よろしくお願いします!) github.com
言うまでもなく「面倒な手作業」は、自動化のチャンスです。 もし皆さんの開発プロセスにも非効率な手作業が潜んでいるなら、それは開発文化を一段階引き上げるための貴重な機会なのかもしれません。
We are hiring
今回はQAテスト自動化をご紹介しましたが、それ以外にもAIチームでは様々な自動化に支えられて多数のプロダクトを高速で開発する土壌が整っております。最高の環境で一緒に働いてみませんか? 新卒・中途それぞれの採用だけでなく、カジュアル面談やインターンも常時募集しています!