Dreddを使用してAPIをテストする - 株式会社CoLabMix

Dreddを使用してAPIをテストする

開発部の三浦です。
今回はDREDDを使用してAPIをテストする方法を書いていこうと思います。

Dreddとは

openapi(swagger)API Blueprintの定義を読み込んでテストを実行できる便利なツールです。
hooksという仕組みを使うと、リクエストに動的に値を組み込んだり、レスポンスで返ってきたtokenをセットし認証な必要なテストを実行したりということが可能になります。

 

dredd hooks

hooksは様々な言語で書くことができます。
  • GoNode.js (JavaScript)
  • Perl
  • PHP
  • Python
  • Ruby
  • Rust
といった言語に対応しています。自分の得意な言語を選択して記述することができます。
私はJavaScriptをよく触っていたので、今回はJavaScriptで記述していこうと思います。
それではサンプルのファイルを作成し実際にできるところまで進めていきます。

ディレクトリの作成

Dreddのインストール

 

ローカルサーバーの立ち上げ

今回はjson-serverというモジュールを使用し簡易的に使用できるデータベースを作成します。
詳しく知りたい方は以下の記事を参考にするとかなり詳しく解説してくださっています。

 

json-serverのインストール

db.jsonファイルが作成されますのでそちらを編集します。

 

openapi.ymlの作成

openapiファイルには以下を記述します

 

hookファイルの作成


ファイルの準備がととのいましたので
以下のコマンドでlocalhost3000に簡易サーバーを立ち上げます

 

もう一つのターミナルでdreddのテストを行います。

 

テストが二つ行われ2つとも通ったことが記述されています。
ローカルサーバーにも

レスポンスがきていることが確認できます。

Hookとは

それではここからhookについて解説していきます。
公式によると
Dreddは、各テストステップの前後に実行される任意のコードのブロックであるフックをサポートします。概念は、XUnitの機能、Cucumberフック、またはGitフックに似ています。フックは通常、次の目的で使用されます。

各テストステップというのは
今回で言うと
  • /users get
  • /users post
この2つのことを指します。
このテストステップのことをdreddはTransactionと呼んでいます。
このTransactionというものの前後に処理を組み込めるというのがHookです。
jsでは以下のものが用意されていますので確認して見てください。

Hookの使い方

では実際に二つ目のTransactionである/users postを指定し、
別の値を入れてpostしてみようと思います。

 

Tranactionの指定

hooks関数は引数にTranactionの名前をとります。
Tranactionの名前の取り方は --namesオプションで確認することができます。

このinfo:部分がtransactionの名前です。この部分を指定することで処理を挟み込むことができます。

 

hooks.log

ターミナルにログを出力してくれます。console.logと使い方はほぼ一緒ですが引数は一つしか取れません。

 

hooks.jsの編集

dreddを起動します

データベースの値を確認してみると

書き換えた値が入っていることが確認できました。

 

stashの使い方

dreddが提供しているものとしてstashを利用してテストステップ間でデータを受け渡すことができます。
例えばログイン後の認証情報を使ってテストを実行したい場合などに使用できます。
ブログでは使用していませんが例えばuser/loginの処理の後に
上記の処理を付け加えると認証情報を取得し以降ヘッダーに組み込んでくれます。

 

axiosとの連携

他にも、例えばTwitterのいいね機能などのテストでは、
  • テスト前に現在のいいね数を取得
  • いいねのレスポンスを送信
  • いいねがつけれた事と、実際にいいね数が増えたかまで確認してテストを通す
というテストまで行いたいです。
その時は
冗長にはなってしましますが、テスト前にaxiosで通信を行い、差異を確認という処理をすることができます。
以上になります。お読みいただきありがとうございました。

 

このブログは株式会社CoLabMixによる技術ブログです。

GCP、AWSなどでのインフラ構築・運用や、クローリング・分析・検索などを主体とした開発を行なっています。

Ruby on RailsやDjango、Pythonなどの開発依頼などお気軽にお声がけください。

開発パートナーを増やしたいという企業と積極的に繋がっていきたいです。

お問い合わせやご依頼・ご相談など

    関連記事

    1. [ Rails : アンチパターン ] Validation しすぎで…

    2. IT完全未経験からWebエンジニア転職の為に行った活動

    3. VagrantでCentOS7の環境を作る

    4. CentOS 7で firewalld の設定

    5. 【Django】入力フォームの増減機能からDBに保存する方法

    6. Elasticsearch 6 を使ったデータ検証 その6( Aggr…