Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】Test your MiniScript code!

2025年09月20日に「Dev.to」が公開したITニュース「Test your MiniScript code!」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

MiniScriptでQAモジュールを使ったTDD(テスト駆動開発)の基本を解説。コードを書く前にテストを作成し、エラー修正と機能追加を繰り返す開発サイクルを示す。シンプルな加算関数の例で、バグの少ないコードを効率的に書く手法を学ぶ。

出典: Test your MiniScript code! | Dev.to公開日:

ITニュース解説

プログラミングでシステムを開発する際、書いたコードが期待通りに動くかを確認することは非常に重要だ。たとえ小さな変更であっても、それが予期せぬ問題を引き起こす可能性は常にある。このような問題を未然に防ぎ、コードの品質を保つために「テスト」という工程がある。テストを早い段階から積極的に行うことで、バグを早期に発見し、開発の効率を高めることができる。MiniScriptというプログラミング言語にも、このテストを助ける「QAモジュール」という仕組みが用意されている。ここでは、このQAモジュールと、それを活用した「テスト駆動開発(TDD)」という開発手法の基本的な流れを、具体的な例を通して解説する。

まず、MiniScriptでテストを始めるには、QAモジュールを自分のプログラムファイルに「インポート」する必要がある。QAモジュールはMiniScriptに標準で含まれているため、特別なインストールは不要だ。ファイルの先頭に「import "qa"」と記述するだけで、このモジュールが提供する便利な機能が利用可能になる。QAモジュールは、assertassertEqual といった「アサート関数」と呼ばれるものを提供する。これらの関数は、特定の条件が満たされているか(例えば、計算結果が期待する値と一致するか)を確認し、もし満たされていなければテスト失敗として報告する役割を果たす。assertは指定された条件が真であるかを、assertEqualは二つの値が等しいかをそれぞれ確認する。

次に、TDDの基本的な考え方である「コードを書く前にテストを書く」というステップに移る。この手法では、まずどのような機能が欲しいかを考え、その機能が正しく動くことを確認するためのテストコードを先に作成する。例では、2つの数値を加算するシンプルな関数を作ることを想定し、そのテストから書き始める。テストコードは通常、runUnitTests のような関数にまとめられる。ここでは、「1と1を加算したら2になるはずだ」という期待を込めて、「qa.assert add(1,1) == 2, "Test add 1,1 results in 2"」というテストを記述する。この行は、add(1,1) の結果が2と等しいことをqa.assertで確認し、もし異なれば指定されたメッセージを表示するという意味だ。このテスト関数を呼び出すことで、書かれたテストが実行される。

この状態でプログラムを実行すると、当然ながら「Runtime Error: Undefined Identifier: 'add' is unknown in this context」というエラーが発生する。これは、まだadd関数が定義されていないためだ。しかし、このエラーはテストが正しく動作していることを示すものであり、TDDにおいては想定内の結果となる。このステップで、テスト環境が機能していることを確認できたことになる。

次に、このエラーを修正する段階だ。add関数が存在しないというエラーを解消するため、ひとまずadd = function(a,b) end function のように、引数を受け取るだけの空の関数を定義する。この修正でプログラムを再度実行すると、今度は「Assert failed: Test function add results in 2 for input a=1 and b=1」というメッセージが表示される。これは、add(1,1) が2を返さなかったために、qa.assertが失敗したことを意味する。空の関数は何も返さないため、この結果もまた予想通りだ。TDDでは、ここで最もシンプルな方法でテストを成功させることを目指す。例では、add関数を一時的に return 2 とする。この状態でもう一度実行すると、今度はテストが成功し、エラーは表示されない。この時点では、add関数は常に2を返すだけで、汎用的な加算機能としては不十分だが、書かれた1つのテストケースは通過している。

しかし、これで完全に正しいコードが書けたわけではないことは明らかだ。汎用的な加算関数としては、他の数値の組み合わせでも正しく動作する必要がある。そこで、「qa.assert add(2,3) == 5, "Test function add results in 5 for input a=2 and b=3"」のように、別のテストケースを追加する。この状態で再びテストを実行すると、当然ながら「Assert failed: Test function add results in 5 for input a=2 and b=3」というメッセージが表示され、今度は2と3の加算テストが失敗する。これは、先のadd関数が常に2を返すように作られているためだ。この失敗を受けて、ようやくadd関数を汎用的な加算処理を行うように修正する。具体的には、add = function(a,b) return a + b end function と書き換える。この修正により、プログラムは再び実行可能になり、今度は全てのテストケースが成功する。このように、テストを書き、失敗させ、最小限の修正でテストを成功させ、さらにテストを追加していくというサイクルを繰り返すことで、徐々にコードを改善し、堅牢な機能へと育てていくのがTDDの基本的な流れである。

最後に、作成したテストコードをプログラムの利用方法に応じて適切に実行するための工夫についても触れておく。開発したプログラムが他のプロジェクトから「モジュール」として利用される場合、テストコードが自動的に実行されてしまうと都合が悪いことがある。このような場合のために、MiniScriptでは「if locals == globals then runUnitTests」という慣用的な書き方が存在する。この記述は、プログラムが直接実行された場合にのみrunUnitTests関数(テストコード)を呼び出し、他のプログラムからインポートされた場合にはテストをスキップするという意味だ。これにより、モジュールとしての利用と単体テストの実行の両立が可能になる。

このように、MiniScriptのQAモジュールを活用し、テスト駆動開発のワークフローに従うことで、より信頼性の高い、バグの少ないコードを書くことができる。この手法は、今回のような小さな例だけでなく、大規模なプロジェクトにおいても非常に有効であり、システムエンジニアを目指す上ではぜひ習得しておきたい重要なスキルの一つだ。

関連コンテンツ