3

CATCHGoogle Test 、およびその他のフレームワークでテストをスキップする方法がないため(少なくとも、そうする理由を指定して出力で確認する従来の意味では)、それが必要かどうかを考えさせられました (私は過去のプロジェクトでUnitTest++を使用してきました)。

通常、デスクトップ アプリで何かをスキップする理由はありません。テストするかしないかのどちらかです。ただし、ハードウェアに関しては、保証できないものもあります。

たとえば、2 つのデバイスがあります。1 つにはビーパーが組み込まれていますが、もう 1 つにはありません。UnitTest++ では、システムにクエリを実行し、ビープ音を使用できないことを確認し、ビープ音に依存するテストをスキップします。もちろん、CATCH でも同様のことができます。初期化中にシステムにクエリを実行し、「ビープ音」タグ ( CATCHの特別な機能) を持つすべてのテストを除外するだけです。

ただし、わずかな違いがあります: テスター (私以外の誰か) は出力を読み、言及されているオプションのテストを見つけられません (一方、UnitTest++ ではそれらはスキップされたとマークされ、その理由は出力の一部として提供されます) )。彼の最初の考え:

  • これは、テスト アプリの古いバージョンである必要があります。
  • スイート X を有効にするのを忘れたのかもしれません。
  • 何かが壊れている可能性があります。開発者に問い合わせる必要があります。
  • 待ってください、多分彼らはちょうどスキップされました. しかし、なぜ?とにかく開発者に聞いてみます。

さらに、実際にはスキップされるべきではないのに、それらのテストがスキップされたことに気付かなかった (つまり、ビープ音の有無に関係なく、OS は「false」を返します。これは重大なバグです)。1 つのオプションは、「スキップされた」テストを合格としてマークすることですが、それは不必要な回避策のように感じます。

私が気付いていない巧妙なテクニックはありますか (つまり、オプションのテストをスタンドアロン プログラムに完全に分離することはわかりません)? そうでない場合-UnitTest ++に固執する必要がありますか? それは仕事をしますが、コードの繰り返しを避けるのに役立つCATCH のSECTIONstagsが本当に好きです。

4

2 に答える 2

0

googletest に適用する手法を求めているのか、CATCH に適用する手法を求めているのか、あるいはそのいずれか、または両方を求めているのかは不明です。この回答は googletest に適用されます。

不要なテストをスキップするための慣習的な手法は、目的のために提供されているコマンドライン オプションを使用することです--gtest_filterドキュメントを参照してください。

ビープ音を有効または無効にするテスト スイートでの使用例を次に示します。

test_runner.cpp

#include "gtest/gtest.h"

TEST(t_with_beeper, foo) {
    SUCCEED(); // <- Your test code here
}

TEST(t_without_beeper, foo) {
    SUCCEED(); // <- Your test code here
}

int main(int argc, char **argv)
{
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

走る:

./test_runner --gtest_filter=t_with_beeper*

出力:

Note: Google Test filter = t_with_beeper*
[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from t_with_beeper
[ RUN      ] t_with_beeper.foo
[       OK ] t_with_beeper.foo (0 ms)
[----------] 1 test from t_with_beeper (0 ms total)

[----------] Global test environment tear-down
[==========] 1 test from 1 test case ran. (1 ms total)
[  PASSED  ] 1 test.

走る:

./test_runner --gtest_filter=t_without_beeper*

出力:

Note: Google Test filter = t_without_beeper*
[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from t_without_beeper
[ RUN      ] t_without_beeper.foo
[       OK ] t_without_beeper.foo (0 ms)
[----------] 1 test from t_without_beeper (0 ms total)

[----------] Global test environment tear-down
[==========] 1 test from 1 test case ran. (1 ms total)
[  PASSED  ] 1 test.

レポートはスキップされたテストを箇条書きにしませんが、ビープ音のテストが有効になっているかどうかをかなり明確にしています。

ビープ音テストを有効または無効にするにtest_runnerは、次のようなものを使用できます。

using namespace std;

int main(int argc, char **argv)
{   
    vector<char const *> args(argv,argv + argc);
    int nargs = argc + 1;
    if (have_beeper()) {
        args.push_back("--gtest_filter=t_with_beeper*");
    } else {
        args.push_back("--gtest_filter=t_without_beeper*");
    }
    ::testing::InitGoogleTest(&nargs,const_cast<char **>(args.data()));
    return RUN_ALL_TESTS();
}

ここでhave_beeper()は、ビープ音の存在を照会するブール関数です。

于 2014-05-22T14:50:47.733 に答える