Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there a right way to implement a continuous improvement (AKA software hardening) process?

Each release it seems that our customers find a few old issues with our software. It makes it look like every release has multiple bugs, when in reality our new code is generally solid.

We have tried to implement some additional testing where we have testers do several hours of monthly regression testing on a single app each month in an effort to stay ahead of small issues. We refer to this process as our Software Hardening process, but it does not seem like we are catching enough of the bugs and it feels like a very backburner process since there is always new code to write.

Is there a trick to this kind of testing? Do I need to target one specific feature at a time?

like image 435
JoshBaltzell Avatar asked Dec 30 '22 09:12

JoshBaltzell


1 Answers

When you develop your testing procedures, you may want to implement these kind of tests:

  • unit testing (testing invididual components of your project to test their functionality), these tests are important because they allow you to pinpoint where in the software the error may come from. Basically in these tests you will test a single functionality and use mock objects to simulate the behavior, return value of other objects/entities.

  • regression testing, which you mentioned

  • characterization testing, one example could be running automatically the program on automatically generated input (simulating the user input), storing the results and compare the results of every version against these results.

At the beginning this will be very heavy to put in place, but with more releases and more bugs fixes being added to the automated non-regression tests, you should be starting to save time.

It is very important that you do not fall in the trap of designing huge numbers of dumb tests. Testing should make your life easier, if you spend too much time understanding where the tests have broken you should redesign the tests such as they give you better messages/understanding of the problem so you can locate the issue quickly.

Depending of your environment, these tests can be linked to the development process.

In my environment, we use SVN for versioning, a bot runs the tests against every revision and returns the failing tests and messages with the name of the revision which broke it and the contributor (his login).

EDIT:

In my environment, we use a combination of C++ and C# to deliver analytics used in Finance, the code was C++ and is quite old while we are trying to migrate the interfaces toward C# and keep the core of the analytics in C++ (mainly because of speed requirements)

Most of the C++ tests are hand-written unit tests and regression tests.

On the C# side we are using NUnit for unit testing. We have a couple of general tests.

We have a 0 warnings policy, we explicitely forbid people to commit code which is generating warnings unless they can justify why it is useful to bypass the warning for this part of the code. We have as well conventions about exception safety, the use of design patterns and many other aspects.

Setting explicitely conventions and best practices is another way to improve the quality of your code.

like image 117
BlueTrin Avatar answered Jan 13 '23 18:01

BlueTrin