Rigorous testing is performed to ensure a high-quality software application is delivered to the client.
Quality assurance is unfortunately a commonly neglected procedure in the development of software applications. While most programmers test their applications, too often they test their programs late in the game, in the fourth quarter with two minutes to go, when budgets are thinned and a delivery date is fast approaching. And even more do not factor vigorous testing into the development cycle or budget, let alone have a lucidly mapped and detailed strategy for testing. Many approach testing in a haphazard manner merely to “get the program working” and prepared for deployment. Unfortunately the client is then saddled with a program that inevitably contains errors, and users as well as the client suffer the consequences. This is unacceptable, especially since such unreliable, error-prone software is avoidable.
Errors are a natural part of a software application. They evolve from human error, oversight, or from programming team collaboration miscommunications or breakdowns.
Testing is fundamental to the delivery of software whose quality can be assured. True, errors are never eliminated entirely from software, but bugs can be reduced dramatically and performance increased significantly when proper and rigorous testing and debugging are performed during the development cycle.
The truth is, typically, software quality cannot be assured unless it has been tested extensively and failed repeatedly. At Yacoset, we approach testing with the same vigor we employ in systems engineering, analysis, design and implementation, because it is every bit as important to the ultimate success and quality of each client’s software application.
Proper testing begins with a clear plan, where overall classes of tests are identified during the Analysis Phase of the Systems Development Life Cycle. These classes of tests evolve into specific testing procedures that are identified during the Design Phase and carried out during the Implementation Phase, as soon as modules are being programmed, and continues through to the Testing Phase of the overall system.
It is the ambition of testing to deliver a high-quality application by using the software extensively and vigorously in an effort to find as many errors as possible within a reasonable time and at the lowest cost. A detailed, clear testing plan helps our software engineers to achieve these ends.
Where software engineering descends from a broad overview of requirements to highly detailed specifications to the microscopic data of programming code, testing, on the other hand, ascends from modules and reaches its acme at the system level. Testing consists of four procedures: module testing, integration testing, validation testing and system testing.
Module Testing
As soon as a program module is coded, we test every module to expose any errors in a module’s algorithm(s), local data structures, interface, exception handling and independent execution paths.
From module testing, we move to integration testing.
Integration Testing
Module testing allows us, the engineers, to uncover errors in individual modules and to ensure that they are processing properly. However, a problem may arise during module integration, viz. combining them to where they are integrated or communicate with one another. Integration can cause adverse effects: One module may find another module unfriendly and produce unexpected results or errors. Data may be lost or damaged. Precision may be impaired. Program crashes could occur. In fact, any number of unfavorable results could happen as a result of module integration.
Integration testing employs a methodical approach to the integration of modules into an application. As each module is integrated, interface testing is performed.
Far too many programmers, both novices and the experienced, approach integration testing only after a large number of modules have been integrated into an application. Such an approach consumes greater testing time in the end and is more likely to result in bugs that are missed, difficult to isolate and potentially unable to be corrected.
By testing modules, step-by-step, as they are integrated, where a haphazard approach to testing is abandoned for a well-designed testing strategy, the software is more thoroughly tested, is more reliable and better able to be updated and maintained.
Validation Testing
In this third step of testing, we employ validation testing to ensure that the resulting software application matches the design specifications and is consistent with the software requirements. Validation testing further makes certain that user manuals and documentation correlate with the resulting software application’s procedures. We produce up-to-date and accurate user manuals and documentation, both of which reflect current software application processes and operations, to help ensure a program that is much friendlier and provide reference information to users when further explanation or help is needed. They also act as a resource for our engineers when changes in the application are required.
System Testing
The final phase of testing is that of system testing. In system testing, the entire information system, which consists of the engineered software application and other integrated and supporting components, is tested for accuracy, reliability and conformance to the design specification requirements. It is the last step before the software is delivered to the client.
Testing Methodologies
A testing strategy is critical to the delivery of a high-quality software application. Two valuable and complementary testing methodologies are White-Box and Black-Box testing, which allow test cases to be designed specific to the software application.
White-Box Testing
We use White-Box testing methodology to draw test cases from the procedural design of the software application, which makes certain for each module:
- all statements and conditions have been executed at least once
- all independent execution paths are exercised
- logical or true-false expressions are processed on each true and false value
- loops are processed at and within their bounds
- internal data structures are processed and checked for validity
Black-Box Testing
Complementary to White-Box testing is Black-Box testing. Functional requirements are at the heart of Black-Box testing, where input conditions completely exercise the software application’s functional requirements. Testing the software application’s functional requirements through Black-Box testing methodologies unearths different types of errors than White-Box testing. Whereas White-Box testing methodologies center on software procedures, Black-Box testing focuses on functionality and reveals the following problems:
- Faulty Database Access
- Errors in Internal Data Structures
- Missing, Flawed or Incomplete Functions
- Graphical User Interface Problems
- Module Interface or Communication Errors
- Inefficient Software Processing Speed
- Starting and Closing Program Errors
White-Box testing is carried out early in the testing process, beginning as soon as modules are being implemented, while Black-Box testing is performed in the latter part of the testing phase. This owes to the inherent nature of each testing method: The White-Box methodology tests at the module level while the Black-Box methodology tests at the functional level without concern for the internal workings of the program.
In order to ensure that objective testing procedures are designed and carried out with rigor, a software testing strategy must be designed and reviewed and it must answer the following questions:
- Have primary testing procedures been identified and logically ordered?
- How will the software’s efficiency and processing speed be tested to help ensure maximum performance?
- Are there other tools or resources that will be necessary to carry out testing and, if so, have they been made available to testers?
- Have the Design Document requirements been satisfied?
- Has a plan for recording all test results been defined and does it conform to a set of pre-defined standards established by our engineering team?
- Have test drivers and stubs (a temporary dummy module that acts as a stand-in for a real module until the latter has been fully developed and is ready to be integrated) been specified and has the development of these drivers and stubs been scheduled?
- What are the specific White-Box and Black-Box testing procedures needed to fully test the application?
- Have all test cases and their respective anticipated results been defined?
- Has adequate module testing been performed?
- What types of boundary values will be tested in an effort to find errors in repetition control structures?
Depending on the project requirements and budget, the degree at which testing will be carried out (as itemized in the list above) will be determined and an independent organization or group may be used to perform testing procedures. An Independent Test Group (ITG) consists of engineers that were not part of the original analysis, design and implementation team of the software and it is the ITG’s chief responsibility to endeavor to make a software application fail, to uncover errors prior to deployment. In some cases, an ITG can be vital to the delivery of high-quality software because it carries no subjectivity or bias in the rigorous testing of the software. Subjectivity may be a characteristic that is inherent among the members of the original engineering team. As a result, the software is put to the test by an independent group to boost quality assurance.
Debugging
A byproduct of testing is debugging. Debugging is arguably more of an art form than a technique. True, debugging applications can be used to identify both logic (errors in an algorithm) and syntactical errors, but oftentimes debugging requires critical thinking skill coupled with the ability to match a symptom with an underlying problem, which isolates the error so it can be corrected.
Testing is a necessary and critical part of the development cycle. While the program is being constructed and after the program is completed, we perform stringent testing to ensure the application matches the defined specifications and requirements of the business needs. Moreover, testing ensures that defined input matches anticipated results, that input errors are controlled with proper output, and that the system is secure and reliable and processes efficiently.
A client expects the delivery of a high-quality software application that is reliable, stable, efficient and secure. Yacoset’s rigorous testing and debugging techniques are important to successfully achieving these ends. For a client, there is little worse than being handed a finished product that fails upon delivery or, worse, fails when his or her customers are using the software. Can you envision spiraling losses when an E-Commerce system produces errors during the shopping cycle or allows someone to crack through a hole in the system and access critical data? Testing helps ensure that errors are resolved before deployment so operations can be streamlined–made more efficient–security can be heightened, goals can be achieved and businesses can focus on profits.
