みなさん、こんにちは! タカハシ(@ntakahashi0505)です。
ノンプログラマーは業務を自動化したり、便利ツールをつくったりするために、VBAやGoogle Apps Scriptなどのプログラミングを活用しています。
しかし、少なくないノンプログラマーが、「なんとなく」「適当に」やってしまっているのが、プログラムの「テスト」です。
今回は、ノンプロ研で『テスト自動化実践ガイド』の著者でいらっしゃる末村拓也さんをゲストとしておよびして開催したイベント「ようこそ、ソフトウェアの世界へ!」から、テストとその難しさについて考えます。
ということで、今回は「ノンプログラマーは知らないソフトウェアテストとその難しさ」についてお伝えします。
では、行ってみましょう!
テストとは
「テスト」とは…と言われると構えてしまいがちですが、実はシンプルなもので、「作ったプログラムがちゃんと動くかをチェックすること」をいいます。
ノンプログラマーの場合、業務改善や業務自動化でプログラムをつくるケースがあります。
たとえば、スプレッドシートのシートをPDF化してメール添付して上司に送るなどです。
多くの場合、プログラムを正しいPDFがつくれたか、それを上司宛に送れたかなどを、プログラムをつくったあとにチェックはするので、テストはしているといえます。
でも、よりプログラムが複雑になったり、チームで開発をするようになったりすると、テストの難しさがぐっと上がります。
そんなときに、もっと効率的に、効果的にテストをするとよいのですが、ノンプログラマーの場合、そのような発想はないことが少なくありません。
ようこそ、ソフトウェアテストの世界へ!
さて、先日ありがたいことに、元ノンプログラマーであり、『テスト自動化実践ガイド』の著者でいらっしゃる末村拓也さんをゲストにお呼びし、本職のITエンジニアのみなさんがやっている、ソフトウェア開発に欠かせない「テスト」の話をうかがう機会がありました。
- テストってそもそも何?
- テストをちゃんとすると何がうれしいの?
- なぜ自動化するといいの?どのように自動化するの?
そういったことを、基本のキから教えていただく機会として、ノンプロ研公開イベント「ようこそ、ソフトウェアテストの世界へ!」を開催しました。
その開催レポートをお送りしていきます。
テストの難しさ
因子と水準
テストの難しさの一つは、テストしなくてはいけないパターンが指数関数的に増えがちという問題にあります。
やや難しそうな言葉ですが「因子と水準」という概念があります。
たとえば、簡単なWebフォームを考えましょう。小学校の学生名簿を入力するWebフォームです。ユーザーが入力、送信すると、その内容に応じて何かガシャガシャするというものです。
因子というのは、このプログラムでいうと「名前」「学年」「クラス番号」「出席番号」などといった、枠のようなもののことをいいます。
また、「水準」というのは、それぞれの枠に入力されるデータの範囲です。「学年」であれば1~6の整数、「クラス」であれば1以上クラスの数までの整数、「名前」は任意の文字列です。
このWebフォームとそのプログラムをテストしたいときを考えます。
理想は、全部の枠に、受け入れるべき範囲のすべてのデータを入力する、その組み合わせすべてのパターンで正しい動作をするかテストするというものです。
でも、各因子の範囲の掛け算で膨大なパターン数になりますので、ものすごい工数がかかってしまいます。
制御パス
もうひとつ「制御パス」というのもテストを難しくする要因です。
プログラムは命令の集まりで、基本は上から順に実行されます。しかし、ときに条件によって分岐や繰り返しといった「制御」があり、その制御によって命令の流れが変わります。
この命令の流れを制御パスといいます。
プログラムをテストする際に、理想はすべての制御パスを通った場合について正しく動作するかチェックしたいのですが、プログラムの規模が大きくなると、制御パスの数は指数関数的に増えるという問題にぶち当たります。
バージョンアップ
もうひとつ、「バージョンアップ」もテストを難しくする要因です。
1回つくって、テストして、完成したプログラム。それを一生そのまま使えればよいのですが、そうとも限りません。
少なくないソフトウェアは、状況や環境の変化やより大きな期待を理由に、修正や機能追加が加わります。
たとえば、毎月のように機能が追加されるとします。
理想としては、新しくいじった部分だけテストをしたいのですが、実はそうもいきません。
新しい要件によって、過去につくって安定稼働していたプログラムにも影響を及ぼす可能性が出てきます。「影響がない」とはっきり判断できればいいのですが、その判断は熟練のエンジニアでないと難しいのです。
結果的に、バージョンアップのたびに、過去につくったプログラムも含めてテストをする必要が出てきます。つまり、バージョンアップを繰り返すたびに、毎回のテストの工数が増大していってしまうのです。
と、このようにテストには難しさがあります。
しかし、本職のITエンジニアのみなさんは、それに対抗するテストのノウハウを持ち、それで対抗をしています。そのひとつが「テストの自動化」ということになります。
テストの自動化については、次の機会でお伝えしていきます。どうぞお楽しみに。
まとめ
以上、「ノンプログラマーは知らないソフトウェアテストとその難しさ」についてお伝えしました。
引き続き、みなさんがいきいきと学び・働くためのヒントをお届けしていきます。次回をお楽しみに!
この話を耳から聴きたい方はこちらからどうぞ!