見出し画像

【テスト自動化】JenkinsでTavernを使用したAPIテスト構築

はじめに

こんにちは。SHIFTのテスト自動化エンジニアの松岡です。
Tavernは、yamlに期待値を記載するだけで、APIのレスポンスJSONのアサーションを行うことができるテストツールです。
今回は実装したTavernのAPI自動テストを、Jenkinsで実行できるようにする方法をご紹介致します。

◆前提条件

  • 使用するサーバはLinux

  • Jenkinsがマスター(コントローラー)となるサーバにインストールされ使用できるようになっていること。

  • AllureプラグインがJenkinsにインストールされ、使用可能になっていること。

  • DockerがJenkinsエージェントとなるサーバにインストールされていること。

  • Jenkinsノードの設定が完了していること。

◆全体構成図

システム構成は以下の通りです。

[Tavern-Jenkins構成]

◆必要ファイル準備

必要なファイルは以下の3つです。

【1】Dockerfile

FROM python:3.7.15-alpine3.17

ENV TZ='Asia/Tokyo'

COPY requirements.txt
RUN apk add gcc g++
RUN pip install --upgrade pip
RUN pip install -r requirements.txt

COPY ./entrypoint.sh /
RUN chmod +x /entrypoints.txt

ENTRYPOINT ["/entrypoint.sh"]

Dockerで実行する場合に必須のファイルです。
`FROM`にてpythonを指定します。バージョンは必要に応じて変更してください。
なお、プロキシ環境では`ENV`に`HTTP_PROXY`、`HTTPS_PROXY`の設定を追加する必要がありますので、ご注意ください。

【2】entrypoint.sh

#!/bin/sh

OUTPUT_PATH=allure-output
rm -rf ${OUTPUT_PATH}
mkdir -p ${OUTPUT_PATH}

py.test -p no:chacheprovider --alluredir=${OUTPUT_PATH}/report $@
exitStatus=$?

echo "end test"
exit $exitStatus

実際にテストを実行するシェルです。
Docker内でこのシェルが動くことにより、テスト実行とレポートファイルの生成を行います。
`OUTPUT_PATH`は任意に変更可能です。

【3】requirements.txt

pytest==7.2.0
tavern=1.24.1
allure-pytest==2.12.0
pykwalify==1.8.0

実行に必要なツールとそのバージョンを記載します。

  • pytest, tavern: API自動テスト実行

  • allure-pytest: Allureレポート用ファイル生成

  • pykwalify: yamlファイルのバリデーション

◆ビルドイメージ作成

上記3つのファイルを同じ階層に配置したら、Jenkinsのスレーブにログインし、ビルドイメージを作成します。
ここでは例として「test_u」というユーザのhomeディレクトリに「tavern_test」というディレクトリを作成してファイルを配置した想定で説明します。

[test_u@jenkins_agent ~]$ cd tavern_test
[test_u@jenkins_agent tavern_test]$ sudo docker build . -t tavern-test:latest

パラメータ-tに「tavern-test:latest」を渡しています。
こうすることで、docker実行時にパラメータ「-it」で指定できるようになります。

◆Docker実行

イメージを作成したら、予めDockerを実行しておきます。
その際、テストケースを格納したディレクトリをDockerにマウントする必要があります。ここでは例として、「/home/test_u/tavern_test/yaml」というディレクトリをマウントします。

[test_u@jenkins_agent tavern_test]$ pwd
/home/test_u/tavern_test
[test_u@jenkins_agent tavern_test]$ cd yaml
[test_u@jenkins_agent yaml]$ docker run --name tavern_exe -v `pwd:/yaml --entrypoint="sh" -it tavern-test

先ほど作成した`tavern-test`というイメージ名をここで使用しています。
また実行中となるDockerに対してもここでパラメータ「--name」で`tavern_exe`と指定しています。
この値を設定すると、Jenkinsジョブから簡単に実行中のDockerを指定できます。

◆Jenkinsジョブの設定

テストケースのyamlとDockerが準備できたら、最後はJenkinsジョブの設定です。ここの例では、Jekinsのパイプライン設定で「Pipeline scripe from SCM」を選択しておき、Jenkinsfileを作成してGitに登録します

Jenkinsfile

pipeline {
      agent { label "jenkins_agent" }
      tools {
            allure "allure2.x.x"
      }

      stages {
            stage('Tavern Test') {
                  steps {
                        sh """
                           echo 'Start Tavern Test'
                           cd /home/test_u/tavern_test/yaml
                           docker exec tavern_exe /entrypoint.sh /yaml
                        """
                  }
            }
            stage('Allure Report') {
                  steps {
                        sh """
                           docker cp tavern_exe:/allure-output/report ./                           
                        """
                        script {
                              allure({
                                 includeProperties: false,
                                 properties: [],
                                 reportBuildPolicy: 'ALWAYS',
                                 results: [[path: 'report']]
                              })
                        }
                  }
            }
      }
}

Jenkinsfile全体は以上のようになります。
順番に見ていきます。

agent { label "jenkins_agent" }
tools {
       allure "allure2.x.x"
}

`agent`で、ジョブを実行するエージェントを指定します。
`docker run`を行ったサーバのノード名を指定します。
(Jenkinsの管理>ノードの管理に表示される値)  
`tools`では、レポート生成に使用するAllureを指定します。
括弧内は実際にJenkinsで設定した名前に置き換えてください。
(Jenkinsの管理>Global Tool Configuration>インストール済みAllure Commandlineの名前)

stage('Tavern Test') {
      steps {
            sh """
               echo 'Start Tavern Test'
               cd /home/test_u/tavern_test/yaml
               docker exec tavern_exe /entrypoint.sh /yaml
            """
       }
}

テスト実行するstageです。
yamlのあるディレクトリに移動したあと、`docker run`を行った際に指定した「name」を使用して、実行中のdockerを特定しています。
なお、ここではyamlファイルを直接配置している想定ですが、Tavern Testの前にstageを追加し、Gitからyamlファイルを(dockerが)マウントしているディレクトリに配置して実行することもできます。

stage('Allure Report') {
      steps {
            sh """
               docker cp tavern_exe:/allure-output/report ./                           
            """
            script {
                  allure({
                     includeProperties: false,
                     properties: [],
                     reportBuildPolicy: 'ALWAYS',
                     results: [[path: 'report']]
                  })
            }
      }
}

Allureレポートを生成するstageです。
shブロックでは、生成されたレポート用ファイルをdocker内からJenkinsエージェントのディレクトリにコピーしています。

コピー元のディレクトリは、entrypoint.shでパラメータ「--allure-dir」に指定したものと同じディレクトリを記載します。

あとはジョブを実行するとJenkinsの画面からTavernで実行したAPIテストのAllureレポートが参照できるようになります。

※ エディタの都合上インデントがずれてしまう場合があります。コピペ時にお手元でご確認ください。


執筆者プロフィール:松岡 直人
SIerでのJava、jqueryの開発経験を経て、SHIFTに入社。 SHIFTでは入社当初より画面/APIテスト自動化に関わる。 「人間が最低限しか頑張らない自動化」を目指している。

お問合せはお気軽に
https://service.shiftinc.jp/contact/

SHIFTについて(コーポレートサイト)
https://www.shiftinc.jp/

SHIFTのサービスについて(サービスサイト)
https://service.shiftinc.jp/

SHIFTの導入事例
https://service.shiftinc.jp/case/

お役立ち資料はこちら
https://service.shiftinc.jp/resources/

SHIFTの採用情報はこちら
https://recruit.shiftinc.jp/career/