【GAS】Google Apps Scriptで作った自作関数に対してテストコードを書けるライブラリ「TestGAS」を作りました!
はじまり



そもそも、なぜ作ったか?
テストコードを書いていれば、作った関数とかが何を返してくれる処理なのかが一発で分かって便利だし、関数の性能の担保にもなります。
しかし、Google Apps Scriptには、そのテストコードを走らせるようなテストツールがありません・・・。 Pythonで言うpytestとか、Node.jsで言うJestみたいなツールがないってことです。何か不便です。
PythonやNode.jsと同様に、Google Apps Scriptで書いたコードも何をしたらその関数が動くかをいちいち覚えてられないので、テストコードを記述したいのだが、それ用のツールが無くて書けないのが課題でした・・・。
そして、実際に作ったのが「TestGAS」
そこで、Google Apps Scriptにテストコードを記述してその動作確認を行うためのツールを作りました。それが「TestGAS」というツールです。
このロゴが目印です。

例えば、こんなテストコードを打つとします。
// content of test_sample.gslet tester = TestGAS.createExecutor();
function sample(x){ return x + 1;}
class Test_sample{ test_sample_1(){ tester.assertEquals(sample(2), 4); } test_sample_2(){ tester.assertNotEquals(sample(2), 4); }}
function execute_Test_sample(){ let failureFuncs = tester.executeTestGas(Test_sample);}そして、execute_Test_sampleを実行すると、こんな結果が返ってきます。
[ 'test_sample_1', 'test_sample_2' ]TestGAS starts: "Test_sample"...... TestGAS terminated: "Test_sample".====================================================== FAILURES ======================================================______________________________________________ test_sample_1 ______________________________________________AssertionError: Actual value is not equal to Expected value. actual : 3 expected: 4=================== 1 failed, 1 passed of all 2 tests in 0.01 seconds ===================pytestライクに返ってきます。
Assertion以外で、普通にコードがミスってたら、Google Apps Script既存のエラーチェックに引っ掛かるので、そこのチェックも大丈夫です。
開発で苦労したこと
初めてテストツールなるものを作ったから、色々と大変な部分があったが、その中でもかなり印象に残っているのは、thisのバインドとファクトリメソッドのところかな。 その2点は、それぞれ記事にしているので、みなさんもGASとかJavaScriptで何か作る時に参考にしてもらえればと思います。 ファクトリメソッドにしないと、外部のGASエディタから呼び出せないんですよね・・・。
thisのバインドに関する記事:

ファクトリメソッドに関する記事:

その他の作成物
今回、ライブラリのリファレンスとか初めて書きました・・・。 そのために使ったのがGitHub Pagesで、Public Repositoryにすれば無料で利用できて、テーマとかもいじれるから、とても便利。 実際に作ったリファレンスのページがこちらになります。
リポジトリはここです。
クラスとか関数の設計図はこんな感じになってます。

課題
今回、最低限の機能は実装できたと思いますが、実はもう少し欲しい機能があります・・・。どうすればいいのか・・・。
- 関数をモックする機能
- 網羅率(カバレッジ)を表示する機能
おしまい



1CRjWWWYfjD7WzPl43RB1BiD7XDLJmR03eEpXr2LMh75yAq5qMlczOIfm以上になります!
記事を共有
この記事が役に立ったなら、ぜひ他の人と共有してください!