d78b7d2f27
No real changes.
95 lines
3.9 KiB
Markdown
95 lines
3.9 KiB
Markdown
How to write unit tests for wxWidgets
|
|
=====================================
|
|
|
|
wxWidgets unit tests use [Catch](http://catch-lib.net/) framework. It is
|
|
included in wxWidgets as a submodule, so you will need to run
|
|
|
|
$ git submodule update --init 3rdparty/catch
|
|
|
|
to get it before the first use. Catch is header-only and doesn't need to be
|
|
compiled.
|
|
|
|
Testing with Catch
|
|
------------------
|
|
|
|
**WARNING**: Most of the existing tests are currently still written in the
|
|
CppUnit style, please do _not_ follow them when writing new tests, the old
|
|
style is too complex and unnecessary.
|
|
|
|
Writing tests with Catch is almost embarrassingly simple: you need to just
|
|
add a new test case and use Catch assertion macros inside it, e.g.
|
|
|
|
TEST_CASE("MyNewTest", "[my][new][another-tag]")
|
|
{
|
|
wxString s("Hello, world!");
|
|
CHECK( s.BeforeFirst(",") == "Hello" );
|
|
CHECK( s.AfterLast(" ") == "world!" );
|
|
}
|
|
|
|
This is all, the new test will be automatically run when you run the full test
|
|
suite or you can run just it using
|
|
|
|
$ ./test MyNewTest
|
|
|
|
(see below for more about running tests).
|
|
|
|
See [Catch tutorial](https://github.com/philsquared/Catch/blob/v1.11.0/docs/tutorial.md)
|
|
for more information.
|
|
|
|
|
|
Tests physical structure
|
|
------------------------
|
|
|
|
All (i.e. both GUI and non-GUI) unit tests are under `tests` subdirectory. When
|
|
adding a new test, try to find an existing file to add it to. If there are no
|
|
applicable files, try to add a new file to an existing directory. If there is
|
|
no applicable directory neither, create a new one and put the new file there
|
|
(i.e. do _not_ put new files directly under `tests`). If your test is small,
|
|
consider adding it to `tests/misc/misctests.cpp`.
|
|
|
|
If you add a new file, you need to update `tests/test.bkl` and add a
|
|
`<sources>` tag for your new file.bkl. Make sure it's in the correct section:
|
|
the one starting `<exe id="test_gui"` for a gui test, the one starting `<exe
|
|
id="test" template="wx_sample_console` otherwise. After modifying this file,
|
|
rerun bakefile to regenerate the tests make- and project files:
|
|
|
|
$ cd build/bakefiles
|
|
$ bakefile_gen -b ../../tests/test.bkl
|
|
|
|
|
|
Writing GUI-specific tests
|
|
--------------------------
|
|
|
|
`wxUIActionSimulator` can be used when user input is required, for example
|
|
clicking buttons or typing text. A simple example of this can be found in
|
|
`tests/controls/buttontest.cpp`. After simulating some user input always
|
|
call `wxYield()` to allow event processing. When writing a test using
|
|
`wxUIActionSimulator` wrap it in `#if wxUSE_UIACTIONSIMULATOR` block.
|
|
|
|
There are a number of classes that are available to help with testing GUI
|
|
elements. Firstly throughout the test run there is a frame of type
|
|
`wxTestableFrame` that you can access through `wxTheApp->GetTopWindow()`. This
|
|
class adds two new functions, `GetEventCount()`, which takes an optional
|
|
`wxEventType`. It then returns the number of events of that type that it has
|
|
received since the last call. Passing nothing returns the total number of event
|
|
received since the last call. Also there is `OnEvent()`, which counts the events
|
|
based on type that are passed to it. To make it easy to count events there is
|
|
also a new class called `EventCounter` which takes a window and event type and
|
|
connects the window to the top level `wxTestableFrame` with the specific event
|
|
type. It disconnects again once it is out of scope. It simply reduces the
|
|
amount of typing required to count events.
|
|
|
|
|
|
Running the tests
|
|
-----------------
|
|
|
|
Run the main test suite by using the command `test` for the console tests,
|
|
or `test_gui` for the GUI ones. With no arguments, all the default set of tests
|
|
(all those registered without `[hide]` tag) are run.
|
|
|
|
To list the test suites without running them use `-l` command-line option.
|
|
|
|
To run a particular test case, use `./test NameTestCase`. To run all tests
|
|
using the specified tag, use `./test [tag_name]` (the square brackets may need
|
|
to be escaped from your shell).
|