Chapter 2: Data Driven Testing▲
<Unknown command>contentspage{Qt Test Tutorial}{Contents}
In this chapter we will demonstrate how to execute a test multiple times with different test data.
So far, we have hard coded the data we wanted to test into our test function. If we add more test data, the function might look like this:
QCOMPARE(QString("hello"
).toUpper(), QString("HELLO"
));
QCOMPARE(QString("Hello"
).toUpper(), QString("HELLO"
));
QCOMPARE(QString("HellO"
).toUpper(), QString("HELLO"
));
QCOMPARE(QString("HELLO"
).toUpper(), QString("HELLO"
));
To prevent that the function ends up being cluttered by repetitive code, Qt Test supports adding test data to a test function. All we need is to add another private slot to our test class:
class
TestQString: public
QObject
{
Q_OBJECT
private
slots:
void
toUpper_data();
void
toUpper();
}
;
Writing the Data Function▲
A test function's associated data function carries the same name, appended by _data. Our data function looks like this:
void
TestQString::
toUpper_data()
{
QTest::
addColumn&
lt;QString&
gt;("string"
);
QTest::
addColumn&
lt;QString&
gt;("result"
);
QTest::
newRow("all lower"
) &
lt;&
lt; "hello"
&
lt;&
lt; "HELLO"
;
QTest::
newRow("mixed"
) &
lt;&
lt; "Hello"
&
lt;&
lt; "HELLO"
;
QTest::
newRow("all upper"
) &
lt;&
lt; "HELLO"
&
lt;&
lt; "HELLO"
;
}
First, we define the two elements of our test table using the QTest::addColumn() function: a test string, and the expected result of applying the QString::toUpper() function to that string.
Then we add some data to the table using the QTest::newRow() function. Each set of data will become a separate row in the test table.
QTest::newRow() takes one argument: a name that will be associated with the data set. If the test fails, the name will be used in the test log, referencing the failed data. Then we stream the data set into the new table row. First an arbitrary string, and then the expected result of applying the QString::toUpper() function to that string.
You can think of the test data as a two-dimensional table. In our case, it has two columns called string and result and three rows. In addition a name as well as an index is associated with each row:
index |
name |
string |
result |
---|---|---|---|
0 |
all lower |
"hello" |
HELLO |
1 |
mixed |
"Hello" |
HELLO |
2 |
all upper |
"HELLO" |
HELLO |
Rewriting the Test Function▲
Our test function can now be rewritten:
void
TestQString::
toUpper()
{
QFETCH(QString, string);
QFETCH(QString, result);
QCOMPARE(string.toUpper(), result);
}
The TestQString::toUpper() function will be executed three times, once for each entry in the test table that we created in the associated TestQString::toUpper_data() function.
First, we fetch the two elements of the data set using the QFETCH() macro.