In a previous article we introduced Agile Software Development, in which the entire project is broken down into smaller iterations consisting of short time frames. In Agile Software Development cross-functional teams work on all functions of the project at once, including the testing phase. Testers are not a separate part or separate entity of the project, rather they work with the developers to continuously improve the product. The testing phase occurs parallelly with the development in order to give the customer releases with minimum bugs. Once the specifications have been given by the client, the developers begin to work on the first build, and the testers begin to write test scenarios and test cases of the same. Once the development is complete, the features of the build are tested against the written cases. Since testing happens concurrently (or in the same iteration at least) as the development, it is easier to make changes and improvements throughout the project.
Agile testing consists of 6 parts:
Test Planning – During the planning, and analysis of requirements and risks is performed, as well as setting up of the test environments and preparation of the necessary documentation.
Build Acceptance Testing – Also known as a Build Verification Test (BVT), this is a set of tests run on each new build of the product to verify the build’s main functionalities and stability before it is given to the test team. This is important because running a BVT before a full test run will point out any serious problems with the build, thus saving the test team from wasting time over an unstable build. Only the critical test cases are included in the BVT, and all test cases should have a known expected result.
Functional Testing – Functional testing basically describes what the system does. This is a type of black box testing in which internal program structure is disregarded, rather the test is based only on feeding specific inputs and examining the output. It tests only one part of the functionality of the entire system at a time. First, the functions the software is expected to perform are identified. Next, input data is created according to the function’s specifications. Expected output is determined based on specifications. The test is executed, and the actual and expected outputs are compared.
Regression Testing – Regression tests are performed to ensure that changes made in one part of the software have not affected the other parts. The aim of regression testing is to uncover any software bugs, or regressions, in both the functional and nonfunctional areas of the system, especially after changes, such as enhancements, patches or configuration changes have been made. A common method of regression testing includes running the previously completed tests (before changes were made), and checking whether the previous bugs have been resolved and if program behavior has changed overall.
Automation Testing – Automation Testing uses a special software to control the execution of tests to compare actual outcomes with predicted ones. Automation testing usually adds some additional testing that would be difficult to perform manually. This includes:
- Code Driven Testing – Here the public interfaces to classes, modules or libraries (which require an input from the user) are tested with a large variety of input arguments to validate that outcome matches expected.
- Graphical User Interface Testing – In GUI testing the framework generates user interface events, such as a mouse click, to observe changes that result in the UI.
- API Driven Testing – This framework uses an application programming interface to validate the behavior.
In short, Agile Development requires continuous collaboration between the developers, testers and the stakeholders. Testing is an essential component that must happen continuously. Everyone is expected to work closely together, and at times to switch hats between their roles as software developers, testers and QAs. The entire project team works towards a single goal: to create a top-notch quality software product that fulfills all of the crucial specification required by the client / designer at the end of each iteration.