|
1 /**************************************************************************** |
|
2 ** |
|
3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). |
|
4 ** All rights reserved. |
|
5 ** Contact: Nokia Corporation (qt-info@nokia.com) |
|
6 ** |
|
7 ** This file is part of the documentation of the Qt Toolkit. |
|
8 ** |
|
9 ** $QT_BEGIN_LICENSE:LGPL$ |
|
10 ** No Commercial Usage |
|
11 ** This file contains pre-release code and may not be distributed. |
|
12 ** You may use this file in accordance with the terms and conditions |
|
13 ** contained in the Technology Preview License Agreement accompanying |
|
14 ** this package. |
|
15 ** |
|
16 ** GNU Lesser General Public License Usage |
|
17 ** Alternatively, this file may be used under the terms of the GNU Lesser |
|
18 ** General Public License version 2.1 as published by the Free Software |
|
19 ** Foundation and appearing in the file LICENSE.LGPL included in the |
|
20 ** packaging of this file. Please review the following information to |
|
21 ** ensure the GNU Lesser General Public License version 2.1 requirements |
|
22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. |
|
23 ** |
|
24 ** In addition, as a special exception, Nokia gives you certain additional |
|
25 ** rights. These rights are described in the Nokia Qt LGPL Exception |
|
26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. |
|
27 ** |
|
28 ** If you have questions regarding the use of this file, please contact |
|
29 ** Nokia at qt-info@nokia.com. |
|
30 ** |
|
31 ** |
|
32 ** |
|
33 ** |
|
34 ** |
|
35 ** |
|
36 ** |
|
37 ** |
|
38 ** $QT_END_LICENSE$ |
|
39 ** |
|
40 ****************************************************************************/ |
|
41 |
|
42 /*! |
|
43 \page qtestlib-manual.html |
|
44 \title QTestLib Manual |
|
45 \brief An overview of Qt's unit testing framework. |
|
46 |
|
47 \ingroup frameworks-technologies |
|
48 \keyword qtestlib |
|
49 |
|
50 The QTestLib framework, provided by Nokia, is a tool for unit |
|
51 testing Qt based applications and libraries. QTestLib provides |
|
52 all the functionality commonly found in unit testing frameworks as |
|
53 well as extensions for testing graphical user interfaces. |
|
54 |
|
55 Table of contents: |
|
56 |
|
57 \tableofcontents |
|
58 |
|
59 \section1 QTestLib Features |
|
60 |
|
61 QTestLib is designed to ease the writing of unit tests for Qt |
|
62 based applications and libraries: |
|
63 |
|
64 \table |
|
65 \header \o Feature \o Details |
|
66 \row |
|
67 \o \bold Lightweight |
|
68 \o QTestLib consists of about 6000 lines of code and 60 |
|
69 exported symbols. |
|
70 \row |
|
71 \o \bold Self-contained |
|
72 \o QTestLib requires only a few symbols from the Qt Core library |
|
73 for non-gui testing. |
|
74 \row |
|
75 \o \bold {Rapid testing} |
|
76 \o QTestLib needs no special test-runners; no special |
|
77 registration for tests. |
|
78 \row |
|
79 \o \bold {Data-driven testing} |
|
80 \o A test can be executed multiple times with different test data. |
|
81 \row |
|
82 \o \bold {Basic GUI testing} |
|
83 \o QTestLib offers functionality for mouse and keyboard simulation. |
|
84 \row |
|
85 \o \bold {Benchmarking} |
|
86 \o QTestLib supports benchmarking and provides several measurement back-ends. |
|
87 \row |
|
88 \o \bold {IDE friendly} |
|
89 \o QTestLib outputs messages that can be interpreted by Visual |
|
90 Studio and KDevelop. |
|
91 \row |
|
92 \o \bold Thread-safety |
|
93 \o The error reporting is thread safe and atomic. |
|
94 \row |
|
95 \o \bold Type-safety |
|
96 \o Extensive use of templates prevent errors introduced by |
|
97 implicit type casting. |
|
98 \row |
|
99 \o \bold {Easily extendable} |
|
100 \o Custom types can easily be added to the test data and test output. |
|
101 \endtable |
|
102 |
|
103 Note: For higher-level GUI and application testing needs, please |
|
104 see the \l{Third-Party Tools}{Qt testing products provided by |
|
105 Nokia partners}. |
|
106 |
|
107 |
|
108 \section1 QTestLib API |
|
109 |
|
110 All public methods are in the \l QTest namespace. In addition, the |
|
111 \l QSignalSpy class provides easy introspection for Qt's signals and slots. |
|
112 |
|
113 |
|
114 \section1 Using QTestLib |
|
115 |
|
116 \section2 Creating a Test |
|
117 |
|
118 To create a test, subclass QObject and add one or more private slots to it. Each |
|
119 private slot is a testfunction in your test. QTest::qExec() can be used to execute |
|
120 all testfunctions in the test object. |
|
121 |
|
122 In addition, there are four private slots that are \e not treated as testfunctions. |
|
123 They will be executed by the testing framework and can be used to initialize and |
|
124 clean up either the entire test or the current test function. |
|
125 |
|
126 \list |
|
127 \o \c{initTestCase()} will be called before the first testfunction is executed. |
|
128 \o \c{cleanupTestCase()} will be called after the last testfunction was executed. |
|
129 \o \c{init()} will be called before each testfunction is executed. |
|
130 \o \c{cleanup()} will be called after every testfunction. |
|
131 \endlist |
|
132 |
|
133 If \c{initTestCase()} fails, no testfunction will be executed. If \c{init()} fails, |
|
134 the following testfunction will not be executed, the test will proceed to the next |
|
135 testfunction. |
|
136 |
|
137 Example: |
|
138 \snippet doc/src/snippets/code/doc_src_qtestlib.qdoc 0 |
|
139 |
|
140 For more examples, refer to the \l{QTestLib Tutorial}. |
|
141 |
|
142 \section2 Building a Test |
|
143 |
|
144 If you are using \c qmake as your build tool, just add the |
|
145 following to your project file: |
|
146 |
|
147 \snippet doc/src/snippets/code/doc_src_qtestlib.qdoc 1 |
|
148 |
|
149 If you are using other buildtools, make sure that you add the location |
|
150 of the QTestLib header files to your include path (usually \c{include/QtTest} |
|
151 under your Qt installation directory). If you are using a release build |
|
152 of Qt, link your test to the \c QtTest library. For debug builds, use |
|
153 \c{QtTest_debug}. |
|
154 |
|
155 See \l {Chapter 1: Writing a Unit Test}{Writing a Unit Test} for a step by |
|
156 step explanation. |
|
157 |
|
158 \section2 QTestLib Command Line Arguments |
|
159 |
|
160 \section3 Syntax |
|
161 |
|
162 The syntax to execute an autotest takes the following simple form: |
|
163 |
|
164 \snippet doc/src/snippets/code/doc_src_qtestlib.qdoc 2 |
|
165 |
|
166 Substitute \c testname with the name of your executable. \c |
|
167 testfunctions can contain names of test functions to be |
|
168 executed. If no \c testfunctions are passed, all tests are run. If you |
|
169 append the name of an entry in \c testdata, the test function will be |
|
170 run only with that test data. |
|
171 |
|
172 For example: |
|
173 |
|
174 \snippet doc/src/snippets/code/doc_src_qtestlib.qdoc 3 |
|
175 |
|
176 Runs the test function called \c toUpper with all available test data. |
|
177 |
|
178 \snippet doc/src/snippets/code/doc_src_qtestlib.qdoc 4 |
|
179 |
|
180 Runs the \c toUpper test function with all available test data, |
|
181 and the \c toInt test function with the testdata called \c |
|
182 zero (if the specified test data doesn't exist, the associated test |
|
183 will fail). |
|
184 |
|
185 \snippet doc/src/snippets/code/doc_src_qtestlib.qdoc 5 |
|
186 |
|
187 Runs the testMyWidget function test, outputs every signal |
|
188 emission and waits 500 milliseconds after each simulated |
|
189 mouse/keyboard event. |
|
190 |
|
191 \section3 Options |
|
192 |
|
193 The following command line arguments are understood: |
|
194 |
|
195 \list |
|
196 \o \c -help \BR |
|
197 outputs the possible command line arguments and give some useful help. |
|
198 \o \c -functions \BR |
|
199 outputs all test functions available in the test. |
|
200 \o \c -o \e filename \BR |
|
201 write output to the specified file, rather than to standard output |
|
202 \o \c -silent \BR |
|
203 silent output, only shows warnings, failures and minimal status messages |
|
204 \o \c -v1 \BR |
|
205 verbose output; outputs information on entering and exiting test functions. |
|
206 \o \c -v2 \BR |
|
207 extended verbose output; also outputs each \l QCOMPARE() and \l QVERIFY() |
|
208 \o \c -vs \BR |
|
209 outputs every signal that gets emitted |
|
210 \o \c -xml \BR |
|
211 outputs XML formatted results instead of plain text |
|
212 \o \c -lightxml \BR |
|
213 outputs results as a stream of XML tags |
|
214 \o \c -eventdelay \e ms \BR |
|
215 if no delay is specified for keyboard or mouse simulation |
|
216 (\l QTest::keyClick(), |
|
217 \l QTest::mouseClick() etc.), the value from this parameter |
|
218 (in milliseconds) is substituted. |
|
219 \o \c -keydelay \e ms \BR |
|
220 like -eventdelay, but only influences keyboard simulation and not mouse |
|
221 simulation. |
|
222 \o \c -mousedelay \e ms \BR |
|
223 like -eventdelay, but only influences mouse simulation and not keyboard |
|
224 simulation. |
|
225 \o \c -keyevent-verbose \BR |
|
226 output more verbose output for keyboard simulation |
|
227 \o \c -maxwarnings \e number\BR |
|
228 sets the maximum number of warnings to output. 0 for unlimited, defaults to 2000. |
|
229 \endlist |
|
230 |
|
231 \section2 Creating a Benchmark |
|
232 |
|
233 To create a benchmark, follow the instructions for crating a test and then add a |
|
234 QBENCHMARK macro to the test function that you want to benchmark. |
|
235 |
|
236 \snippet doc/src/snippets/code/doc_src_qtestlib.qdoc 12 |
|
237 |
|
238 The code insde the QBENCHMARK macro will be measured, and possibly also repeated |
|
239 several times in order to get an accurate measurement. This depends on the selected |
|
240 measurement back-end. Several back-ends are available. They can be selected on the |
|
241 command line: |
|
242 |
|
243 \target testlib-benchmarking-measurement |
|
244 |
|
245 \table |
|
246 \header \o Name |
|
247 \o Commmand-line Argument |
|
248 \o Availability |
|
249 \row \o Walltime |
|
250 \o (default) |
|
251 \o All platforms |
|
252 \row \o CPU tick counter |
|
253 \o -tickcounter |
|
254 \o Windows, Mac OS X, Linux, many UNIX-like systems. |
|
255 \row \o Valgrind/Callgrind |
|
256 \o -callgrind |
|
257 \o Linux (if installed) |
|
258 \row \o Event Counter |
|
259 \o -eventcounter |
|
260 \o All platforms |
|
261 \endtable |
|
262 |
|
263 In short, walltime is always available but requires many repetitions to |
|
264 get a useful result. |
|
265 Tick counters are usually available and can provide |
|
266 results with fewer repetitions, but can be susceptible to CPU frequency |
|
267 scaling issues. |
|
268 Valgrind provides exact results, but does not take |
|
269 I/O waits into account, and is only available on a limited number of |
|
270 platforms. |
|
271 Event counting is available on all platforms and it provides the number of events |
|
272 that were received by the event loop before they are sent to their corresponding |
|
273 targets (this might include non-Qt events). |
|
274 |
|
275 \note Depending on the device configuration, Tick counters on the |
|
276 Windows CE platform may not be as fine-grained, compared to other platforms. |
|
277 Devices that do not support high-resolution timers default to |
|
278 one-millisecond granularity. |
|
279 |
|
280 See the chapter 5 in the \l{QTestLib Tutorial} for more benchmarking examples. |
|
281 |
|
282 \section1 Using QTestLib remotely on Windows CE |
|
283 \c cetest is a convenience application which helps the user to launch an |
|
284 application remotely on a Windows CE device or emulator. |
|
285 |
|
286 It needs to be executed after the unit test has been successfully compiled. |
|
287 |
|
288 Prior to launching, the following files are copied to the device: |
|
289 |
|
290 \list |
|
291 \o all Qt libraries the project links to |
|
292 \o \l {QtRemote}{QtRemote.dll} |
|
293 \o the c runtime library specified during installation |
|
294 \o all files specified in the \c .pro file following the \l DEPLOYMENT rules. |
|
295 \endlist |
|
296 |
|
297 \section2 Using \c cetest |
|
298 \section3 Syntax |
|
299 The syntax to execute an autotest takes the following simple form: |
|
300 |
|
301 \snippet doc/src/snippets/code/doc_src_qtestlib.qdoc 6 |
|
302 |
|
303 \section3 Options |
|
304 \c cetest provides the same options as those for unit-testing on non cross-compiled |
|
305 platforms. See \l {QTestLib Command Line Arguments} {Command Line Arguments} for |
|
306 more information. |
|
307 |
|
308 The following commands are also included: |
|
309 |
|
310 \list |
|
311 \o \c -debug \BR |
|
312 Test version compiled in debug mode. |
|
313 \o \c -release \BR |
|
314 Test version compiled in release mode. |
|
315 \o \c -libpath \e path \BR |
|
316 Target path to copy Qt libraries to. |
|
317 \o \c -qt-delete \BR |
|
318 Delete Qt libraries after execution. |
|
319 \o \c -project-delete \BR |
|
320 Delete project files after execution. |
|
321 \o \c -delete \BR |
|
322 Delete project and Qt libraries after execution. |
|
323 \o \c -conf \BR |
|
324 Specifies a qt.conf file to be deployed to remote directory. |
|
325 \endlist |
|
326 |
|
327 \note \c{debug} is the default build option. |
|
328 |
|
329 \section2 QtRemote |
|
330 \c QtRemote is a small library which is build after QTestLib. It allows the host |
|
331 system to create a process on a remote device and waits until its execution has |
|
332 been finished. |
|
333 |
|
334 \section2 Requirements |
|
335 \c cetest uses Microsoft ActiveSync to establish a remote connection between the |
|
336 host computer and the device. Thus header files and libraries are needed to compile |
|
337 cetest and QtRemote successfully. |
|
338 |
|
339 Prior to \l{Installing Qt on Windows CE}{installation} of Qt, you need to set your |
|
340 \c INCLUDE and \c LIB environment variables properly. |
|
341 |
|
342 A default installation of Windows Mobile 5 for Pocket PC can be obtained by: |
|
343 |
|
344 \snippet doc/src/snippets/code/doc_src_qtestlib.qdoc 7 |
|
345 |
|
346 Note that Qt will remember the path, so you do not need to set it again |
|
347 after switching the environments for cross-compilation. |
|
348 |
|
349 \section1 3rd Party Code |
|
350 |
|
351 The CPU tick counters used for benchmarking is licensed under the following |
|
352 license: (from src/testlib/3rdparty/cycle.h) |
|
353 |
|
354 \legalese |
|
355 Copyright (c) 2003, 2006 Matteo Frigo\br |
|
356 Copyright (c) 2003, 2006 Massachusetts Institute of Technology |
|
357 |
|
358 Permission is hereby granted, free of charge, to any person obtaining |
|
359 a copy of this software and associated documentation files (the |
|
360 "Software"), to deal in the Software without restriction, including |
|
361 without limitation the rights to use, copy, modify, merge, publish, |
|
362 distribute, sublicense, and/or sell copies of the Software, and to |
|
363 permit persons to whom the Software is furnished to do so, subject to |
|
364 the following conditions: |
|
365 |
|
366 The above copyright notice and this permission notice shall be |
|
367 included in all copies or substantial portions of the Software. |
|
368 |
|
369 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
|
370 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
|
371 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
|
372 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE |
|
373 LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION |
|
374 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION |
|
375 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
|
376 \endlegalese |
|
377 */ |
|
378 |
|
379 /*! |
|
380 \page qtestlib-tutorial.html |
|
381 \brief A short introduction to testing with QTestLib. |
|
382 \contentspage QTestLib Manual |
|
383 \nextpage {Chapter 1: Writing a Unit Test}{Chapter 1} |
|
384 |
|
385 \title QTestLib Tutorial |
|
386 |
|
387 This tutorial gives a short introduction to how to use some of the |
|
388 features of the QTestLib framework. It is divided into four |
|
389 chapters: |
|
390 |
|
391 \list 1 |
|
392 \o \l {Chapter 1: Writing a Unit Test}{Writing a Unit Test} |
|
393 \o \l {Chapter 2: Data Driven Testing}{Data Driven Testing} |
|
394 \o \l {Chapter 3: Simulating GUI Events}{Simulating GUI Events} |
|
395 \o \l {Chapter 4: Replaying GUI Events}{Replaying GUI Events} |
|
396 \o \l {Chapter 5: Writing a Benchmark}{Writing a Benchmark} |
|
397 \endlist |
|
398 |
|
399 */ |
|
400 |
|
401 |
|
402 /*! |
|
403 \example qtestlib/tutorial1 |
|
404 |
|
405 \contentspage {QTestLib Tutorial}{Contents} |
|
406 \nextpage {Chapter 2: Data Driven Testing}{Chapter 2} |
|
407 |
|
408 \title Chapter 1: Writing a Unit Test |
|
409 |
|
410 In this first chapter we will see how to write a simple unit test |
|
411 for a class, and how to execute it. |
|
412 |
|
413 \section1 Writing a Test |
|
414 |
|
415 Let's assume you want to test the behavior of our QString class. |
|
416 First, you need a class that contains your test functions. This class |
|
417 has to inherit from QObject: |
|
418 |
|
419 \snippet examples/qtestlib/tutorial1/testqstring.cpp 0 |
|
420 |
|
421 Note that you need to include the QTest header, and that the |
|
422 test functions have to be declared as private slots so the |
|
423 test framework finds and executes it. |
|
424 |
|
425 Then you need to implement the test function itself. The |
|
426 implementation could look like this: |
|
427 |
|
428 \snippet doc/src/snippets/code/doc_src_qtestlib.qdoc 8 |
|
429 |
|
430 The \l QVERIFY() macro evaluates the expression passed as its |
|
431 argument. If the expression evaluates to true, the execution of |
|
432 the test function continues. Otherwise, a message describing the |
|
433 failure is appended to the test log, and the test function stops |
|
434 executing. |
|
435 |
|
436 But if you want a more verbose output to the test log, you should |
|
437 use the \l QCOMPARE() macro instead: |
|
438 |
|
439 \snippet examples/qtestlib/tutorial1/testqstring.cpp 1 |
|
440 |
|
441 If the strings are not equal, the contents of both strings is |
|
442 appended to the test log, making it immediately visible why the |
|
443 comparison failed. |
|
444 |
|
445 Finally, to make our test case a stand-alone executable, the |
|
446 following two lines are needed: |
|
447 |
|
448 \snippet examples/qtestlib/tutorial1/testqstring.cpp 2 |
|
449 |
|
450 The \l QTEST_MAIN() macro expands to a simple \c main() |
|
451 method that runs all the test functions. Note that if both the |
|
452 declaration and the implementation of our test class are in a \c |
|
453 .cpp file, we also need to include the generated moc file to make |
|
454 Qt's introspection work. |
|
455 |
|
456 \section1 Executing a Test |
|
457 |
|
458 Now that we finished writing our test, we want to execute |
|
459 it. Assuming that our test was saved as \c testqstring.cpp in an |
|
460 empty directory: we build the test using qmake to create a project |
|
461 and generate a makefile. |
|
462 |
|
463 \snippet doc/src/snippets/code/doc_src_qtestlib.qdoc 9 |
|
464 |
|
465 \bold {Note:}If you're using windows, replace \c make with \c |
|
466 nmake or whatever build tool you use. |
|
467 |
|
468 Running the resulting executable should give you the following |
|
469 output: |
|
470 |
|
471 \snippet doc/src/snippets/code/doc_src_qtestlib.qdoc 10 |
|
472 |
|
473 Congratulations! You just wrote and executed your first unit test |
|
474 using the QTestLib framework. |
|
475 */ |
|
476 |
|
477 /*! |
|
478 \example qtestlib/tutorial2 |
|
479 |
|
480 \previouspage {Chapter 1: Writing a Unit Test}{Chapter 1} |
|
481 \contentspage {QTestLib Tutorial}{Contents} |
|
482 \nextpage {Chapter 3: Simulating Gui Events}{Chapter 3} |
|
483 |
|
484 \title Chapter 2: Data Driven Testing |
|
485 |
|
486 In this chapter we will demonstrate how to execute a test |
|
487 multiple times with different test data. |
|
488 |
|
489 So far, we have hard coded the data we wanted to test into our |
|
490 test function. If we add more test data, the function might look like |
|
491 this: |
|
492 |
|
493 \snippet doc/src/snippets/code/doc_src_qtestlib.qdoc 11 |
|
494 |
|
495 To prevent that the function ends up being cluttered by repetitive |
|
496 code, QTestLib supports adding test data to a test function. All |
|
497 we need is to add another private slot to our test class: |
|
498 |
|
499 \snippet examples/qtestlib/tutorial2/testqstring.cpp 0 |
|
500 |
|
501 \section1 Writing the Data Function |
|
502 |
|
503 A test function's associated data function carries the same name, |
|
504 appended by \c{_data}. Our data function looks like this: |
|
505 |
|
506 \snippet examples/qtestlib/tutorial2/testqstring.cpp 1 |
|
507 |
|
508 First, we define the two elements of our test table using the \l |
|
509 QTest::addColumn() function: A test string, and the |
|
510 expected result of applying the QString::toUpper() function to |
|
511 that string. |
|
512 |
|
513 Then we add some data to the table using the \l |
|
514 QTest::newRow() function. Each set of data will become a |
|
515 separate row in the test table. |
|
516 |
|
517 \l QTest::newRow() takes one argument: A name that will be |
|
518 associated with the data set. If the test fails, the name will be |
|
519 used in the test log, referencing the failed data. Then we |
|
520 stream the data set into the new table row: First an arbitrary |
|
521 string, and then the expected result of applying the |
|
522 QString::toUpper() function to that string. |
|
523 |
|
524 You can think of the test data as a two-dimensional table. In |
|
525 our case, it has two columns called \c string and \c result and |
|
526 three rows. In addition a name as well as an index is associated |
|
527 with each row: |
|
528 |
|
529 \table |
|
530 \header |
|
531 \o index |
|
532 \o name |
|
533 \o string |
|
534 \o result |
|
535 \row |
|
536 \o 0 |
|
537 \o all lower |
|
538 \o "hello" |
|
539 \o HELLO |
|
540 \row |
|
541 \o 1 |
|
542 \o mixed |
|
543 \o "Hello" |
|
544 \o HELLO |
|
545 \row |
|
546 \o 2 |
|
547 \o all upper |
|
548 \o "HELLO" |
|
549 \o HELLO |
|
550 \endtable |
|
551 |
|
552 \section1 Rewriting the Test Function |
|
553 |
|
554 Our test function can now be rewritten: |
|
555 |
|
556 \snippet examples/qtestlib/tutorial2/testqstring.cpp 2 |
|
557 |
|
558 The TestQString::toUpper() function will be executed three times, |
|
559 once for each entry in the test table that we created in the |
|
560 associated TestQString::toUpper_data() function. |
|
561 |
|
562 First, we fetch the two elements of the data set using the \l |
|
563 QFETCH() macro. \l QFETCH() takes two arguments: The data type of |
|
564 the element and the element name. Then we perform the test using |
|
565 the \l QCOMPARE() macro. |
|
566 |
|
567 This approach makes it very easy to add new data to the test |
|
568 without modifying the test itself. |
|
569 |
|
570 And again, to make our test case a stand-alone executable, |
|
571 the following two lines are needed: |
|
572 |
|
573 \snippet examples/qtestlib/tutorial2/testqstring.cpp 3 |
|
574 |
|
575 As before, the QTEST_MAIN() macro expands to a simple main() |
|
576 method that runs all the test functions, and since both the |
|
577 declaration and the implementation of our test class are in a .cpp |
|
578 file, we also need to include the generated moc file to make Qt's |
|
579 introspection work. |
|
580 */ |
|
581 |
|
582 /*! |
|
583 \example qtestlib/tutorial3 |
|
584 |
|
585 \previouspage {Chapter 2 Data Driven Testing}{Chapter 2} |
|
586 \contentspage {QTestLib Tutorial}{Contents} |
|
587 \nextpage {Chapter 4: Replaying GUI Events}{Chapter 4} |
|
588 |
|
589 \title Chapter 3: Simulating GUI Events |
|
590 |
|
591 QTestLib features some mechanisms to test graphical user |
|
592 interfaces. Instead of simulating native window system events, |
|
593 QTestLib sends internal Qt events. That means there are no |
|
594 side-effects on the machine the tests are running on. |
|
595 |
|
596 In this chapter we will se how to write a simple GUI test. |
|
597 |
|
598 \section1 Writing a GUI test |
|
599 |
|
600 This time, let's assume you want to test the behavior of our |
|
601 QLineEdit class. As before, you will need a class that contains |
|
602 your test function: |
|
603 |
|
604 \snippet examples/qtestlib/tutorial3/testgui.cpp 0 |
|
605 |
|
606 The only difference is that you need to include the QtGui class |
|
607 definitions in addition to the QTest namespace. |
|
608 |
|
609 \snippet examples/qtestlib/tutorial3/testgui.cpp 1 |
|
610 |
|
611 In the implementation of the test function we first create a |
|
612 QLineEdit. Then we simulate writing "hello world" in the line edit |
|
613 using the \l QTest::keyClicks() function. |
|
614 |
|
615 \note The widget must also be shown in order to correctly test keyboard |
|
616 shortcuts. |
|
617 |
|
618 QTest::keyClicks() simulates clicking a sequence of keys on a |
|
619 widget. Optionally, a keyboard modifier can be specified as well |
|
620 as a delay (in milliseconds) of the test after each key click. In |
|
621 a similar way, you can use the QTest::keyClick(), |
|
622 QTest::keyPress(), QTest::keyRelease(), QTest::mouseClick(), |
|
623 QTest::mouseDClick(), QTest::mouseMove(), QTest::mousePress() |
|
624 and QTest::mouseRelease() functions to simulate the associated |
|
625 GUI events. |
|
626 |
|
627 Finally, we use the \l QCOMPARE() macro to check if the line edit's |
|
628 text is as expected. |
|
629 |
|
630 As before, to make our test case a stand-alone executable, the |
|
631 following two lines are needed: |
|
632 |
|
633 \snippet examples/qtestlib/tutorial3/testgui.cpp 2 |
|
634 |
|
635 The QTEST_MAIN() macro expands to a simple main() method that |
|
636 runs all the test functions, and since both the declaration and |
|
637 the implementation of our test class are in a .cpp file, we also |
|
638 need to include the generated moc file to make Qt's introspection |
|
639 work. |
|
640 */ |
|
641 |
|
642 /*! |
|
643 \example qtestlib/tutorial4 |
|
644 |
|
645 \previouspage {Chapter 3: Simulating GUI Event}{Chapter 3} |
|
646 \contentspage {QTestLib Tutorial}{Contents} |
|
647 \nextpage {Chapter 5: Writing a Benchmark}{Chapter 5} |
|
648 |
|
649 \title Chapter 4: Replaying GUI Events |
|
650 |
|
651 In this chapter, we will show how to simulate a GUI event, |
|
652 and how to store a series of GUI events as well as replay them on |
|
653 a widget. |
|
654 |
|
655 The approach to storing a series of events and replay them, is |
|
656 quite similar to the approach explained in \l {Chapter 2: |
|
657 Data Driven Testing}{chapter 2}; all you need is to add a data |
|
658 function to your test class: |
|
659 |
|
660 \snippet examples/qtestlib/tutorial4/testgui.cpp 0 |
|
661 |
|
662 \section1 Writing the Data Function |
|
663 |
|
664 As before, a test function's associated data function carries the |
|
665 same name, appended by \c{_data}. |
|
666 |
|
667 \snippet examples/qtestlib/tutorial4/testgui.cpp 1 |
|
668 |
|
669 First, we define the elements of the table using the |
|
670 QTest::addColumn() function: A list of GUI events, and the |
|
671 expected result of applying the list of events on a QWidget. Note |
|
672 that the type of the first element is \l QTestEventList. |
|
673 |
|
674 A QTestEventList can be populated with GUI events that can be |
|
675 stored as test data for later usage, or be replayed on any |
|
676 QWidget. |
|
677 |
|
678 In our current data function, we create two \l |
|
679 {QTestEventList}s. The first list consists of a single click to |
|
680 the 'a' key. We add the event to the list using the |
|
681 QTestEventList::addKeyClick() function. Then we use the |
|
682 QTest::newRow() function to give the data set a name, and |
|
683 stream the event list and the expected result into the table. |
|
684 |
|
685 The second list consists of two key clicks: an 'a' with a |
|
686 following 'backspace'. Again we use the |
|
687 QTestEventList::addKeyClick() to add the events to the list, and |
|
688 QTest::newRow() to put the event list and the expected |
|
689 result into the table with an associated name. |
|
690 |
|
691 \section1 Rewriting the Test Function |
|
692 |
|
693 Our test can now be rewritten: |
|
694 |
|
695 \snippet examples/qtestlib/tutorial4/testgui.cpp 2 |
|
696 |
|
697 The TestGui::testGui() function will be executed two times, |
|
698 once for each entry in the test data that we created in the |
|
699 associated TestGui::testGui_data() function. |
|
700 |
|
701 First, we fetch the two elements of the data set using the \l |
|
702 QFETCH() macro. \l QFETCH() takes two arguments: The data type of |
|
703 the element and the element name. Then we create a QLineEdit, and |
|
704 apply the list of events on that widget using the |
|
705 QTestEventList::simulate() function. |
|
706 |
|
707 Finally, we use the QCOMPARE() macro to check if the line edit's |
|
708 text is as expected. |
|
709 |
|
710 As before, to make our test case a stand-alone executable, |
|
711 the following two lines are needed: |
|
712 |
|
713 \snippet examples/qtestlib/tutorial4/testgui.cpp 3 |
|
714 |
|
715 The QTEST_MAIN() macro expands to a simple main() method that |
|
716 runs all the test functions, and since both the declaration and |
|
717 the implementation of our test class are in a .cpp file, we also |
|
718 need to include the generated moc file to make Qt's introspection |
|
719 work. |
|
720 */ |
|
721 |
|
722 /*! |
|
723 \example qtestlib/tutorial5 |
|
724 |
|
725 \previouspage {Chapter 4: Replaying GUI Events}{Chapter 4} |
|
726 \contentspage {QTestLib Tutorial}{Contents} |
|
727 |
|
728 \title Chapter 5: Writing a Benchmark |
|
729 |
|
730 In this final chapter we will demonstrate how to write benchmarks |
|
731 using QTestLib. |
|
732 |
|
733 \section1 Writing a Benchmark |
|
734 To create a benchmark we extend a test function with a QBENCHMARK macro. |
|
735 A benchmark test function will then typically consist of setup code and |
|
736 a QBENCHMARK macro that contains the code to be measured. This test |
|
737 function benchmarks QString::localeAwareCompare(). |
|
738 |
|
739 \snippet examples/qtestlib/tutorial5/benchmarking.cpp 0 |
|
740 |
|
741 Setup can be done at the beginning of the function, the clock is not |
|
742 running at this point. The code inside the QBENCHMARK macro will be |
|
743 measured, and possibly repeated several times in order to get an |
|
744 accurate measurement. |
|
745 |
|
746 Several \l {testlib-benchmarking-measurement}{back-ends} are available |
|
747 and can be selected on the command line. |
|
748 |
|
749 \section1 Data Functions |
|
750 |
|
751 Data functions are useful for creating benchmarks that compare |
|
752 multiple data inputs, for example locale aware compare against standard |
|
753 compare. |
|
754 |
|
755 \snippet examples/qtestlib/tutorial5/benchmarking.cpp 1 |
|
756 |
|
757 The test function then uses the data to determine what to benchmark. |
|
758 |
|
759 \snippet examples/qtestlib/tutorial5/benchmarking.cpp 2 |
|
760 |
|
761 The "if(useLocaleCompare)" switch is placed outside the QBENCHMARK |
|
762 macro to avoid measuring its overhead. Each benchmark test function |
|
763 can have one active QBENCHMARK macro. |
|
764 |
|
765 \section1 External Tools |
|
766 |
|
767 Tools for handling and visualizing test data are available as part of |
|
768 the \l{qtestlib-tools} project on the Qt Labs Web site. These include |
|
769 a tool for comparing performance data obtained from test runs and a |
|
770 utility to generate Web-based graphs of performance data. |
|
771 |
|
772 See the \l{qtestlib-tools Announcement} for more information on these |
|
773 tools and a simple graphing example. |
|
774 |
|
775 */ |
|
776 |
|
777 |
|
778 |