現実問題 main 関数の中身がぐちゃぐちゃになるのはしょうがないところがあります。
コマンドラインツールをNode.jsで作ってて、コマンドライン引数process.argv
に追従して動作が変わるようなことになればmain全体をテスト仕切る事は大変です。
初めてユニットテストを書いているのですが、
ユニットテストは和訳すると単体試験(単体テスト)です。
質問文のmain
関数のすべての挙動をテスト・確認することではありません。
main
関数をテスト・確認するのは結合テストや総合テストの分野になります。
ユニットテストに該当するのは質問文のfunc1
やfunc2
を指します。
このfunc1
やfunc2
が完璧に動作できるとユニットテストで証明できた後、
もしmain
関数内で変な動作が出たのであれば、
whileやif文の使い方が間違っているだけって事がわかるでしょ?
ユニットテストに適したコード設計などあるのでしょうか?
「テストしやすいコード」を書くことが重要になります。
この「テストしやすいコード」とはなんぞや?というわけで、多くのITエンジニア達が勉強・研究してきました。
なので「テストしやすいコード」などで検索すると色々出てきます。
例としてはこの記事
テストしやすいコードについて考えてみた | 株式会社クイックのWebサービス開発blog
その中でも数学の関数の定義に近い挙動をする関数を作る事を推奨します。
どういうことか?というと
「この引数を入れて関数を実行すると、必ずこの戻り値が帰ってくる」という関数を作る事です。
fizzbuzzなんかがわかりやすいですね。
js
1const fizzbuzz = it => {
2 if (it % 15 === 0) return "FIzzBuzz";
3 if (it % 3 === 0) return "Fizz";
4 if (it % 5 === 0) return "Buzz";
5 return it;
6}
7
8// 2回実行したからと言って結果が変わる訳では無い
9console.log(fizzbuzz(3)); // Fizz
10console.log(fizzbuzz(3)); // Fizz
実際にはこのような一発で表現できる問題は少ないですが、
JavaScriptの引数には関数やオブジェクト、配列等を好き勝手指定できるので、
複雑な処理も、ちゃんと練って設計すれば、このような形に落とし込む事ができます。
……が、まずはこのように書きやすい箇所を抽出して関数化
関数化できたものをユニットテストで検証するようにする習慣を見に付けてください。
参考になるサイトなどがあれば教えていただきたいです。
和田卓人氏が書いた「テスト駆動開発」という書籍を読むことを勧めます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。