Можно ли задавать данные для тестирования отдельным методом в модульном тестировании qt?

Я видел, что 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);
}

Я хотел бы иметь возможность установить данные выше в общей функции данных, чтобы я не вводил их каждый раз.

Это возможно ?

1

Решение

Это возможно, выделив ваши тестовые данные в отдельную функцию, а затем вызвав эту функцию из вашего _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::SomeDataType а также SomeOtherClass::SomeOtherDataType в качестве параметров тестовых данных, вы должны вызвать Q_DECLARE_METATYPE на них.

3

Другие решения

Есть много способов снять шкуру с этой кошки.

Один простой в настройке пример приведен ниже …
(предупреждение: псевдокод вперед)

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;
}
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector