2.1.1 What are unit tests?

Unit tests are simple, short tests that test the functionality of
individual modules in your source code. A module can be a method of a
class, or can be smaller or larger parts of your code. Unit tests are
usually developed at the same time code is written, independently
testing each small component of your algorithm is on it's own.

The main goal of unit testing is to isolate each part of your code and
ensure that each part is correct. This allows you to refactor your
code at a later time with the confidence that your refactoring gives
the same behaviour as the original code. This allows you to quickly
write code that works, and then later come and refactor your code to
make it run faster.

Unit testing also allows you to check whether a particular piece of
code still works properly. This is useful in a large software project
such as Marsyas which has currently over 180,000 lines of code and
many developers on different continents.

Unit tests can also provide a sort of living documentation for the
system. Well written unit tests have example code in them that can
help new developers understand how to use different MarSystems.
Written documentation added to the unit tests also helps in this
regard, and often the best place for verbose documentation is in the
unit tests rather than in the main functions themselves, where they
can occasionally hide the beautiful logic therein.

Test-Driven Development (TDD) is a technique where you first write
your tests, and then write the actual that will make the tests pass.
In TDD you have short iterative development cycles on pre-written test
cases that define desired improvements or new functionality. On each
iteration of the cycle, you write just the code that you need to make
the tests pass. With TDD you write just the code that you need, not
the code you think you might need at some point in the future.

Cxxtest unit testing framework that is built into Marsyas lets you
write your tests either before, as in standard unit testing, or after,
as in TDD.