問題タブ [cmocka]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - C での Cmocka 単体テスト: ネストされた関数呼び出しのモック
そのため、cmocka を使用して既存のコードの単体テストを開発している問題を再現するおもちゃのプログラムです。問題は、ネストされた関数呼び出しがモックされないことです。これにより、単体テストは、ネストされた関数呼び出しが適切に実行されることに依存します。元のコードには「内部関数呼び出し」として存在する静的関数があるため、「mockable_static」定義が使用されましたが、単体テストの目的で、これらは外部呼び出しに対して開かれていることに注意してください。(このアイデアが生まれたスタックオーバーフローの投稿を参照してください)
コードは次のとおりです。
func.h:
func.c:
test.c:
gcc コンパイル行:
テスト実行の結果:
ご覧のとおり、bar() は foo() にラップされませんが、ラップ テストでは、foo() が bar を呼び出すのとまったく同じように bar がラップされます。Bar は、cmocka テスト ライブラリの一部である __real_bar() を使用してテストされます (__real_bar() にはプロトタイプがありますが、関数は定義されておらず、cmocka のドキュメントに従って期待される結果を返します。ネストされた関数呼び出しで単体テストを使用した経験がある人なら誰でも)ネストされた関数呼び出しを cmocka でモックした結果は見つかりませんでしたが、google-foo が不足している可能性があります. test_foo() の最後で assert が削除されると、will_return キュー内の未使用の値のためにテストが失敗します.
c - Cmocka: テスト失敗時にコンテキストを出力する
私は CMokka を使用していくつかの単体テストを作成しています。私のテストのいくつかは、繰り返しを避けるために構造体に格納されているケースのリストをループします:
これは機能します:
ただし、アサーションは単純に 64 行目 ( assert_int_equal(...)
) であり、この場合、失敗したケースは明らかです。ただし、常にそうとは限りません。おそらく、失敗はケースに直接表示されない番号であるか、ケース間で共有されているため、ERROR
とからはLINE
どれTestCase
が失敗したかわかりません。テストに何千行ものスパムが含まれるわけではありませんprintf()
が、何が失敗したかを確認するためにデバッグ レベルを上げてテストを再実行する必要もありません。
Boost Test を使用すると、メッセージまたはコンテキスト ( docs ) を使用してこれを実行し、失敗時に便利なメッセージを出力できます (RAII スコープなどの優れたものを含みますが、これは C++ であるためです)。Cmocka には、必要に応じてメッセージを格納するパラメーターがありますが、アサーションの失敗にフックしてそのメッセージをユーザーに出力state
する方法がわかりません。
ティアダウン中にテストが失敗したかどうかがわかっている場合、state
実行中に 、 push 、 pop を使用して文字列のスタックを実装し、失敗が発生した場合はそれらを出力できますが、そのままでは、ティアダウン コールバックに何らかのアイデアがあることがわかりません。テストの合格/不合格ステータスの。
これはCMockaで可能ですか?