12

UnitTest ++で単一のテストを実行するにはどうすればよいですか?

UnitTest++をそのまま実行しています。私のmain関数は次のようになります:

int main()
{
   printf("diamond test v0.1 %s\n\n",TIMESTAMP);
   diamond::startup();
   UnitTest::RunAllTests();
   diamond::shutdown();
   printf("press any key to continue...");
   getc(stdin);
}

UnitTest::RunSingleTests("MyNewUnitTest");デバッグのために、の代わりにのようなものを書きたいと思いUnitTest::RunAllTests();ます。UnitTest ++はそのような関数を提供しますか?もしそうなら、構文は何ですか?

4

6 に答える 6

14

これをunittestのmain()として試してください(実際にこれをファイルに入れてunittestライブラリに追加したので、ライブラリにリンクするときに実行可能ファイルはこのmain()を自動的に使用します。非常に便利です。)

int main( int argc, char** argv )
{
  if( argc > 1 )
  {
      //if first arg is "suite", we search for suite names instead of test names
    const bool bSuite = strcmp( "suite", argv[ 1 ] ) == 0;

      //walk list of all tests, add those with a name that
      //matches one of the arguments  to a new TestList
    const TestList& allTests( Test::GetTestList() );
    TestList selectedTests;
    Test* p = allTests.GetHead();
    while( p )
    {
      for( int i = 1 ; i < argc ; ++i )
        if( strcmp( bSuite ? p->m_details.suiteName
                           : p->m_details.testName, argv[ i ] ) == 0 )
          selectedTests.Add( p );
      p = p->next;
    }

      //run selected test(s) only
    TestReporterStdout reporter;
    TestRunner runner( reporter );
    return runner.RunTestsIf( selectedTests, 0, True(), 0 );
  }
  else
  {
    return RunAllTests();
  }
}

引数を指定して呼び出し、単一のテストを実行します。

> myexe MyTestName

またはシングルスイート

> myexe suite MySuite
于 2010-08-23T10:14:48.237 に答える
7

これはほぼ正しいです。「テスト」は実際にはリンクリストのノードとして使用されるため、新しいリストに追加するときは、意図したよりも多くのテストが含まれないようにポインターを修正する必要があります。

だからあなたは交換する必要があります

  p = p->next;

  Test* q = p;
  p = p->next;
  q->next = NULL;

ジェフリー

于 2011-02-09T15:17:12.013 に答える
3

RunTestsIfは、名前を指定した場合に1つのスイートのみを実行できます。

class MyTrue
{
    public:
        MyTrue(const std::string & suiteName, const std::string & testName)
                : suite(suiteName), test(testName) {}

        bool operator()(const UnitTest::Test* const testCase) const
        {
            return suite.compare(testCase->m_details.suiteName) == 0 && 
                         test.compare(testCase->m_details.testName) == 0;
        }
    private:
        std::string suite;
        std::string test;
};

int main (...) {
    bool isSuite = false;
    std::string suiteName = "suite01";
    std::string testName  = "test01";

    UnitTest::TestReporterStdout reporter;
    UnitTest::TestRunner runner(reporter);
    if (isSuite) {
        runner.RunTestsIf(UnitTest::Test::GetTestList(),
            NULL, MyTrue(suiteName, testName), 0);
    } else {
        runner.RunTestsIf(UnitTest::Test::GetTestList(),
            NULL, UnitTest::True(), 0);
    }
}
于 2012-05-16T22:35:43.900 に答える
1

predicateこれは、次のパラメータを使用して行うことができますRunTestsIf

TestReporterStdout reporter;
TestRunner runner(reporter);
return runner.RunTestsIf(Test::GetTestList(), "MySuite",
    [](Test* t) { 
        return strcmp(t->m_details.testName, "MyTest") == 0; 
    }, 0);

スイートがない場合、またはすべてを検索する場合は、に置き換えることができ"MySuite"ますNULL

于 2013-06-30T10:20:58.363 に答える
1

@stijnによる回答には、テストリストの操作にバグがあるため、通常、要求しなかった追加のテストが実行されます。

この例では、述語ファンクターを使用し、RunTestsIfによって提供される組み込みのスイート名マッチングも利用します。それは正しく、はるかに簡単です。

#include "UnitTest++.h"
#include "TestReporterStdout.h"
#include <string.h>
using namespace UnitTest;

/// Predicate that is true for tests with matching name,
/// or all tests if no names were given.
class Predicate
{
public:

Predicate(const char **tests, int nTests)
    : _tests(tests),
      _nTests(nTests)
{
}

bool operator()(Test *test) const
{
    bool match = (_nTests == 0);
    for (int i = 0; !match && i < _nTests; ++i) {
        if (!strcmp(test->m_details.testName, _tests[i])) {
            match = true;
        }
    }
    return match;
}

private:
    const char **_tests;
    int _nTests;
};

int main(int argc, const char** argv)
{
    const char *suiteName = 0;
    int arg = 1;

    // Optional "suite" arg must be followed by a suite name.
    if (argc >=3 && strcmp("suite", argv[arg]) == 0) {
        suiteName = argv[++arg];
        ++arg;
    } 

    // Construct predicate that matches any tests given on command line.
    Predicate pred(argv + arg, argc - arg);

    // Run tests that match any given suite and tests.
    TestReporterStdout reporter;
    TestRunner runner(reporter);
    return runner.RunTestsIf(Test::GetTestList(), suiteName, pred, 0);
}
于 2014-09-04T19:44:18.517 に答える
0

受け入れられた答えの解決策は私のために働いていません。スイートの最初のテストがpにロードされると、次のテストにジャンプしません(正確な理由はわかりません)。

XcodeとUnitTest++v1.4を使用しています

#include "UnitTest++.h"
#include "TestReporterStdout.h"

#define SUITE_NAME "ActionFeedback"

using namespace UnitTest;

int main( int argc, char** argv )
{
#ifdef SUITE_NAME
    TestReporterStdout reporter;
    TestRunner runner( reporter );
    return runner.RunTestsIf( Test::GetTestList() ,  SUITE_NAME , True(), 0 );
#else
    return RunAllTests();
#endif

}
于 2014-11-07T08:54:17.320 に答える