Introduction - Software Testing (I)
Tags: webdev, codenewbie, software, testing
Published: 2020-05-09 19:26:12

Hi again, everybody. During a series of posts, we will be talking about software testing. And in order to address this topic, we will start by talking about two concepts that surround: **quality** and **standards**. Here you can see the posts of this series:

| <center> Content </center>       |
|-----------------------------------|
|<center>[**Types of tests**](https://dev.to/vplentinax/types-of-tests-software-testing-ii-50g8)</center>|
|<center>**Unit tests (very soon)**</center>|

### **Software quality**
Software quality is the **degree** to which the software meets the functional requirements established with the client, with explicitly documented development standards and with the characteristics expected of any professionally developed software. 

We can deduced that:
- If the software does not meet the initial requirements, it will not be of quality.
- Development standards guide how to make the software, so if the software does not meet these standards, it will not be of quality.
- If the software has major errors, or is not easy to use or is difficult to maintain, it will not be of quality.

**Determining quality is very complicated** due to the nature of the software, since it is not a tangible element like other industrial products, but it must be free of errors, allow measurements and validate the development process.

Throughout the software development process, periodic verifications are performed that should allow:
- Verify that the product is being built correctly.
- Validate that the correct product is being built, that is, the one that the user really wants.

### **Certification standards**
Standardization is the process of preparing, disseminating, applying, and improving the rules that are used in different scientific, industrial, or economic activities to order and improve them.

Standardization allows:
- **Simplify**, that is, reduce the models to be left with only the most necessary ones.
- **Unify** to allow exchange at the international level.
- **Specify** to avoid identification errors by creating clear and precise language.

Certification is the action carried out by a recognized entity, independent of the interested parties, through which it is established that an organization, product, process or service complies with the requirements established in the standards or technical specifications. It leads the company to differentiate itself from the rest and activates the market by demonstrating that it follows quality standards. Applying for a certification is voluntary, costs incurred and must be renewed periodically. The best known organizations that we can mention are:

#### ISO
**International Organization for Standardization** is a non-government agency responsible for promoting the development of international standards for manufacturing, commerce and communication for all industries except electrical and electronics. Its main function is to seek the standardization of product and security standards for companies or organizations internationally. The standards it produces are **called ISO standards**. The ISO 9000 family of standards are the most widely used in the software industry.

#### IEC
**International Electrotechnical Commission** is a standardization organization in the field of electrical, electronic, and related technologies. Numerous standards are developed in conjunction with ISO and are called ISO / IEC standards. For example, ISO / IEC 90003:2014 provides guidance to organizations and companies on the application of ISO 9001:2008 for the acquisition, supply, development, operation and maintenance of software and related support services.

#### IEEE
**Institute of Electrical and Electronics Engineers** is a  worldwide professional technical association associated with standardization, among others. Currently is the largest international non-profit association made up of professionals in new technologies, such as electrical engineers, electronic engineers, computer engineers, biomedical engineers, television engineers. communication and mechatronics engineers. According to the same IEEE, it's job is to promote creativity, development and integration, share and apply advances in information technology, electronics and science in general for the benefit of humanity and the professionals themselves. They collaborate with ISO and IEC on common problems. The best known standards of this organization are:

- IEEE 730: Plans that ensure software quality.
- IEEE 829: Software testing documentation.
- IEEE 982.1, 982.2: Standard dictionary of measures to produce reliable software.
- IEEE 1008: Software unit tests.
- IEEE 1012: Software verification and validation.
- IEEE 1028: Software review.
- IEEE 1044: Standard classification for software anomalies.
- IEEE 1061: Standard for a software quality metrics methodology.
- IEEE 1228: Software security plans.

## **Tests**
Extensive testing of the software is impractical, as not all of it's functionality can be tested, even in small, simple programs. The purpose of testing is to **detect defects**, software **bugs**, so a **test** is **successful** if a **defect is discovered**. 

The testing process begins with generating a test plan based on the project documentation and the software documentation to be tested. From this plan, the specific tests are detailed, they are executed with the test cases and the results are obtained. Results may indicate errors, and errors should then be documented and reported in order to correct them and rerun the tests.

Test plans should not be made thinking that there are no flaws; **one must assume that there always are**. As tests, they should be planned and systematically designed to detect the maximum number and variety of defects with minimal time and effort.  Undocumented or not carefully designed testing should be avoided.

Testing should focus on two objectives: testing whether the software **is not doing what it should be**, and testing whether the software **is doing what it should not be**, that is, whether it causes adverse side effects. It's common to forget this last objective.

#### Types of tests
There are different ways to classify the tests and these are not mutually exclusive:

- **Functional and non-functional**: The former are intended to verify some functional requirements of the software and the latter are not. Examples of non-functional tests: those that indicate the effort required to learn how to handle that software, analyze the code and locate an error, support changes and facilitate the tests associated with those changes, or migrate the software to another environment.

- **Manuals and automatic tests**: The former follow a detailed plan and there is no automatic process for executions. The second has an automatic process that can be repeated as many times as you like comfortably.

- **Dynamics and static tests**: The former are done while the software is running and the latter are not.

There are operations that certain tools perform in the code to detect defects, although they are not strictly tests:

- **Code Validation:** allows you to ensure that the code complies with some language standard.
- **Debugging:** It allows to detect the code that gives erroneous results in the execution.

- **Code lines analysis:** it allows to detect, for example, the code repeated in several places, review the code that is documented and that will facilitate the task of automatic generation of documentation (Javadoc in Java), find commented code lines that take up space even if they don't work and can be removed using a version control system.

Well, it was enough for today. I know this introduction has been very theoretical, but it will be much more visual in the next post. I hope you continue with me on this software testing tour.

If you have had experiences worth telling while doing your software tests, I would love to read them!

See you soon!