| Testing policy |
| === |
| |
| Aims |
| --- |
| |
| * Maintainers should be able to make a release of GLib at any time, confident |
| that it will not contain regressions or obvious bugs with new functionality |
| * Speed up review of submitted changes by deferring some of the review effort |
| to automated testing |
| * Allow fast detection of bugs in new or changed code, particularly if they are |
| only present on platforms not regularly used by the maintainers |
| * Allow easy dynamic and static analysis of a significant proportion of the |
| GLib code |
| * Statistics on tests (such as pass/failure) should be easily and mechanically |
| collectable to allow analysis and highlight problems |
| * Code for tests and code for production should be easily separable so that |
| statistics on them can be grouped separately |
| * Performance measurement tools for GLib should be reusable over time to allow |
| comparable measurements to be collected and to discourage use of lower |
| quality and throwaway tests when prototyping improvements to GLib |
| |
| Policy |
| --- |
| |
| * Tests must be written for all new code, and any existing code which is being |
| non-trivially modified (for example to fix a bug), to give confidence to the |
| author and reviewer of the changes that they are correct for all platforms |
| that GLib runs CI on. |
| * Tests live in the `{glib,gobject,gio}/tests` directories. This allows their |
| code to be counted separately when analysing statistics such as code |
| coverage. |
| - Performance tests live in `{glib,gobject,gio}/tests/performance`, as they |
| are executed and results interpreted differently due to giving a result on |
| a continuous scale rather than a pass/fail result. |
| * All tests must use the GTest framework, as it supports |
| [structured output](https://testanything.org/) which exposes test results to |
| the test runner for analysis. |
| - Use `g_test_bug()` and `g_test_summary()` in unit tests to link them to |
| contextual information in bug reports, and to provide a summary of what |
| each test checks and how it goes about doing those checks. Sometimes a |
| test’s behaviour can be quite complex, and needs to be explained so that |
| future developers can understand and build on such tests in future. |
| - Use the `g_assert_*()` functions inside unit tests, and do not use |
| `g_assert()`. The latter is compiled out when GLib is built with |
| `G_DISABLE_ASSERT`, and the former are not. The `g_assert_*()` functions |
| also give more helpful error messages on test failure. |
| * Performance tests must be able to be run unattended. In this mode they must |
| choose default argument values which check that the performance test |
| functions (i.e. without crashing) and doesn’t take too long to complete. This |
| is used to automatically verify that performance tests still work, as they |
| are typically used infrequently and are subject to bitrot. |
| * Code coverage reports must be used to demonstrate that unit tests reach all |
| newly submitted or significantly modified code, reaching all lines of code |
| and a significant majority of branches. If this is not enforced, code ends up |
| never being tested. |
| * Code should be structured to be testable, which is typically only possible by |
| writing tests at the same time as the code. Otherwise it is easy to design |
| APIs which cannot easily be unit tested, and once those APIs are stable it is |
| hard to retrofit tests to them. |
| * Parsers, network-facing code or code which handles untrusted user input must |
| have fuzz tests added, in the `fuzzing` directory. These are run by |
| [oss-fuzz](https://github.com/google/oss-fuzz/) and are very effective at |
| catching exploitable security issues. See the |
| [fuzzing README](../fuzzing/README.md) for more details. |
| * When fixing bugs in existing code, regression tests must be added when it is |
| straightforward to do so. If it’s difficult to do so (such as if the code |
| needs to be significantly restructured or APIs need to be changed), adding |
| the regression tests can be deferred to a follow-up issue so as not to slow |
| down bug fixing. In that case, the bug fix must be carefully manually tested |
| before being merged. |