I am strongly convinced of the value of using tests that verify a complete program (e.g. convergence tests), including an automated set of regression tests.  After reading some programming books, I've gotten the nagging feeling that I ought to write unit tests (i.e., tests that verify the correctness of a single function and do not amount to running the whole code to solve a problem) as well.  However, unit tests don't always seem to fit with scientific codes, and end up feeling artificial or like a waste of time.  Should we write unit tests for research codes?
Is it worthwhile to write unit tests for scientific research codes?
programming paradigms;testing
For many years I was under the misapprehension that I didn't have enough time to write unit tests for my code. When I did write tests, they were bloated, heavy things which only encouraged me to think that I should only ever write unit tests when I knew they were needed.Then I started to use Test Driven Development and I found it to be a complete revelation. I'm now firmly convinced that I don't have the time not to write unit-tests.In my experience, by developing with testing in mind you end up with cleaner interfaces, more focussed classes & modules and generally more SOLID, testable code.Every time I work with legacy code which doesn't have unit tests and have to manually test something, I keep thinking this would be so much quicker if this code already had unit tests. Every time I have to try and add unit test functionality to code with high coupling, I keep thinking this would be so much easier if it had been written in a de-coupled way.Comparing and contrasting the two experimental stations that I support. One has been around for a while and has a great deal of legacy code, while the other is relatively new.When adding functionality to the old lab, it is often a case of getting down to the lab and spending many hours working through the implications of the functionality they need and how I can add that functionality without affecting any of the other functionality. The code is simply not set up to allow off-line testing, so pretty much everything has to be developed on-line. If I did try to develop off-line then I would end up with more mock objects than would be reasonable.In the newer lab, I can usually add functionality by developing it off-line at my desk, mocking out only those things which are immediately required, and then only spending a short time in the lab, ironing out any remaining problems not picked up off-line.