1

我看到 Qt 支持与测试函数关联的数据函数。

http://qt-project.org/doc/qt-4.8/qtestlib-tutorial2.html

是否可以为多个测试提供一些类似类型的数据函数?

例子:

void Test::Test1()
{
  SomeClass::SomeDataType a;
  a.manyValuesComplicatedToSet = 1;
  SomeOtherClass::SomeOtherDataType b;
  b.manyValuesComplicatedToSet = 2;

  QVERIFY(SomeTestClass::someFunction(a,b)== 3);
}

void Test::Test2()
{
  SomeClass::SomeDataType a;
  a.manyValuesComplicatedToSet = 1;
  SomeOtherClass::SomeOtherDataType b;
  b.manyValuesComplicatedToSet = 2;

  QVERIFY(SomeTestClass::someOtherFunction(a,b)== 5);
}

我希望能够在一个通用数据函数中设置上面的数据,这样我就不会每次都输入它。

那可能吗 ?

4

2 回答 2

3

可以通过将测试数据提取到单独的函数中,然后从函数中调用该_data函数:

void Test::Test1()
{
    QFETCH(SomeClass::SomeDataType, a);
    QFETCH(SomeOtherClass::SomeOtherDataType, b);

    QCOMARE(SomeTestClass::someFunction(a,b), 3);
}

void Test::Test1_data()
{
    createTestData();
}

void Test::Test2()
{
    QFETCH(SomeClass::SomeDataType, a);
    QFETCH(SomeOtherClass::SomeOtherDataType, b);

    QCOMPARE(SomeTestClass::someOtherFunction(a,b), 5);
}

void Test::Test2_data()
{
    createTestData();
}

void Test::createTestData()
{
    QTest::addColumn<SomeClass::SomeDataType>("a");
    QTest::addColumn<SomeOtherClass::SomeOtherDataType>("b");

    SomeClass::SomeDataType a;
    a.manyValuesComplicatedToSet = 1;
    SomeOtherClass::SomeOtherDataType b;
    b.manyValuesComplicatedToSet = 2;
    QTest::newRow("test 1") << a << b;
}

请注意,createTestData()在我上面的示例中,将其定义为插槽。另请注意,要传递SomeClass::SomeDataTypeSomeOtherClass::SomeOtherDataType作为测试数据参数,您必须调用Q_DECLARE_METATYPE它们。

于 2014-08-20T23:18:52.507 回答
0

有很多方法可以给这只猫剥皮。

下面给出了一个易于配置的示例......(警告:前面的伪代码)

void Tester::LoadTestTuples(QString filename)
{
   // ... open file
   while(fileHandle.ok())
   {
      fileHandle >> a >> b >> c >> expectedResult;
      // this is your own test data file - all tuples are expected to be read.
      QCOMPARE(TestAddFunction(a, b, c), expectedResult);
   }
}

并这样做:

$ touch testData.txt
$ echo "1 4 5 10" >> testData.txt

在内部,我们更喜欢将 testData.txt 添加到 qrc 文件并编译它,但这是首选。

您可以扩展它以提供特定的测试场景和检查的严格性。例如:

$ echo "test_add 1 4 5 10 exit_on_fail" >> testData.txt
$ echo "test_divide 100 3 1 33 approximate_compare" >> testData.txt

(像这样进行适当的修改......)

{
   // format: testType = function to test. testResponseType = what to do when it fails.
   // a, b, c = inputs. expectedResult = comparison.
   // example test_add(1, 4, 5) = 1 + 4 + 5 = compared with 10. Strict.
   // example test_divide(100, 1, 3) = (100/1)/3 = compared with 33. Approximate, don't fail. 
   fileHandle >> testType >> a >> b >> c >> expectedResult >> testResponseType;
   TestResponseType type = ResponseFromString(testResponseType);
   switch (TestTypeFromString(testType))
   {
    case Test_Add: return Test<type>(a, b, c, expectedResult, Add);
    case Test_Divide: return Test<type>(a, b, c, expectedResult, Divide);
    default: return false;
   }
}
// ...

template <int TestResponseType> //generic test-fn template
bool Test(int a, int b, int c, int result, TestFunctor& fn)
{
}
template <> // specialized for each "reaction" type...
bool Test<Warn>(int a, int b, int c, int result, TestFunctor& fn)
{
    return QCOMPARE_WARN(fn(a, b, c) == result);
}
template <>
bool Test<FailOnError>(int a, int b, int c, int result, TestFunctor& fn)
{
    QCOMPARE_ASSERT(fn(a, b, c) == result);
    return true;
}
于 2014-08-21T06:19:08.763 回答