可用性の高いコンテンツコレクションへの統合テストの追加

8628 ワード

Tadej Borov語AKによる語
previous installment 私たちの“私たちはこれまでに最高のコンテンツのコレクションを作成する”佐賀、我々はデジタル関連のコンテンツ移行プロセスをカバーした.我々が終わったことは、Aでしたfully functioning Ansible Content Collection 残念ながらテストはなかった.しかし長い間液滴モジュールの積分テストを追加します.

我々は、テストを必要としない、右?


我々は完璧なコードをすべての時間を書くことができれば、テストの必要はありません.しかし、残念ながら、これは実際の生活の中で物事は動作しません.任意の控えめに便利なソフトウェアは、開発者は、通常、開発者は、ポーランドと配信速度の妥協点を打つ必要があることを意味します添付しています.
私たちのために、統合テストの半適切なコレクションを持っている、入手可能なコンテンツコレクションの著者は、2つの主な利点を持っています
  • テストされたコードパスが期待通りに機能し、望ましい結果を生成することを知っています.
  • 我々は自動化しようとしている上流の製品の変化の変化をキャッチすることができます.
  • 第2のポイントは特に開発者の1チームが上流の製品に対して責任がある、そして、別々のグループが不可解な内容を維持する不可解な世界で重要です.
    私たちの背後にある“なぜ統合テスト”は、我々はどのようにそれらを書くに注意を集中することができます.

    環境の設定


    あなたが沿って続くことを望むならば、あなたは2.9または後でインストールされることができる必要があります.また、クローンする必要がありますDigitalOcean Ansible Content Collection . 以下のコマンドは環境を設定します:
    $ mkdir -p ~/digital_ocean/ansible_collections/digital_ocean
    $ cd ~/digital_ocean/ansible_collections/digital_ocean
    $ git clone \
        https://github.com/xlab-si/digital_ocean.digital_ocean.git \
        digital_ocean
    $ cd digital_ocean
    $ export ANSIBLE_COLLECTIONS_PATHS=~/digital_ocean
    $ ansible-doc digital_ocean.digital_ocean.droplet
    
    最後のコマンドが液滴モジュールドキュメンテーションを印刷するならば、あなたはすべてセットされます.

    可用性モジュールの手動テスト


    可聴モジュールの最も簡単な統合テストは2つのタスクを持っている脚本です.第1のタスクは操作を実行し、第2のタスクは第1のタスクの結果を検証する.
    たとえば、液滴モジュールが正しいパラメータでインスタンスを作成したことをテストするには、次の脚本を使用できます.YAMLファイル:
    ---
    - hosts: localhost
      gather_facts: false
      name: Put DigitalOcean's droplet module through its paces
    
      tasks:
        - name: Create a new droplet
          digital_ocean.digital_ocean.droplet:
            oauth_token: ""
            name: test-droplet
            size: s-1vcpu-1gb
            region: fra1
            image: centos-8-x64
            unique_name: true
            tags: [ ansible, test, tags ]
          register: result
    
        - assert:
            that:
              - result is success
              - result is changed
              - "result.data.droplet.name == 'test-droplet'"
              - "result.data.droplet.size_slug == 's-1vcpu-1gb'"
              - "result.data.droplet.region.slug == 'fra1'"
              - "result.data.droplet.image.slug == 'centos-8-x64'"
              - "result.data.droplet.tags == ['ansible', 'test', 'tags']"
              - "result.data.droplet.status == 'active'"
    
    我々のDigitalsea APIトークンを安全に保つために、我々はそれをVarsと呼ばれている別々のファイルに置きます.YSL
    ---
    do_api_token: 1a2b3c4d5e6f
    
    APIトークンを実際のものに置き換えてください.あなたは1つを生成することができますAPI section Digitaloceansのコンソールの.
    我々が走るときansible-playbook -e @vars.yaml playbook.yaml コマンドによってこのようなものが端末に出力されます:
    PLAY [Put DigitalOcean's droplet module through its paces] **********
    
    TASK [Create a new droplet] *****************************************
    changed: [localhost]
    
    TASK [assert] *******************************************************
    ok: [localhost] => {
            "changed": false,
            "msg": "All assertions passed"
    }
    PLAY RECAP **********************************************************
    localhost        : ok=2       changed=1  unreachable=0  failed=0
                       skipped=0  rescued=0  ignored=0
    
    前の例の主な作業馬はassert Ansible module . 各assertの条件はAnsible test , また、リストされた条件のいずれかがfalseに評価された場合、assertタスクは失敗します.
    いくつかの他のことがテストする必要があります:パラメータの処理、チェックモードとidempotence、いくつかの名前に.我々は簡潔さのためにブログ記事からそれらのテストを除外しましたfull playbook.yaml 詳細は
    また、手動でテストするモジュールは単純ですが、いくつかのモジュール以上にスケールしません.通常、すべてのテストを実行するスクリプトを書く必要があります.しかし、幸いにも、Ansibleは、私たちのためにこれを行うことができます適切なテストと呼ばれるツールをバンドルされています.

    自動化テストを自動化する


    可読性のテストは、モジュールのドキュメントとコードをランニングユニットとインテグレーションテストにリンクすることから、さまざまなテスト関連のタスクを実行する方法を知っています.しかし、私たちがそれを使用する前に、我々はそれのためにディレクトリ構造を準備しなければなりません:
    $ mkdir -p tests/integration/targets/droplet/tasks
    
    ディレクトリ構造がかなりネストしていることを知っていますが、これらのディレクトリについての論理的な説明があります.
  • テスト/統合は、統合テストに関連するすべてのものが生きているところです.
  • テスト/統合/ターゲットディレクトリにはすべてのテストケースが含まれます.各々のテストケースは、Babbone可用性の役割です.
  • テスト/統合/ターゲット/液滴は、我々は今日追加されるテストケースです.そして、各々のテストケースが不可解な役割であるので、それはメインを含んでいる仕事サブディレクトリを持っている必要があります.YMLファイル.
  • 今私たちのテスト/統合/ターゲット/液滴/タスク/メインを開始することができます.YMLファイル.ので、我々はすでに手動で液滴モジュールをテストするための脚本を持って、メインを作成します.YMLファイルは、プレイブックからタスクをコピーするように簡単です.
    APIトークンはVARSをコピーできます.YAMLファイルの内容をテスト/統合/統合設定します.YSLansible-test は、テストケースに定義された変数を渡します.
    さて、次のコマンドを実行してテストを実行する準備ができました.
    $ ansible-test integration
    
    我々が今する必要があるすべては、変更を保存することです.しかし、テスト/統合/integreCount設定をコミットしないことを確認してください.YMLファイルは、我々のDigitalAcean資格情報が含まれています.
    設定オプションについての将来のヒントを与えるために、実際の値のプレースホルダを含むテンプレートファイルを作成します.このファイルを設定します.京大理テンプレートを作成し、次のコンテンツを入力します.
    --------
    do_api_token: ${DO_API_TOKEN}
    
    そして、我々はされます.バイ!
    あなたはより多くを見たいです、あなたは言います?私たちはグランドフィナーレのGithubアクションの統合を見ることができると思います.興味がありますか.さあ、やりましょう!

    CI / CDとの統合


    テストが実行されていなければテストは不要です.そして、私たちは皆、プログラマがローカルにそれらを走らせるのを信用することができないということを知っているので、私たちは代わりにgithub提供されたCI/CDサービスでそれらを走らせます.
    私たちが物事を成し遂げる必要があるのは、次のことです.ワークフロー/テスト.YAMLファイル:
    name: Run DigitalOcean Ansible Integration Tests
    on: [ push ]
    jobs:
      integration:
        runs-on: ubuntu-latest
        defaults:
          run:
            working-directory: ansible_collections/digital_ocean/digital_ocean
    
        steps:
          - name: Clone the repo
            uses: actions/checkout@v2
            with:
              path: ansible_collections/digital_ocean/digital_ocean
    
          - name: Set up Python 3.7
            uses: actions/setup-python@v2
            with:
              python-version: 3.7
    
          - name: Install Ansible
            run: pip install ansible
    
          - name: Configure integration test run
            env:
              DO_API_TOKEN: ${{ secrets.DO_API_TOKEN }}
            run: |
              ./tests/utils/render.sh \
                tests/integration/integration_config.yml.template \
                > tests/integration/integration_config.yml
    
          - name: Run the integration tests
            run: ansible-test integration --python 3.7
    
    ワークフローの唯一のエキサイティングなステップは、第4のものです.DigitalAce APIトークンを含む構成ファイルを作成することができます.相談するrender.sh script テンプレートのレンダリングのGoryの詳細については.
    そして、どこに格納されたトークンですか?Gitthubのリポジトリ秘密記憶装置で.公式文書生活here .

    セッティングのGithubのSecsta.
    一旦我々が場所で我々の秘密を持って、そして、ワークフロー記述が約束したならば、我々はGithubに我々の変化をプッシュすることができて、若干のよく値するジェンキンズ映画館を楽しむことができます.

    動作中のGithubアクションからのサンプル出力;

    もっとありますか。


    テストすると表面が擦れた.そして、モジュールのための統合テストをしている間、私たちが堅牢な可用性のコンテンツコレクションを作成することについて真剣であるならば、我々がテストしなければならない他のものがあります.
    もっと学びたいなら、
  • 組み込みドキュメントのテスト
  • モジュールのリンギング
  • ライティングユニットテスト
  • 他の種類の可用性プラグインの統合テストを準備する
  • 他のCI/CDプロバイダとの統合
  • 確認してくださいon-demand webinar about Ansible testing . 我々は、それが不可解な収集メンテナとしてあなたの人生をより簡単にすると保証します.
    乾杯!