One of the major parts of any software development cycle is testing. Whether that testing is performed on just one feature or an entire product I think that any developer can agree that code and product functionality needs to be tested before it is deployed. As a developer, one thing that I continuously find myself wondering is when is it an appropriate time to test my code? I wonder if it cost effective and productive to perform testing on a feature by feature basis? I wonder if I should wait until an entire section of features is completed to test functionality? I wonder if I should perform incremental testing even though there has been changes to the scope of the product while I am developing it or if I should just wait and perform my testing at the end of the project? These are the types of questions that I often find myself wondering during a software development cycle and to answer these questions I have found that System Testing and Functional Testing work best to try and define some sort of testing methodology.
So what is System Testing and what is Functional Testing and how do they differ? Well, in short, I define System Testing as testing a product or an entire section of a product from start to finish to verify the integrity of all the features in that product or section. As an example I may make a spreadsheet of the entire specified functionality of a product itemized on a row by row basis and then test that functionality in each row to determine if the input makes the feature pass or fail. So System Testing can be thought of as testing the functionality of an entire system from start to finish.
Functional Testing on the other hand is defined by me as small automated tests that can determine the integrity of a single feature within a section. As an example if I know that the scope of a section is locked in stone I will develop a feature and then often times develop an automated test to verify that the input of a feature produces the desired output I am looking for. Automated code testing classes are often built into most popular frameworks today and Functional Testing classes can be created pretty easily without much code. Often times Functional Testing can be as simple as creating a testing class and then executing it from the command line or from a testing GUI and seeing your test result right away.
So the difference between System Testing and Functional Testing is that System Testing tests the entire product or section of a product while Functional Testing only tests a single feature within a section of a product. In theory if you have tested all of the features of your product using Functional Testing and then at the end of development before you ship you perform a System Test on your entire product you should have a pretty easy time with your System Test because it has been incrementally tested using Functional Tests along the way.
So when is it appropriate to use System Testing and Functional Testing? In my opinion, you should always use some sort of System Testing in every software development cycle. Functional Testing on the other hand is something that has to be based upon the development team's discretion and how a project is going. Some teams might have more time and budget than others to perform Functional Testing. Each development cycle is different and while in a perfect world we would all like to perform Functional Testing, sometimes it just does not get done because of time and budget constraints. In trying to discover the correct testing methodology that works for me I have found that I can rely on a three rules of thumb when deciding if I should perform testing during my development cycle. Number one, if I know that a specific feature is pretty well defined and is not going to change, then performing Functional Testing on a singular feature is a good plan. Number two, if I see that there is indecision about how the features within a particular section should be defined then I hold off on Functional Testing and perform System Testing on that particular section once it is completed. Number three, no matter what, always perform some sort of System Testing on a product before it ships to production.
I would love to hear if anyone has feedback on this particular testing methodology. Or if you have a testing methodology that you use on projects I would love to hear that too. Leave a comment and tell me about it.