1

プログラムの単体テストで問題が発生しました。問題は単純ですが、なぜこれが機能しないのかわかりません。

1 -> すべてのプログラムをビルドします
2 -> unitTest をビルドします
3 -> テストが実行されています。

データ セグメントからグローバル データを取得する必要がない場合は、すべて問題ありません。変数が初期化されていないか、単に見つかっているようです。もちろん、私のテストはすべて間違っています。

私の質問は次のとおりです。実行可能ファイルをビルドしてからテストを実行するのは完全に間違っていますか? または、すべてのコードと単体テストを同時にコンパイルしてから実行する必要がありますか? それとも、SenTesting フレームワークが不足しているだけですか?

これが C++ の const 文字列であることを忘れていました。それが何かを変えるかどうかはわかりません。

*編集***

私の仮定は間違っていましたが、その先の魔法はまだわかりません! C++ マジック ホイディ フーのようですか?

char cstring[] = "***";
std::string cppString = "***";
NSString* nstring = @"***";

- (void)testSync{
    STAssertNotNil(nstring, nil); // fine
    STAssertNotNil((id)strlen(bbb), nil); // fine
    STAssertNotNil((id)cppString.size(), nil); // failed
}

編集2 **

実際、コードのこの部分で C++ が初期化されていないのは正常です。実行可能ファイルで nm を実行すると、C および Obj-C グローバルが dataSegment に配置されているように見えます。私の C++ 文字列も同じケースだと思っていましたが、実際には bss セグメントに入れられています。つまり、初期化されていません。実際には、C++ コンパイラはそれ以上の魔法を実行し、C++ 文字列は main() 呼び出しの後に初期化され、dataSegment 内にあるかのように動作します。

testSuit に main() 呼び出しがないことを知らなかったので、C++ オブジェクトが初期化されることはありません。testSuit の前に .ctor を呼び出すには、いくつかのテクニックがあります。しかし、私はあまりにも説明するのが面倒で、それはある種のトピックです. C++ 文字列を単純な char 配列に置き換えたところ、値が POD になったので完全に機能します。

ちなみに、グローバル変数は読み取り専用であれば悪気はありません。;)

4

1 に答える 1

0

OK、ここにいくつかの欠点があります。

まず第一に、このコードは私の環境 (Xcode 5) と正当な理由 (ARC が有効になっている) でエラーを出します。どうやってコンパイルするものを手に入れたのかわかりません。その理由は、整数 (または long) をオブジェクトにキャストしているためです。これは、通常は無効な操作であるため、多くのエラーが発生します。したがって、本当の問題は、3 番目の「アサート」が失敗した理由ではなく、2 番目のアサートが成功した理由です。

あなたの質問の 2 番目の部分に関する限り、私はあなたの質問を完全には理解していないことを認めなければなりません。

一般に、単体テストはコードの特定の部分をテストすることです。したがって、通常、実際の最終的な実行可能ファイルでテストを実行することはなく (これは単体テストとは呼ばれていないと思います)、「すべての C++ コード + 単体テストを同時に」コンパイルする必要もありません。

Xcodeを使っているので、参考にさせていただきます。

  • アプリケーション (または少なくともその一部) を作成し、単体テストを実行する側面 / 関数 / オブジェクトを見つけます。
  • 個別のファイルで、これらのオブジェクトをインスタンス化してメソッドをテストし、それらを呼び出して、入力と出力を比較する単体テストを記述します。
  • アプリケーションには、単体テスト ソース コードと関連するメイン プログラム コードのみをコンパイルする 2 番目のターゲットが必要です。
  • このターゲットをビルドするか、command-U を押すと、成功と失敗が報告されます。

したがって、ソースコードを分離し、クラス/メソッドを分離して、このようにテスト可能にする必要があります。これには、アプリケーションの適切なアーキテクチャと設計が必要であり、柔軟性について妥協する必要がある場合があります (それはあなた次第です)。ああ、テスト可能なコードでは、さまざまな理由から、一般的にグローバル変数を避けるべきだと思います。グローバル変数は役立つ場合もありますが、一般的に単体テストを非常に困難にします (また、誤用するとスパゲッティ コードになる可能性がありますが、これはまったく別の話です)。

投稿の 2 番目の部分を完全に理解していなくても、お役に立てば幸いです。

于 2013-10-15T10:42:27.187 に答える