@page Guides @subpage TestingGuide @page TestingGuide Testing Guide
Testing is important to ensure the program does what is intended and also prevents bit rot. It also allows us to code more fearlessly as we can make changes and feel confident that we have not broken things if all the tests continue to pass.
This assumes good test coverage. So it is important to have good coverage and to maintain this as it can be difficult to do afterwards. The best time to add a test is when the code to be tested is written as assumptions can be tested and makes the new functionality something that can be immediately build on top of.
Another good time to add tests is when an issue is found or a bug fixed as the problem is evident and it could re-occur otherwise.
There are different types of testing that can be made.
The minimal type of testing needed as code is written should be unit testing.
It is best if the tests are run automatically with each build, either as part of the build system or as part of a continous integration system.
Here is an example of how to add a new unit test inside of the source code along side the implementation.
This should be inside the corresponding CPP file.
// Implementation
class Example
{
public:
int XPlusOne() { return x + 1; }
int x = 0;
};
// Unit Tests
#if ENABLE_UNIT_TESTS
DECLARE_UNIT_TEST(UnitTestExampleInit)
{
Example a;
CHECK(a.x == 0);
CHECK(a.XPlusOne() == 1);
}
DECLARE_UNIT_TEST(UnitTestExampleSet)
{
Example a;
a.x = 1;
CHECK(a.x == 1);
CHECK(a.XPlusOne() == 2);
}
#endif // ENABLE_UNIT_TESTS
This creates two tests, "UnitTestExampleInit" and "UnitTestExampleSet". They creates an object of the class to be unit tested and validate the initial state and the returned result of the method in the class under different conditions.