単体テストってどうやるの?

その他

こんにちは!ウメハラ(plumfield56)です。

この記事ではGASでの単体テストのやり方をお伝えしていきます。
他の言語でも考え方は同じなのでGAS(JavaScript)がわからない方も参考にできると思います。
想定ケースは他の書いたコードを検証して自分の知識にしたい場合や元々あるコードの動きがわからない場合です。


今回は下記のコードで3行目の処理の内容がわからずにflatメソッドの検証をしたいとします。

function myFunction() {
  const sht = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const ary= sht.getRange('A2:A').getValues().flat().filter(val => val); 

  console.log(idList);
}

その際にケース分けとして下記の2つがあるかなと思っています。

  • 全く見当がつかない場合
  • 動きは検討つくけど自分で使えない場合

全く見当がつかない場合は即調べましょう。
考える時間がもったいないです。

調べ方ときはMDNで

GAS(JavaScript)でプロパティやメソッドを調べたい場合はMDNで調べることをオススメしています。
※スプレッドシート操作などGASでしか使えないものはGASの公式サイトで調べましょう。
理由は下記3点です。

  1. 網羅性が高い
  2. 書き方が統一されているの慣れると理解しやすい
  3. 例題が簡潔でわかりやすい

網羅性が高い

網羅性が高いというのは2つの意味合いがあります。

  • 抜けもれなく構文が載っている
  • 同じメソッドで複数の使い方がある場合にきちんと載っている

後者に関しては特に重要だと思っていて、他のブログでヒットした使い方では特定の用途で使うことを目的に書かれているので、3つ目の引数まで指定できるメソッドだったんだと後で気付くことが多くなります。
pushメソッドとかは見たことなかったのですが、pushした返り値で配列の要素数を返してくれるなどもちゃんと載っています。

書き方が統一されている

2の書き方が統一されていてわかりやすいというのは例えばflatメソッドについて調べた場合はArray.prototype.flat()と出てくるのでこれを見るだけで配列に対して実行可能なメソッドだということがわかります。

最初はMDNの固い感じに抵抗感を感じるかもしれませんが、慣れるとMDNでの検索一択になるぐらい便利なサイトなの慣れていきましょう。

コードの検証方法

手順

メソッドの動きは何となく理解できていることを想定しています。

単体テストの手順
  • STEP1
    何のデータに対して操作しているか把握する

    テキスト,日付,配列,その他どんなオブジェクトに対して処理を使用としているのかを把握する。
  • STEP2
    置き換えて試してみる

    STEP1でデータの種類を把握できた箇所を簡単な内容に置き換えて実行してみる。

単体テストを行う上でこれだけで十分だと思っています。

何のデータに対して操作しているか把握する

では最初に記載した下記コードの3行目のflatメソッドを検証していきたいと思います。

function myFunction() {
  const sht = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const ary= sht.getRange('A2:A').getValues().flat().filter(val => val); 

  console.log(idList);
}

まずflatメソッドがどのようなデータに対して動くメソッドかを正しく把握する必要があります。

もし検証したい箇所のデータ型が何かわからない場合はconsole.log()で確かめてみるとよいです。その際にtypeofを使用するとデータ型を把握できるので場合によっては活用するとよいです。

function myFunction() {
  const sht = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  // const ary = sht.getRange('A2:A').getValues().flat().filter(val => val); 

  console.log(sht.getRange('A2:A').getValues());
 // [[''], [''], [''], ...]
  console.log(typeof sht.getRange('A2:A').getValues()); //
object
}

よく間違えて覚えていて動かないケースもあると思うので、なんのデータに対して実行しているのかは常に意識しましょう。

置き換えて試してみる

上記の緑の箇所に何が入っているかわかったら自分でわかりやすいデータを作って試してみましょう。
今回の場合は二次元配列が入っているので適当に用意します。

function test() {
  const ary = [[1, 2, 3], [4, 5, 6], [7], 8];
  console.log(ary.flat());
 // [ 1, 2, 3, 4, 5, 6, 7, 8 ]
}

自分でデータを作るのがめんどくさければMDNで調べて実行させて理解するのも良いと思います。
基本的には単体テストでの検証はこれの繰り返しです。

その他テクニック

単体テストでしたら検証用の関数を作成するのが良いと思いますが、実際にコードを書いている場面だと途中まではうまくいっているのでそこまでは実行したいけど検証したい箇所以降は実行したくないとうケースも多いと思います。

その時はreturnを活用しましょう。
イメージは下記の様にある程度コードを書いたときです。

function myFunction() {

  // 処理


  // 前の変数を使って検証したい


  // その後の処理も記載されている
  for() {
    //処理
  }
}

その場合は下記の様にreturnを入れて実行するとreturnで処理が止まるので後ろのfor文は実行されずに実行時間をかけずに検証することが可能です。

function myFunction() {

  // 処理


  // 前の変数を使って検証したい

  console.log(検証したい変数);
  return;

  // その後の処理も記載されている
  for() {
    //処理
  }
}

以上単体テストの手順でした。
プログラミングを始めたばかりのころのエラーは、どのようなデータの種類に対して実行できるプロパティやメソッドなのか?が正確に把握できていないから起こることが多いと思います。
エラーが出たら一度冷静に立ち返って一部だけの実行で検証をしていくと良いです。

コメント

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