10
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Newman (Command line Postman) をGitHub Actionsで動かしてAPI結合テストを自動化した

Posted at

はじめに

Postmanを使ってRESTful API開発の動作検証を毎回ローカルで手動実行していましたがまあ面倒でした。
調べたらNewmanというPostmanのランナースクリプトをCLIで実施できるツールが公式から提供されていると知ったのでGitHub Actionsに組み込んで楽になりました。

GitHub Actionsで動かすまでがちょっと時間がかかったので知見をシェアする記事になります。

前提

Main content

GitHub ActionsのWorkflow上でNewmanを実行させテストが通った設定を記載します。

構成

├── Dockerfile
├── docker-compose.yml
├── docker-compose.ci.yml
├── .github/workflows/
│   ├── test.yml

Docker Compose files

docker-compose.yml
version: '3'
services:
  api:
    container_name: api-server
    build: .
    ports:
      - "5000:5000"
      - "8081:8081"
    environment:
      - DB_USER=root
      - DB_PASS=mysql
      - DB_PORT=3306
      - DB_HOST=db
      - DB_DATABASE=great_db
    depends_on:
      - db

  db:
    image: mysql:5.7.22
    container_name: mysql
    command: mysqld --character-set-server=utf8mb4
    volumes:
      - ./db/init:/docker-entrypoint-initdb.d
      - ./db/mysql/conf.d:/etc/mysql/conf.d
    restart: always
    hostname: db
    environment:
      - MYSQL_ROOT_PASSWORD=mysql
      - MYSQL_DATABASE=mixlunch
docker-compose.ci.yml
version: '3'
services:
  db:
    ports:
      - "13306:3306" # ポイント①

GitHub Actions Workflows Yaml file

.github/workflows/test.yml
name: Test
on: push
jobs:

  integration:
    name: Integration test
    runs-on: ubuntu-latest
    steps:

    - name: Setup for integration test
      run: sudo npm install -g newman # ポイント②

    - name: Checkout code
      uses: actions/checkout@v2

    - name: Build the docker-compose stack # Docker Composeを実行
      run: docker-compose -f docker-compose.yml -f docker-compose.ci.yml up -d

    - name: Sleep to wait for preparing of containers
      run: sleep 15 # ポイント③

    - name: Run test suite #Newmanコマンドを実行しテスト実施
      run: newman run -e Local.postman_environment.json postman_collection.json

ポイント

ポイント① Ubuntu GitHubホストランナーにはMySQL, npm, Docker Composeなどがプリインストールされている。

Software installed on GitHub-hosted runnersのページで確認することができますが、GitHub ActionsのランナーのUbuntuにはメジャーなミドルウェアやツール、プログラミング言語のランタイムがインストール済みです。

なので今回MySQLコンテナのポートを3306で外開けすると既にGitHubランナーがMySQLを持っていてポートを確保しているのでWorkflow上でNGが出ました。そのためCI用に差別化ファイルを作る意味でも13306ポートで上書いています。

ポイント② Ubuntu GitHubホストランナーはWorkflow上でsudoし放題

Newmanはデフォルトでインストールされていないのでインストールされているnpmを使ってnpm install -g newmanでコマンドをインストールしようとしましたが権限エラーが出ました。

調べると、GitHub ActionsのWorkflow上では公式ドキュメントのこちらにあるように

The Linux and macOS virtual machines both run using passwordless sudo. When you need to execute commands or install tools that require more privileges than the current user, you can use sudo without needing to provide a password.

とパスワードとか無しでsudoを使えるとのことでそうしたら確かにNewmanがインストールできました。

ポイント③ Dockerコンテナの準備が整うまでNewman実行を待つ

docker-compose up -dのコマンドとしての終了直後にNewmanを実行してもMySQLコンテナの準備が完了しておらずでテストがNGになってしまったので力技でsleepコマンドを使うことで今回は15秒待たせました。
15秒はローカルで試したちょっと余裕あるなとわかった数字なだけで根拠無しです。
イケてないのでうまいやり方が見つかればアップデートします。

おわりに

Newmanで利用するPostmanのテストスクリプトをきちんとすればアプリケーション内のテストで、MySQLを立ち上げ→テーブル作成→Fixture挿入→Truncate処理という開発コストのかかる操作をせずともCIで結合レベルの自動テストができることがわかりました。

Postman、Newmanというツール依存になるので汎用性とのバランスになりますがPostmanでのGUI上の操作管理のしやすさを考慮するとスピード感で出て非常に良いソリューションだと感じます。

参考

10
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?