C言語のテストコードを組み込む方法!UnityとCUnitで初心者でもわかる自動テスト
生徒
「C言語のプログラムを作っていると、正しく動いているか不安になります。何回も実行して動作を確認するのが大変です。」
先生
「その気持ちはとても分かります。そこで役立つのが、テストコードという考え方です。自動的にチェックする仕組みを組み込むことで、毎回手動で確認する必要がなくなります。」
生徒
「自動でチェックできるなら、とても便利そうです。でも難しい技術ですか?」
先生
「難しそうに聞こえますが、初心者でも使える仕組みが用意されています。有名なものにUnityとCUnitがあります。今日はそれらを使って、簡単なテストコードを作る方法を確認してみましょう。」
1. テストコードとは?初心者でも理解できる考え方
テストコードとは、プログラムが正しく動いているかを確認するためのコードです。普段のC言語と同じように書きますが、期待する結果と実際の結果を比較し、間違いがあれば教えてくれる仕組みになっています。プログラムが大きくなると手作業では確認が大変になるため、テストを自動化することでミスを減らせます。
例えば、足し算をする関数を作ったとします。自分の計算が合っているかをいちいち目で確認するのではなく、テストコードに計算を任せると安心です。初心者の学習中でも役に立つため、プログラムを勉強する際にはぜひ覚えておきたい考え方です。
2. Unityとは?軽くて使いやすいC言語用テストフレームワーク
Unityは、小規模なC言語プロジェクトでも使いやすいテストフレームワークです。フレームワークとは、便利な機能がまとまっている道具箱のようなものです。Unityは設定が少なく、簡単な仕組みでテストを書けるため、初心者でも挑戦できます。
まず、テスト対象のC言語ファイルを用意します。下のような足し算関数があるとします。
int add(int a, int b)
{
return a + b;
}
次に、Unityを使ったテストコードを書きます。期待する結果と一致するかをチェックします。
#include "unity.h"
#include "sample.h"
void test_add()
{
TEST_ASSERT_EQUAL(5, add(2, 3));
}
int main()
{
UNITY_BEGIN();
RUN_TEST(test_add);
return UNITY_END();
}
このように実行すると、成功か失敗かを自動で判定してくれます。プログラムを変更した後でも、同じテストを何度も繰り返して確認できるため、安心して修正できます。
3. 実行結果の確認
テストを実行すると、次のような結果が表示されます。
TEST(test_add) PASS
-----------------------
1 Tests 0 Failures
成功したときはPASSと表示され、間違いがある場合にはFAILと表示されます。数字が変だったり、桁を間違えたときにもすぐ気づけます。
4. CUnitとは?パソコン初心者でも使えるテストツール
CUnitは、長く使われているC言語のテストフレームワークです。日本語の情報も多く、初心者の学習に向いています。Unityと同じように、自動でテストを行い結果を表示してくれます。関数の動作確認をする学習や提出課題などで役に立つので、知っておくと便利です。
下のような簡単なテストを書いて使うことができます。
void test_add()
{
CU_ASSERT(add(2, 3) == 5);
}
このような仕組みを使うことで、プログラムが正しいかを自動でチェックできます。手作業では見落としてしまうケースも、機械的にチェックできるため安心です。
5. Makefileにテストコードを組み込む
プログラムのビルド設定に、テストも一緒に実行できるようにすると便利です。テスト用のターゲットを追加しておくと、コマンド一つでチェックできるので学習がスムーズになります。
test:
gcc main.c test.c -o test
./test
このように書いておくと、testというコマンドを実行するだけで動作確認ができます。毎回手でコンパイルする必要がないため、ミスの防止にもつながります。
6. テストコードがあると安心できる理由
テストコードを作っておくと、プログラムが正しいかを目で見て確認しなくても済みます。作った機能が動いていることを証明できるため、後から修正しても安心できます。自分のプログラムに自信が持てるようになるため、学習のモチベーションにもつながります。
また、他の人にプログラムを渡すとき、テストがあると動作が保証されていることを示せるため、信頼性が上がります。小さなプログラムでもテストを付ける習慣を身につけると、将来の開発でも役に立ちます。
まとめ
C言語にテストコードを組み込む意味を振り返る
今回の記事では、C言語のプログラムにテストコードを組み込む方法について、UnityとCUnitという代表的なテストフレームワークを使いながら確認してきました。C言語は処理が速く、制御が細かくできる反面、ちょっとしたミスが不具合につながりやすい言語でもあります。そのため、プログラムが正しく動いているかを確認する仕組みをあらかじめ用意しておくことが、とても重要になります。
テストコードは、プログラムの品質を守るための保険のような存在です。自分で目視確認をするだけでは見逃してしまう計算ミスや条件分岐の抜けも、自動テストであれば毎回同じ基準でチェックできます。特に、関数単位で動作を確認できる点は、C言語の学習や課題制作、業務での開発において大きなメリットになります。
UnityとCUnitを使うメリット
Unityは設定が少なく、短いコードでテストが書けるため、C言語の初心者でも扱いやすいのが特徴です。一方、CUnitは歴史があり、資料や解説が豊富で、基礎をじっくり学びたい人に向いています。どちらも「期待した結果」と「実際の結果」を比較するという考え方は共通しており、一度理解すれば他のテストツールにも応用できます。
テストコードを書く習慣が身につくと、プログラムを修正することへの不安が減ります。処理を変更したあとでも、テストを実行するだけで問題がないかを確認できるため、安心して改善を続けられます。この安心感は、学習を継続するうえでも大きな支えになります。
まとめとしての簡単なサンプルテスト
最後に、今回学んだ考え方を思い出すための、とてもシンプルなテスト例を見てみましょう。数値を比較して正しいかを確認する、基本的なテストです。
#include "unity.h"
int sub(int a, int b)
{
return a - b;
}
void test_sub()
{
TEST_ASSERT_EQUAL(2, sub(5, 3));
}
int main(void)
{
UNITY_BEGIN();
RUN_TEST(test_sub);
return UNITY_END();
}
このように、C言語の関数とテストコードをセットで書くことで、「この処理は正しい」という根拠を自分で確認できます。難しいことをしているように見えても、中身はとてもシンプルです。基本を理解しておけば、どんな規模のプログラムにも応用できます。
生徒
「最初はテストコードって難しそうだと思っていましたが、関数の結果を確認するだけなら意外とシンプルなんですね。自分の書いたC言語のコードを、機械にチェックしてもらえる感じがしました。」
先生
「その感覚で合っています。テストコードは、プログラムの正しさを自分で証明するための道具です。C言語は自由度が高い分、テストがあると安心して書き進められます。」
生徒
「これからは、関数を作ったらテストも一緒に書くようにしてみます。動いているか不安になる時間が減りそうです。」
先生
「それはとても良い習慣です。小さなプログラムでもテストを書く経験を積んでおくと、将来大きな開発に関わったときに必ず役に立ちます。C言語とテストコードをセットで覚えていきましょう。」