Ansible のテスト

Ansible への貢献をテストする理由

開発者にとって、最も価値のあることの 1 つが、GitHub の問題を確認し、バグ修正を手伝うことです。バグ修正は、ほとんど常に、機能開発よりも優先されるためです。開発者ではなくても、バグの修正や機能のプル要求のテストを手伝うことは非常に価値のあることです。

Ansible ユーザーは、Playbook とロールの作成方法を理解していれば、自身が作成した作業をテストできるはずです。GitHub プル要求は、バグの動作を示すさまざまなテスト (Azure Pipeline など) を自動的に実行します。ただし、貢献者は、自動化された GitHub チェック以外でも自身の作業をテストし、その証拠を PR で示すと、その作業がレビューされてマージされる可能性が高くなります。

Ansible のテスト方法、貢献をローカルでテストする方法、およびテスト機能を拡張する方法を説明します。

コレクションのテストを確認する場合は、「コレクションのテスト」を参照してください。

テストの種類

テストは、大きく分けて以下のように分類されます。

コンパイル:
健全性:
  • 健全性テスト

  • 健全性テストは、静的コード分析の実行に使用されるスクリプトおよびツールで構成されています。

  • これらのテストの主な目的は、Ansible コーディングの仕様および要件を適用することです。

統合:
  • 統合テスト

  • モジュールおよび Ansible コア機能の機能テスト

ユニット:
  • ユニットテスト

  • コードベースの個々の部分に対して直接テストを行います。

GitHub および Azure Pipeline でのテスト

組織

プル要求 (PR: Pull Requests) が作成されると、継続的統合 (CI) ツールである Azure Pipeline を使用してテストが行われます。結果はすべての PR の最後に表示されます。

Azure Pipeline がエラーを検出し、それが PR で変更されたファイルにリンクされると、関連する行が GitHub のコメントとして追加されます。たとえば、以下のようになります。

The test `ansible-test sanity --test pep8` failed with the following errors:

lib/ansible/modules/network/foo/bar.py:509:17: E265 block comment should start with '# '

The test `ansible-test sanity --test validate-modules` failed with the following error:
lib/ansible/modules/network/foo/bar.py:0:0: E307 version_added should be 2.4. Currently 2.3

上記の例から、--test pep8 および --test validate-modules が問題を特定したことが分かります。指定されたコマンドを使用すると、同じテストをローカルで実行して、変更を GitHub にプッシュして Azure Pipeline を待つことなく、すべての問題を修正したことを確認できます。次に例を示します。

Ansible がまだ利用できるようになっていない場合は、ローカルでチェックアウトを実行してください。

source hacking/env-setup

次に、GitHub コメントで説明するテストを実行します。

ansible-test sanity --test pep8
ansible-test sanity --test validate-modules

GitHub のコメントに何が失敗したかが書かれていない場合は、PR の末尾にある「checks have failed」というメッセージの下にある「Details」ボタンをクリックして結果を確認することができます。

失敗した CI ジョブの再実行

時折、変更とは関係のない理由で PR が失敗することがあります。これには、以下のような理由が考えられます。

  • yum や git リポジトリーなどの外部リソースにアクセスする際に一時的に問題が発生した場合。

  • テストを実行するための仮想マシンを作成するタイムアウト。

これらの問題のいずれかがケースとして表示される場合は、以下を実行して Azure Pipelines テストを再実行できます。

  • /rebuild (完全な再構築) または /rebuild_failed (構築に失敗した CI ノードのみの再構築) でのコメントを追加する

  • PR を閉じて再度開く (完全な再構築)

  • PR に何らかの変更を加えて GitHub にプッシュする

それでも問題が解決しない場合は、#ansible-devel チャットチャンネルでお問い合わせください(ansible.imでMatrixを使用、または`irc.libera.chat <https://libera.chat/>`_でIRCを使用)。

PR をテストする方法

理想的には、コードが機能することを証明するテストを追加することが推奨されます。特に、ユーザーがさまざまなプラットフォームにアクセスできない場合、または API や Web サービスを使用している場合は、これが必ずしも可能ではなく、テストも必ずしも包括的ではありません。このような場合は、シミュレーションされたインターフェースに対して実行される自動化よりも、実際の機器を使用したライブテストの方が有益となります。いずれにせよ、最初の段階でも常に手動でテストする必要があります。

Ansible の動作を熟知していれば、Ansible のテストを手伝うことは非常に簡単です。

設定: プル要求のチェックアウト

これは、以下の方法で実行できます。

  • Ansible のチェックアウト

  • 提案された変更をテストブランチに取得

  • テスト

  • GitHub に特定の問題についてのコメント

以下に、実行する方法を説明します。

警告

GitHub のプル要求から送られてきたソースコードをテストすることにはリスクが伴います。送られてきたソースコードには、間違いや悪意のあるコードが含まれていて、システムに影響を及ぼす可能性があるからです。すべてのテストは、仮想マシン上で行うことが推奨されます。クラウドインスタンスでもローカルでもかまいません。このために Vagrant や Docker を好むユーザーもいますが、これらは任意です。また、いくつかの機能 (たとえば、apt や yum などのパッケージマネージャー) は、それらの OS バージョンに固有のものであるため、異なる Linux やその他のフレーバーの仮想マシンを用意しておくと便利です。

作業用に新しい領域を作成します。

git clone https://github.com/ansible/ansible.git ansible-pr-testing
cd ansible-pr-testing

次に、テストするプル要求を見つけて、その番号を書き留めます。次のようになります。

Use os.path.sep instead of hardcoding / #65381

注釈

ansible:devel のみをテストします。

他のブランチへのプル要求は使用できないため、PR 要求のターゲットは ansible:devel にすることが重要です。ドットリリースは、Ansible のスタッフが入念に選択しています。

提案された変更を取得し、テスト用にブランチを作成するときにプル要求番号を使用します。

git fetch origin refs/pull/XXXX/head:testing_PRXXXX
git checkout testing_PRXXXX

1 つ目のコマンドはプル要求から提案された変更を取得し、testing_PRXXXX という名前の新規ブランチを作成します。XXXX はプル要求に関連する実際の番号 (例: 65381) です。2 つ目のコマンドは、新たに作成されたブランチをチェックアウトします。

注釈

GitHub ユーザーインターフェースで、プル要求が正常にマージされないと示された場合は、マージの競合を解決しなければならないため、git およびコーディングにあまり精通していない場合は、続行しないことが推奨されます。これは、元のプル要求の投稿者の責任です。

注釈

一部のユーザーは機能ブランチを作成しないため、devel のバージョンに関連性のないコミットが複数ある場合に、問題が発生する可能性があります。ソースが someuser:devel のように表示される場合は、プル要求に記載されているコミットが 1 つだけであることを確認してください。

Ansible のソースには、Ansible の開発者が頻繁に使用するフルインストールを必要とせず、ソースから直接 Ansible を使用するようにするスクリプトが含まれています。

ソースを作成するだけ (Linux/Unix の用語を使用するために) で、すぐに使い始めることができます。

source ./hacking/env-setup

このスクリプトは、PYTHONPATH 環境変数を変更します (他にもいくつかあります)。これは、シェルセッションが開いている間は一時的に設定されます。

プル要求のテスト

この時点でテストを開始する準備が整いました。

何をテストするかのアイデアをいくつか挙げてみましょう。

  • 例題を含むテスト Playbook を作成し、それらが正しく機能するかどうかを確認します。

  • Python のバックトレースが返されているかどうかをテストします (これはバグです)。

  • 異なるオペレーティングシステムで、または異なるバージョンのライブラリーに対してテストを行います。

健全性テストの実行

ansible-test sanity

詳細情報: 健全性テスト

ユニットテストの実行

ansible-test units

詳細情報: ユニットテスト

統合テストの実行

ansible-test integration -v ping

詳細情報: 統合テスト

潜在的な問題があれば、プル要求にコメントを追加する必要があります (機能が正常に動作する場合もコメントしてもかまいません)。忘れずに ansible --version の出力を転載してください。

例:

Works for me! Tested on `Ansible 2.3.0`.  I verified this on CentOS 6.5 and also Ubuntu 14.04.

PR が問題を解決しない場合や、ユニット/統合テストでエラーが発生した場合は、代わりにその出力を転載してください。

この変更により、エラーが発生します。

When I ran this Ubuntu 16.04 it failed with the following:

```
some output
StackTrace
some other output
```

オンラインのコードカバレージ

オンラインコードカバレージレポート は、Ansible でテストが向上する領域を特定するのが適切な方法です。赤い色に従うことで、レポートを掘り下げて、テストがまったくないファイルを見つけることができます。コードがどのように機能するかを明確に示す統合テストとユニットテストの両方を追加し、重要な Ansible 関数を検証し、存在しない領域でテスト範囲を拡大することは、Ansible の改善に役立つ貴重な方法です。

コードカバレッジレポートは、新しい機能開発が行われる Ansible の devel ブランチのみを対象とします。プル要求および新規コードは codecov.io のカバレッジレポートに含まれないため、ローカルレポートが必要になるようです。ほとんどの ansible-test コマンドでは、コードカバレッジを収集できます。これは、テストを拡張する場所を示すのに特に役に立ちます。詳細は、「Testing Ansible and Collections」を参照してください。

テストに関する詳細情報

Ansible テストを改善する詳細な計画を確認したい場合は、テストワーキンググループ にご参加ください。