2024年7月15日 アンナ・マラー
DevOpsとCI/CD(継続的インテグレーション[Continuous Integration]/ 継続的デリバリー[Continuous Delivery])という言葉を目にする機会が増えました。
DevOpSのアプローチを採用した企業や組織は、大きなビジネス価値につながる「コードのデプロイを最大46倍高速化」「ダウンタイムからの回復を170倍高速化」「コミットからデプロイまでのリードタイムが、パフォーマンスの低い企業より440倍高速化」といった成果を上げています(*)。そして、CI/CDパイプラインの使用に磨きをかけて高業績を達成している企業は、ソフトウェア配信プロセスを大幅に改善しています。
(*)『Accelerate: The Science of Lean Software and DevOps: Building and Scaling High Performing Technology Organizations』より
一方、開発とデプロイが高速であることから、ソフトウェア品質の低下を心配する人が多くいます。そして、ソフトウェア品質の低下への懸念から、DevOpsの方法論を避ける企業もあるようです。
この「ソフトウェア品質の低下への懸念」は、DevOpsとCI/CDパイプラインがどのように機能するかを理解していないことに起因しているようです。DevOpsとCI/CDパイプラインが適切に実装されていれば、開発とデプロイの高速性とソフトウェア品質との間にトレードオフは無いはずです。そして、解決策は、ソフトウェア開発ライフサイクル(SDLC:Software Development Lifecycle)全体にわたる「テスト自動化」です。
ソフトウェア開発ライフサイクルがソフトウェア品質を保証する理由
ソフトウェア開発ライフサイクルは、企業や組織に多くのメリットをもたらします。
テストはソフトウェア品質を保証
DevOpsでは、テストは開発プロセス全体を通して行われます。これにより、開発サイクルの初期段階で不具合を特定して修正できます。また、品質とパフォーマンスの標準が満たされていることを確認することで、本番環境で問題が発生することを防げます。
自動化がスピードを保証
自動化は、ソフトウェア配信パイプラインの速度と効率を向上させるDevOpsの重要な機能です。DevOpsサイクルに自動化されたテストが組み込まれることで、開発チームはテストを迅速に実行するとともに、必要に応じてテストを繰り返すことにより、コード変更時に関するフィードバックを速やかに得られます。
テスト自動化はCI/CDパイプラインにシームレスに統合できるため、信頼性が高く合理化されたリリースのプロセスを促進しながら、本番環境におけるソフトウェアの品質を確保できます。
ソフトウェア開発ライフサイクルにおける、その他のメリット
自動化とテストを組み合わせることで、CI/CDパイプラインが合理化され、品質低下のリスクなしに開発のスピードが上がります。そして、自動化されたテストは企業や組織に多くのメリットをもたらします。
時間の節約:ソフトウェア開発サイクルの早い段階で問題を検出できることで、定量化可能な時間の節約が実現します。早期に不具合を修正できるため、開発者は本番環境における問題の解決や不具合の除去作業に費やす時間を短縮できます。
リファクタリングと反復型開発:ビジネス・アプリケーションの場合、コードの多くは更新によって恩恵を受けられるため、IBM i 環境の開発者にとってリファクタリング(プログラムの挙動を変えずにコードを整理・改善すること)のメリットは大きいです。
コードをリファクタリングすることで、プログラマーにとっての可読性が向上します。さらに、コードの複雑さが緩和され、保守性が向上し、パフォーマンスが最適化されます。また、リファクタリングは一貫性と整合性を確保しつつ、進化的な設計もサポートできます。そして、このようなコードの最新化は、ITプロフェッショナルにIBM i の環境に携わっていただくために不可欠なことでもあります。
DevOpsとテスト自動化は、以前に修正した不具合の再発を恐れることなく、開発者が自信を持ってリファクタリングできることを保証します。単体テストが実施されている場合は、開発者はコードの機能が損なわれていないことを保証しながらコードを修正できます。つまり、アジャイルで反復的な開発が可能であり、その結果、IBM i の開発者はアプリケーションのコードを段階的に改善し、変化するビジネス要件に迅速に対応できるようになります。
単体テスト:テスト自動化の最適な環境
様々なテスト技法は自動化可能であるため、ソフトウェア品質の保証に役立てられます。そして、自動化の筆頭が「単体テスト」です。
単体テストは、ソフトウェア開発サイクルへのテスト自動化の実装の開始に最適です。単体テストでは、アプリケーションの個々のユニットまたはコンポーネントを、システムの他の部分から切り離した状態でテストが行われます。そして、ソフトウェアの各ユニットが単体テストによって検証されることから、期待通りに動作することの確認と、コード内の不具合の特定ができます。
単体テストの主なメリットは、特別なリソースを必要とすることなく、実際にコードを修正した後、数分から数時間以内にテストが行われることです。単体テストを実施して生み出される製品は、堅牢であるだけでなく、機能と特長において優れた性能を発揮します。
テスト自動化を始める8つのステップ
単体テストへの自動化の実装を検討する場合、以下の8つのステップで始めましょう。
- テスト・フレームワークの選択
ITプロセス、開発環境、プログラミング言語、総合的なテックスタック(技術スタック)に適合するテストのフレームワークを探しましょう。コミュニティーによる強力なサポートと参考文献があるフレームワークを発見して、ベストプラクティスを活用することで、チームは課題を解決するためのリソースを確実に見つけられるでしょう。 - テスト仕様書の作成
様々なシナリオ、エッジケース(極端な条件や特殊な環境下で発生する稀な問題)、期待される挙動を網羅するテスト仕様書を作成しましょう。
テストケースにはコードの実行時に満たされているべき条件をチェックするアサーションを組み込み、テスト中にユニットが意図通りに動作するかを検証します。
また、再利用可能かつ保守可能なテスト用コードのサブセットを作成する必要もあります。
テスト用コードのサブセットを作成しておくことで、アプリケーションの進化に合わせながら、テストを簡単に理解、更新、拡張できるようになります。テスト用コードは自分で書くこともできますし、ソフトウェア・ツールを用いたテスト用コードの生成、難読化、保守も可能です。 - テストダブルとモックの使用
モック、スタブ、ダミー、フェイクといったテストダブルを使うことで、テスト対象のユニットを依存関係から切り離し、外部コンポーネントの動作をシミュレートできます。
その際は、テストの高速化と複雑さの軽減の観点から、テスト対象のユニットが不要な外部依存関係を排除した状態にあることを確認する必要があります。
モック・オブジェクトを構成して、定義済みのレスポンスや依存関係の動作をシミュレートしてテストを強化するのも良いアイデアです。なぜならば、管理された環境下で包括的なエッジケースのテストが可能になるからです。 - ビルド・プロセスにテストを統合
これで、テストをCI/CDパイプラインに統合できる段階になりました。
CI/CDパイプラインにテストを統合することで、コードの変更に関するフィードバックが迅速に得られるため、チームは開発サイクルの早い段階で問題に対応して修正できます。
テストの統合作業を行う際には、テストをビルド検証プロセスの一部として組み込みます。こうすることで、テスト実行の成功をもって、機能要件を満たすとともにパイプラインの次の段階に進む準備ができているコードであることを示すトリガーが確立されます。
そして、この段階は品質が重要であることから、CIツールを活用したフィードバックループの作成には最適なプロセス段階です。JenkinsやGitLab CIなどのツールやその他のサードパーティー製のツールを活用することで、自動テストをトリガーするとともに、ビルド状況に関するフィードバックを即座に提供できます。フィードバックループによって開発ペースが加速し、ソフトウェア全体の品質が向上します。 - テストの自動実行
CI/CDパイプラインによって、手動で実行できるテストを統合するだけでなく、事前に定義した間隔や特定のトリガーで実行するテストを自動化し、前述の自動化のメリットを活用できます。また、複数の環境や構成で並行テストを実行することで、時間を最適化できます。クラウドベースのテストツールも、多様な環境で自動テストを実行する際のスケーラビリティーと柔軟性のために活用できます。 - テスト結果の収集と分析
テストは、テストの最後に得られるデータと同じくらい役に立ちます。そして、レポートには合否の状況だけでなく、エラーメッセージやパフォーマンスメトリクスの詳細も含める必要があります。傾向やテストカバレッジのギャップを強調するインタラクティブなレポートツールは、データに基づく意思決定をサポートするために使用できます。 - コード・カバレッジの監視
コード・カバレッジ・メトリクスを測定することで、コード機能の検証における自動テストの有効性が評価されます。検出されない不具合のリスクを最小化し、コードの信頼性を高めるために、適切なテストカバレッジを目指すべきです。 - テストのリファクタリングと維持
テストコードの維持は、テスト結果の継続性と信頼性のために重要です。テストコードをクリーンな状態に保ち、環境の改善やコード変更に対応するためのツールが用意されています。
信頼性と品質の両立
DevOpsとCI/CDパイプラインのパワーと俊敏性の活用は、ソフトウェアの品質を低下させません。テストと自動化を開発サイクルに統合すれば、スピードの向上だけでなく、安定性と品質も向上します。
本記事は、TechChannelの許可を得て「Why Automation and Testing Are Key to Smooth DevOps and CI/CD Pipelines」(2024年7月15日公開)を翻訳し、日本の読者にとって分かりやすくするために一部を更新しています。最新の技術コンテンツを英語でご覧になりたい方は、techchannel.com をご覧ください。
IBM i をご利用のお客様の場合はソフトウェア開発(Dev)と運用(Ops)が同一の組織や人物であることが多いのですが、ソフトウェア開発のアプローチである「DevOps」は馴染みが薄いかもしれません。
しかし、この「DevOps」と「テスト自動化」の組み合わせによるソフトウェア開発の効率化と迅速化のメリットは、IBM i の環境でも享受できます。
今回の記事では、IBM i をご利用のお客様を念頭に、「テスト自動化」を始めるための8つのステップを紹介いたします。(編集部)