問題タブ [cmock]
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 - XCTest の C/C++ モックの自動生成 - CMock/OCMock?
XCode 5 を使用して C & C++ を使用して開発したいと考えています。特に、XCTest と Xcode の統合、および OSX Server を使用して得られる CI 機能が気に入っています。私はモッキング フレームワークを持ちたいと思っています。理想的には、モックが自動的に生成されるフレームワークが必要です。これにより、モックが標準形式に従うことが保証される可能性が最も高いと思われます (そして、それ自体にエラーが発生することはありません)。
Q1. OCMock が C と C++ をモックするためにどのように機能するかわかりません: これは可能ですか?
Q2. CMock は素晴らしいようですが、Unity に依存しています。CMock を XCTest に統合することは可能ですか?
Q3. 他に何か提案はありますか?
c - CMock/Unity と Automake をどのように統合しますか?
ここで質問するのは初めてなので、質問を改善できるかどうか教えてください..
ソース ファイルを CMock によって生成されたソース ファイルのモック バージョンに置き換える必要がある単体テストをクリーンにビルドする方法についてのガイダンスを探しています。これが必要になるのは、CMock では、モックを使用する単体テスト コードを元のソースではなくモック ソースにリンクする必要があるためです。
たとえば、テスト ソース ファイル test.c で foo() を呼び出す関数 test_me() をテストしている場合、foo() をモックするには、コンパイルする必要があります。test_test_me: test_me.c, Mockfoo.c, and test.c.
test_me() は通常、次のようにコンパイルされます。test_me: test_me.c and foo.c
Mockfoo.c は、foo.h を使用して CMock が提供する Ruby スクリプトを使用して生成されます。
ご覧のとおり、テスト プログラムを作成するには、 をfoo.c
に置き換える必要があります。Mockfoo.c は、test_test_me が元の foo 呼び出しではなく、モックされた foo 呼び出しにリンクできるようにするために必要です。依存関係の数が増えると、ソースの置き換えが難しくなります。Mockfoo.c
test_test_me
たとえば、test_me が foo.o、bar.o、および baz.o で構成されるライブラリ libfoo.a の foo、bar、および baz を使用し、foo への呼び出しを単にモックしたい場合、ビルドする必要があります。コンパイル ユニット Mockfoo.o、bar.o、および baz.o を含む libfoo.a をtest.o
、モック foo 呼び出しを使用する my にリンクします。これは、モックの順列 (例: Mockfoo、Mockbar、ただし baz ではない) と、異なる automake ルール、フラグなどを持つ大きなソース ツリーがある場合、さらに複雑になります。
さらに、単体テストにはモックが必要になることが多いため、モックの追加は簡単でなければなりません。
いくつかのコンテキスト:
コードがリファクタリングされた場合、または参加したばかりの大規模な C プロジェクトに新しいコードが追加された場合に、CMock/Unityを使用して単体テストを追加することに興味があります。
このプロジェクトは現在、ビルド ツールとして Automake を使用しており、そのまま使用されます。
Automakeは初めてです。私は SCons と CMock に精通しています。
c - 単体テストと実装の間でコードが重複している
現在、プレーン C で組み込みプラットフォーム用の低レベル ドライバーをいくつか開発しています。単体テスト フレームワークとして unity+cmock を使用しています。
ただし、低レベルのものを書いているときに、次のパターンに出くわすことがよくあります。
テスト:
実装:
ご覧のとおり、テストと実装の間のコードには多くの重複があります。
これは問題ですか?私のテストの書き方は間違っていますか? それとも、この低レベルのテストをまったく書く必要はありませんか?
c - CMockに定義を渡す方法をCedlingする
私はしばらくの間 C を使用してきましたが、TDD にはやや慣れていません。その結果、ceedling を使用して組み込みプロジェクトをテストしています。
私はrake test:all
gccでできますが、それを組み込みターゲットシミュレーターに移動しようとしています。「project.yml」ファイルを使用して、クロスコンパイラ、リンカーなどを指定しています。
するとrake test:all
、「cmock.c をコンパイルする」ときにエラーが発生します (他のいくつかのファイルは問題なくコンパイルされます)。
< path_to_cmock >/cmock.c:17:31: エラー: 配列 'CMock_Guts_Buffer' のサイズが大きすぎます
この後に他のエラーがありますが、これがそれらを開始するものです。
に移動するcmock.c
と、ファイルの上部に次のように表示されます。
完璧なので、これらが宣言されている場所を見つけるだけです。どこにも宣言されていないことを見つけるためだけにテキスト検索を行います...したがって、ceedling内のデフォルトから来ていると思われます。
CMOCKのドキュメントを見つけ、「コンパイル済みオプション」の下に、
cmock エクスペリエンスをカスタマイズするための #define も多数存在します...
ソース コードで見つけた #defines をリストしますが、それらを見つける場所は示していません。適切な定義を使用してインクルード ファイルを作成し、そのインクルード ファイルを「project.yml」に渡そうとしましたが、うまくいきませんでした。
答えは信じられないほど単純だと思います。私が検索したどこにも概説されていないだけです。お時間をいただきありがとうございます。
c - CLI 経由で追加のインクルード
Unity 上の CMock をビルド システムに導入する (make ベース) Makefile 内にすべての構成要素を入れたいので、構成 YML ファイルを使用したくありません。したがって、CLI引数で呼び出すときにcmock rubyスクリプトのすべての構成を引き渡すことに行き詰まっています。これは、mock_prefix と mock_path で機能します。現在のところ、追加のインクルード ヘッダーを含む配列の引き渡しは失敗します。Makefile 内の呼び出しは次のようになります。
その結果、シェルでこの呼び出しが行われます
内部で指定されたいくつかのインクルード ヘッダーを使用して YML が機能するため、構成を引き渡します。また、CLI を使用して追加のインクルード ヘッダーを 1 つ設定することもできますが、複数のファイルを渡すだけで失敗します。アレイを cmock に引き渡した経験のある人はいますか?
ご支援ありがとうございます!
c - CMock - 複数の定義
私はテスト駆動型の C 開発に取り組み始めています。
次のようなコマンドを実行して、CMock を使用してモック クラスを生成しました。
私の現在のパッケージ構造は次のとおりです。
src をライブラリとしてコンパイルするための CMakeLists.txt セットアップがあります。
テストは、実行可能ファイルとしてコンパイルするようにセットアップされています。
そして、モックはライブラリとしてコンパイルするようにセットアップされています:
モックヘッダーの複数の場所を試して遊んでいますが、複数の定義エラーが発生しないようにする方法の基本がありません。
私のファイル構造または戦略のどこが間違っているかについて、誰かがガイダンスを提供できますか?
c - C で同じ UUT の関数をモックする方法
私は、Ceedling を使用して、モック用の CMock を使用して、既存の組み込み C コードベース (これに合わせて調整できます) で単体テストを学習しています。
ユニット内の 1 つの関数が同じユニット内の 2 番目の関数を呼び出す状況に遭遇しました。
foo_a()
テストの一部としてをテストしたくありませんfoo_b()
。関数自体foo_a()
をテストせずに、呼び出されたかどうかをテストできるようにモックするにはどうすればよいですか?foo_a()