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

Code

はじまり

135ml
135ml

一旦、あのツールが完成したから、今回はその紹介記事にするぜ・・・

リサちゃん
リサちゃん

お、とうとうあのツールが完成したか・・・

135ml
135ml

そうです。あの「TestGAS」を紹介させていただきまぁぁぁす!

そもそも、なぜ作ったか?

135ml
135ml

リサちゃんは、コーディングするときって、テストコードはもう書くのが当たり前になってるよね?

リサちゃん
リサちゃん

そうだね。テストコードを書いていれば、作った関数とかが何を返してくれる処理なのかが一発で分かって便利だし、関数の性能の担保にもなるからね。

135ml
135ml

うんうん、しかし、実はこのGoogle Apps Scriptには、そのテストコードを走らせるようなテストツールがないのだ・・・

リサちゃん
リサちゃん

Pythonで言うpytestとか、Node.jsで言うJestみたいなツールがないってことだよね?

それは、何か不便だね。

135ml
135ml

うむ、PythonやNode.jsと同様に、Google Apps Scriptで書いたコードも何をしたらその関数が動くかをいちいち覚えてられないので、テストコードを記述したいのだが、それ用のツールが無くて書けなかったんだ・・・

そして、実際に作ったのが「TestGAS」

135ml
135ml

そこで、Google Apps Scriptにテストコードを記述してその動作確認を行うためのツールを作りました。それが「TestGAS」というツールです。

このロゴが目印です。

リサちゃん
リサちゃん

おー、例えばどんな風に動くの?

135ml
135ml

例えば、こんなテストコードを打つとしよう。

テストコード.gs

// content of test_sample.gs
let 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);
}
リサちゃん
リサちゃん

ふむふむ。

135ml
135ml

そして、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ライクに返ってくるねえ。

135ml
135ml

Assertion以外で、普通にコードがミスってたら、Google Apps Script既存のエラーチェックに引っ掛かるので、そこのチェックも大丈夫。

リサちゃん
リサちゃん

おー、使えそうだねえ。

開発で苦労したこと

135ml
135ml

初めてテストツールなるものを作ったから、色々と大変な部分があったが、その中でもかなり印象に残っているのは、thisのバインドとファクトリメソッドのところかな。

この2つは、それぞれ記事にしているので、みなさんもGASとかJavaScriptで何か作る時に参考にしてもらえればと思います。

thisのバインドに関する記事

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

リサちゃん
リサちゃん

ファクトリメソッドにしないと、外部のGASエディタから呼び出せなかったんだよねえ・・・

その他の作成物

135ml
135ml

今回、ライブラリのリファレンスとか初めて書いたよねえ・・・。

そのために使ったのがGitHub Pagesで、Public Repositoryにすれば無料で利用できて、テーマとかもいじれるから、とても便利。

実際に作ったリファレンスのページがこちらになります。

Reference
Top page of reference about TestGAS
リサちゃん
リサちゃん

リポジトリはここだね。

GitHub - landmaster135/TestGAS
Contribute to landmaster135/TestGAS development by creating an account on GitHub.
135ml
135ml

クラスとか関数の設計図はこんな感じになってます。

課題

135ml
135ml

今回、最低限の機能は実装できたと思うんだけど、もう少し欲しい機能があるんだよなあ・・・

リサちゃん
リサちゃん

私としては、この機能が欲しいかなあ・・・

・関数をモックする機能

・網羅率(カバレッジ)を表示する機能

135ml
135ml

うむ、まさしくそれらの機能が無いんだよね・・・

しかし、やり方が分からん・・・

やり方をIssueに載せてくれたり、プルリクして下さるとかなり嬉しいです!

Issues · landmaster135/TestGAS
Contribute to landmaster135/TestGAS development by creating an account on GitHub.

おしまい

135ml
135ml

なんとか、公開できるレベルまで持ってこれて何よりです!

個人的には、とりあえずこれで自作した関数の仕様がテストコードとして書けるようになったから、かなり満足。

リサちゃん
リサちゃん

コードの動きをいちいち確認する作業が省けるねえ!

135ml
135ml

みなさんも使ってみたい場合は、このスクリプトIDを使って利用できると思うので、使ってみて下さい。

1CRjWWWYfjD7WzPl43RB1BiD7XDLJmR03eEpXr2LMh75yAq5qMlczOIfm

以上になります!

コメント

タイトルとURLをコピーしました