Help us understand the problem. What is going on with this article?

Google Apps Script用のテストライブラリ「GASUnit」の紹介

Google Apps Scriptを使うと、手軽にサーバーサイドプログラムを作ることができて便利ですよね。
かくいう僕も、Google Apps Scriptで作ったBOTを社内のSlackで運用しています。1
今回は、僕が作成したGoogle Apps Script用のテストライブラリ「GASUnit」をご紹介します。

Google Apps Scriptの開発手法

Google Apps Scriptには、規模や好みに応じて様々な開発手法が存在します。

一時的に使うような小さなプログラムであればオンラインエディタのみで充分ですが、BOTのように継続的に運用していくものとなると、少なくともソースコード管理はしておきたいところです。
それにくわえて、品質を担保するためのテストコードもあれば最高ですよね?

Google Apps Scriptにおけるテスト

Google Apps Scriptには、標準でテストを実行するための仕組みが存在しません。
ローカルで開発する場合は通常のJavaScriptと同様にMochaJasmineなどのテストフレームワークを使えばいいのですが、オンラインエディタ上で開発する場合はそれらのフレームワークは使えません。
QUnit for Google Apps ScriptというGoogle Apps Script用のテストライブラリもあるにはありますが、QUnitが元となっているため癖があります(テストを実行するためにdoGet関数を用意してウェブアプリケーションとして公開する必要がある)。
そこで、癖のないGoogle Apps Script用のテストライブラリとしてGASUnitを作りました。

GASUnitの特徴

GASUnitでは、テスト結果をGoogle Apps Scriptのログに出力するか、Slackに投稿することができます。
テストの記述スタイルはいくつかある中から選べる……予定なのですが、現時点ではExportsスタイルのみをサポートしています。

使用方法

実際にGASUnitを使用してテストを実行する方法をご紹介します。

ライブラリを追加

リソース -> ライブラリからライブラリのダイアログを開き、以下のプロジェクトキーを入力して追加します。

MSnMmw8hLWgjUG6uKSTQBEzVZgzu5bsVr

eecbb2f7-3cdb-a8d6-3d50-36ed07336859.png

複数のバージョンがありますが、基本的には最新版を選べばOKです(バージョン表記はセマンティックバージョニングに準拠しています)。

c03dcdb8-b0ec-8339-b47b-feccb077b2bf.png

テストコードを書く

例として、Array#indexOfのテストコードをExportsスタイルで書いてみましょう。

使用する関数を変数に代入

ファイルの先頭で、テストに使用するexports関数とassert関数を変数に入れます。
変数に入れずに毎回GASUnit.exportsGASUnit.assertのように書いてもいいですが、こうすることでテストコードが簡潔になります。

テスト結果をログに出力する場合:

var exports = GASUnit.exports
var assert = GASUnit.assert

テスト結果をSlackに投稿する場合:

var WEBHOOK_URL = 'https://...'
var exports = GASUnit.slack(WEBHOOK_URL).exports
var assert = GASUnit.assert

ソースコードを公開する場合はWebhook URLをリテラルとして書くべきではないので、スクリプトのプロパティを使用してください。

var WEBHOOK_URL = PropertiesService.getScriptProperties().getProperty('WEBHOOK_URL')
var exports = GASUnit.slack(WEBHOOK_URL).exports
var assert = GASUnit.assert

あるいは以下のように書くことで、スクリプトのプロパティにWEBHOOK_URLが設定されていればSlackに投稿し、設定されていなければログに出力するようにもできます。

var WEBHOOK_URL = PropertiesService.getScriptProperties().getProperty('WEBHOOK_URL')
var exports = WEBHOOK_URL ? GASUnit.slack(WEBHOOK_URL).exports : GASUnit.exports
var assert = GASUnit.assert

テストを書く

Google Apps Scriptでは関数単位で実行するので、関数の中にテスト処理を記述していきます。
関数名はなんでもいいのですが、Google Apps Scriptの仕様上末尾に_をつけるとプライベート扱いになって実行できないので、末尾に_をつけないようにしてください。

function test_array () {
  exports({
    'Array': {
      '#indexOf()': {
        'should return -1 when not present': function () {
          assert([1, 2, 3].indexOf(4) === -1)
        },
        'should return the index when present': function () {
          assert([1, 2, 3].indexOf(3) === 2)
        }
      }
    }
  })
}

Exportsスタイルでは、引数にオブジェクトを渡して階層構造で記述していきます。
assert関数は引数がtruthyなら成功、falsyなら失敗となる単純な実装です。

あるいは、公式アサーションライブラリのAssertGASを使って、以下のように書くこともできます。

function test_array () {
  exports({
    'Array': {
      '#indexOf()': {
        'should return -1 when not present': function () {
          var index = [1, 2, 3].indexOf(4)
          assertThat(index).is(-1)
        },
        'should return the index when present': function () {
          var index = [1, 2, 3].indexOf(3)
          assertThat(index).is(2)
        }
      }
    }
  })
}

テストを実行

テストが書けたら、Google Apps Scriptの通常の関数と同様に実行するのみです。

テスト結果をログに出力する場合

関数を実行すると、テスト結果がログに出力されます。

成功パターン:
8813f106-094d-0f96-4d8a-6ddd652f48cd.png

失敗パターン:
207c784b-afad-4a46-0851-74f7bb636705.png

テスト結果をSlackに投稿する場合

関数を実行すると、Slackにテスト結果が投稿されます。

成功パターン:
00918694-fb80-3117-9b06-d8ee857c9ec5.png

失敗パターン:
03b15dd8-3ef3-3222-13e5-d46dbb13a61b.png

おわりに

あなたもぜひGASUnitを使って、Google Apps Scriptのテストコードを書いてみてください。
また、GASUnitはオープンソースなので、プルリクエストイシューなどのコントリビュートを歓迎しています!

使用例

munieru_jp
江戸川区在住のアプリケーションエンジニア
https://munieru.jp/
cloud-partner
「クラウドの活用でビジネスを加速させていく」をテーマにAWSの活用を提案するチーム
https://cloud-partner.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした