組み込みユニットテスト--フレーム解析
3012 ワード
1.ユニットテストの必要性
ユニットテストはソフトウェア開発の重要な一環であり、特に組み込み開発である.組み込み型開発は開発環境やデバッグツールなどに限られているため,純粋なPCソフトウェア開発と同様に多くの先進的なツールを使用することはできない.これは開発者が開発過程で,より細かいモジュール区分,より明確なインタフェース,より詳細なテストを行う必要がある.
従来の開発はまず設計案を出して、それからコードを書き出して、最後にテストをしています---よくbugデバッグと呼ばれているので、コードが「書き終わった」後、まだ半分ぐらいの開発量があります.人はすべて間違いを犯して、設計と符号化の中でも間違いを犯して、もし後期にプログラミングをデバッグして設計と符号化の中で導入した間違いを解決するならば、それではすでに数日の数週間の数ヶ月を過ぎたかもしれなくて、フィードバックはこのように遅くて、すでに間違いの中から経験を吸収することができなくて、次回また同じ間違いを犯します.さらに,ソフトウェアエンジニアリング理論によれば,1つのバグは後期ほど大きなコストで修復され,システムの複雑さが増すにつれて,小さなモジュールで問題を検索するよりも多くの時間コストがかかる大きなシステムで詳細な問題を検索する.
2.ユニットテストフレーム解剖
一般的にユニットテストは以下のいくつかの基本機能を実現する必要がある:1.assert各種assert、例えばAssertTrue、例えばAssertFail、AssertStrEquals、AssertInteEquals......すべての大通りはローマに通じて、これらのAssertは各種の機能があって、実は断言の関数を包装しました.たとえばAssertStrEquals(str,「open」)ではstrと文字列「open」の比較を行い,異なる場合はエラーを報告する.フレームワークの構成によっては,assertが失敗した場合には,ロングジャンプlongjmpを行うものもあれば,failCountのようなグローバル変数に1を加えて誤った位置を記録するものもある.2.エラー位置記録はC言語のLINE、FILEマクロのおかげで、2つのANSI Cフラグでサポートされている内蔵マクロ定義で、現在の行数とファイル名を得ることができます.断言に失敗した場所で、ユーザーがエラーの場所をクエリーできるようにファイル名と行番号を記録します.
char buf[HUGE_STRING_LEN];
sprintf(buf, "%s:%d: ", _FILE_, _LINE_);
3.テストcase管理これはテストフレームワークが自分で書いたassertテスト関数とは異なる最も根本的な場所である.テストフレームワークは,関数の利用率を向上させ,重複を低減し,テストルーチンのまとめを容易にするために,種々のパッケージを行う.例えば以下のようなものです.1)setupとteardownの大部分のテストフレームワークはこの2つの関数を提供している.主にいくつかのテストcaseがあり、入力データの準備、テストが終わったら現場を整理するなどの共通の機能がたくさんあるからだ.2)テスト例をまとめるとTestSuit,TestFixturesというものがある.似たような機能のテストcaseをまとめ、より高いレベルの呼び出しを容易にし、ユーザーがテストルーチンを管理するのにも便利です.3)テストの呼び出し複数のテストルーチンをまとめた後、一つの配列(表)を構成し、実行を開始し、一般的にxxxRun関数が責任を負う.埋め込みcでは、一般的に関数ポインタが操作されます.これも、すべてのテストcaseの関数名が同じ宣言を使用している理由です.test_Caseは、テストを呼び出すポインタと同じタイプが必要です.
4.テストの実行テストの実行本質は関数の長いジャンプである.親関数でサブ関数を呼び出すと見なすことができます.このサブ関数はテストルーチンであれば、サブ関数にはassert関連の文が含まれますが、assert文はエラーが発生した後、ずれ位置とエラーメッセージが記録され、ロングジャンプ(longjmp)、longjmpとsetjmp(buf)がペアで現れ、呼び出しの位置に戻り、次のテストcaseを行います.
for (i = 0 ; i < testSuite->count ; ++i)
{
Test* testCase = testSuite->list[i];
TestRun(testCase);
if (testCase->failed) {
testSuite->failCount += 1;
}
}
3.テストフレームワークの本質
1)テストをよりよく組織するために、提供されるテストグループのロット処理機能は、一般的にforループによって1つのtable配列を遍歴することによって実現される.2)テスト環境の準備や現場の清掃など、測定共通関数の抽出を繰り返すことを減らす.3)テストに必要な様々な断言;4)断言失敗後のジャンプ、記録エラー位置-FILE-,-LINE-マクロの使用;5)case実行のモニタリングと結果の要約をテストする.
以上、上記のいくつかの機能を実現すれば、自分でテストフレームワークを完成します.実はテストフレームワークはとても簡単なことで、今テストフレームワークはたくさんあって、VSのようなIDEはすでに単体テストを統合して、だから1人の開発者に対してどのようにテストを計画するのがテストの仕事の第1の要務です.どのように適切にテスト用例を書くかは、開発を遅らせることもなく、工事が肥大化することもなく、できるだけテスト範囲をカバーすることがテストの中で最も手間がかかる場所です.