Monday, 21 September 2015

The Basic Approach to Software Quality Assurance.



Software testing or Software Quality Assurance verifies and validates that the application or program fulfills its process requirements. It identifies the severity level of the errors in the system that requires fixing and defines its quality factors in terms of reliability, usability, security, portability and compatibility. Software Testing is generally limited within budget and timeline. Adhering to predefined principles ensures effective testing generating plausible results despite limitations.






Principles of Testing

A principle can be defined as an accepted rule or more appropriately a standard guideline which helps in carrying out an action effectively and consistently. Certain principles can be followed while software testing. In this article we have tried listing as many of them.

1.    Test until the program fails – The true value of testing is achieved when errors are detected. Hence, this process should be executed with the intention of exposing failures to the maximum extent.

2.    Initiate Testing Early – Initiating the process of testing early in the development cycle fixes huge errors and reduces cascading errors in the later stages. This also reduces the risk of reworking on the same code in the final phase.

3.    Evaluate the Context – Testing differs as per the context of the software being developed. Example: the testing of a security software or a banking software will differ completely from that of a regular E-Commerce software. Also, the testing process in a waterfall model differs from the process followed in Agile methodology. The test objective as well differs at different points in a software development life cycle. The testing approach should thus be determined on requirements, risks, objective, knowledge, economy and time.

4.    Define the Plan: Software Testing is carried out for achieving a specific purpose that should be documented in quantifiable terms. Hence test plans should be defined in terms of scope, objectives, strategy, environment, risks, schedule, tools, techniques and end deliverable.

5.    Design Test Cases: The requirements should be well understood before designing test cases. The test cases should be written before the performing the tests. If there is confusion over the test requirements and product architecture then designing test cases will be ineffective.  A test case definition should describe the input data and the corresponding correct output. This documentation of the expected output is necessary to provide an unambiguous testing result.

6.    Review Test Cases: Executing same test cases will not generate new errors after a certain period of time. Hence as debugging is carried out, the test cases should be revised to find more defects. 

7.    Use Valid as well as Invalid Conditions: Along with valid input values, the testing should also be performed with invalid or absurd input values. Invalid input cases detect          errors at a higher rate by triggering failures.

8.    Engage different Testers: As already stated, testing is context dependent and so is are its purposes. Hence testing at various levels should be performed by different people/team. This will yield better results. Example: Acceptance testing should be performed by the users, unit testing should be performed by developers, release testing should be performed by Quality Managers etc.

9.    Innovate: It is practically impossible to guarantee the absence of errors. Hence testing should be carried out more on the highly used vulnerable components as compared to the lesser used components.

10. Perform Cross Dimensional Testing: Static testing goes into the depth of the application by revealing the problems in the domain and the data structures. Dynamic testing covers the breadth with extreme input values that are not generally used.

11. Cluster the Defects: Errors keep occurring in the section where errors were already found. Hence such sections should be subjected to more rigorous testing.
12. Evaluate the Tests: Test cases should be evaluated to test its effectiveness. This is determined by its rate of error detection.

13. Perform Negative Testing: Focus is usually put on establishing the fact that the software performs as per the specifications. Another approach to test an application is by ensuring that it does not function the way it is not supposed to.

14. Conclude Realistically: Testing although a continuous process needs to be concluded somewhere. A balance should be reached considering the factors of time, budget and software quality.

While following the various principles, the limiting factors should also be taken into account. Independent Software Testing gives appropriate results if the principles are followed accordingly.

Conclusion:

Defining the best approaches, practices, methodologies for optimized testing still remains a struggle as the this process is very informally approached. Even if there is no automated or well defined tool in place for Quality Assurance, at least the goals, principles and limitations should be conceptualized to attain the maximum goals.          

Tuesday, 1 September 2015

Software Testing – Its Goals - Its Limitations.



Software Testing or Software Quality Assurance verifies and validates the software application against its initial technical requirements. It is used for determining software quality factors like reliability, usability, security, integrity, capability, efficiency, portability, compatibility etc. The procedures may differ as per the purpose for which the software is being tested. This also needs to be performed well within its specified budget and time limits.  






Software Testing Goals:

In testing, goals can be defined as intended outputs. It has the following goals:

Verify and Validate: Software testing is a quality control measure. It is used to verify that the application or product works as desired. It reports the status of the actual application in comparison to the requirements. Hence, it should reveal as many inconsistencies as possible, verify if the software is meeting its initial requirement specifications and further validate its quality.

Prioritization of Test coverage: As already stated, exhaustive testing is not possible due to many constraints mainly budgetary and time limitations. Therefore, the test coverage areas should be defined properly. Highly frequent functions should be tested more thoroughly than infrequent functions. For optimized results, highly used components should be isolated and tested more thoroughly.

Balance: Testing needs to be balanced between the negotiated requirements, the practical limitations and user expectations. The end users viewpoints cannot be all that matter as all the needs may not be achievable due to limitations in time, budget and technical feasibility.

Deterministic: While testing, it should be clear as to what is being tested and what will be its possible outcome. All the errors and defects should be exposed while performing a particular testing. This clean insight helps in determining the cost, time and the overall development.

Traceability: Comprehensive documents need to be maintained as testing is being performed. This helps to avoid chaos and hence eliminate duplicate testing.
The Limitations:

The limitation of testing needs to be considered to set a realistic expectation of its outcome. The main limitations of testing can be listed as follows:

-          It is done with the intention of finding errors. Exposing failures make this process more effective. Thus it cannot show the absence of errors.

-          It only delays the process. It provides no help to decide on the product's immediate deployment or to delay its release.

-          It cannot ensure the overall compatibility of the system rather it establishes its compatibility only on a specified combination of the system.

-          Software Testing does not enable locating the exact error. Rather it just establishes the existence of one.

-          A total or exhaustive software testing is practically not feasible. This leads to compromise and thus it cannot be ensured that the final delivered product is entirely bug-free.

Conclusion:

Software testing can give excellent results if they are performed efficiently and effectively. It helps to improve an application by identifying its defects and problems. Independent Software testing is aimed at achieving both implicit and explicit goals. To achieve this, everyone who is involved with this process must be aware of its goals, its principles and its limitations.