単体試験をして良かったと思った話

 組み込み開発でCppUTestを使っている話は、以前書いた。実機でテストする前に、せっせとMOCK関数を作って、PC上で試験している。目的は、開発時間の短縮なので、何でもかんでもやっているわけではない。数行の、どう考えても問題なさそうな関数はやらないし、MOCKを作るのがあまりに大変そうなら、これもやらない。
 1関数20行を超えるあたりで、できる限り単体試験をやろうと思っている。
 単体試験をやらずに、実機でテストしていたら見つからなかっただろうなあ、というケースがあった。ある関数の引数を、構造体のポインタ渡しにすべきところを、値渡しにしていたのである。
 私は、関数での副作用を防ぐため、たとえ構造体でも、値渡しにしている。構造体を値渡しにすると、メンバー文のコピーが発生し、性能に影響を与えるので、昔ならやらなかった方法である。でも、今では、マイコンの性能があがって、速度は十分に速いので、引数のコピーとか、関数のオーバーヘッドとかは、気にしない。安全第一である。
 ところが、その構造体に、ある事情で、ワーキングの変数を格納することにした。これは、まあ、よくあることだ。そのワーキング変数が、関数の中で変更され、それを維持する必要があるので、当然、構造体はポインタ渡しにするか、構造体を関数の返値にするかしないといけない。それを忘れて、引数の値渡しにしていたので、構造体の中のワーキング変数が、毎回、初期化されてしまうのである。
 簡単なバグだったのだが、もともとは、ワーキングなんぞを含めていなかったので、純粋に、値渡しで動いていた関数なのだ。コメントにだって、この引数は、入力と記載してある。
 単純なバグなのだが、わかるまでに、半日悩んだ。でも、これを実機でデバックするとなると、1週間かかるバグだったかもしれない。PC環境だったので、カバレージ機能が使え、何度呼び出しても、通らないパスがあって、それで、バグだということが分かったからだ。できる限り、PC環境でロジックのバグは取ってしまうことが、結局は、開発期間の短縮につながる。急ばが回れである。