1

私はVS2012でMSTestを始めたばかりです。ネイティブ C++ をテストしています。

アプリケーションでミスを犯し、STL 文字列の「末尾から」読み取ってしまいました...例

wchar_t c = p_filename[p];

..私の場合、p は 20000 で、p_filename は空の文字列です。明らかにバグです。デバッガーで実行すると、次のようにトリガーされます。

「デバッグ アサーションに失敗しました!! ..文字列添え字が範囲外です... (アプリケーションをデバッグするには、再試行を押してください)」.

ただし、MSTest でこのコードを実行すると、テストに合格します。エラーは報告されていません。MSTest がこの実行時エラーを検出しないのはなぜですか? (または、MSTest はネイティブ c++ のアサート ステートメントを検出しませんか)?? MSTest はこの重大なバグを報告すべきではないでしょうか?

4

2 に答える 2

1

STL がデバッグ モードで問題を検出すると、_CrtDbgBreak() を呼び出します。これにより、通常、問題をデバッグできるダイアログ ボックスが表示されます。ただし、MSTest で実行しても何も起こりません。ダイアログ ボックスはありません。MSTest は成功を報告する場合があります。_CrtDbgBreak() にフックし、別のメカニズムである __debugbreak 組み込み関数を使用する assert() をトリガーすることで、これを修正しました。これらの場合、これにより、おなじみの「Press 'retry' to debug」ダイアログがトリガーされます。

    int MyReportHook(int nRptType, char *szMsg, int *retVal)
{
    if( _CRT_ASSERT == nRptType )
    {
        assert(false);
    }
    return 0;
}

TEST_CLASS(UnitTest1)
{
public:
    TEST_METHOD_INITIALIZE(methodName) 
    {
        _CrtSetReportHook(MyReportHook); // hook STL asserts.
    }

    TEST_METHOD(TestMethod1)
    {
        Assert::IsTrue( StripExtension( L"" ) == L"" ); // test for handling empty strings.
        Assert::IsTrue( StripExtension( L"test.txt" ) == L"test" );
    }

};
于 2013-01-25T03:02:43.573 に答える
0

これは、CppUnitTest.h ファイルで行われたアサートのリダイレクトが原因です。

            _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE);

ここでの意図は、自動化がダイアログでブロックされないようにすることです。明らかに、ここで必要なものではありません。ただし、必要に応じてこのヘッダーを編集し、再度有効にすることができます。

于 2013-01-31T04:45:21.690 に答える