The following post has been co-authored with Claudio Chinosi & Mauro Pessina.
What is software testing? In a nutshell, software testing is an investigation to provide stakeholders with information about the quality of the product or service under test.
This definition is the key to a whole world that relies on more than 100 testing types and techniques: a jungle where getting lost is natural. The reason of this complexity can be explained by the ISO/IEC 9126, the international standard for software quality evaluation, which defines 6 quality factors to keep in mind HOW evaluating software quality:
Each quality factor has a full set of sub-characteristics. Each characteristic is divided into attributes and each testing technique is aimed toward the evaluation of one or more attributes. Covering the whole set of attributes without losing the specificity of the single test take a large number of different methodologies.
To meet project deadlines budget availability and time constrains, many factors occur. How to deal with the clients’ objectives and the right testing to execute? This decision is even more complex where testing lifecycle is not precisely defined. Typically, to identify testing objectives, we conduct a workshop session with open questions to have a brainstorming activity where customers highlight their necessities. Then it is a work for testing experts – together with the customer – to understand customer needs and realize whether objectives are correct and, more important, they can be satisfied.
Objectives can be expressed also as software requirements, also splitting them into at least two different layers of abstraction: business and IT. The business one defines the opportunity and states a specific need: the business requirement. while The IT layer splits the same requirement into more detailed pieces understood by IT specialists (e.g. business analysts, developers, project manager and testers). Those are named technical requirements (functional or non-functional requirements).
From a pure management standpoint, the business requirements are high level requirements that would be typically understood, as follows:
“The portal should be able to sustain the same load coming from previous existing standalone applications”
Functional requirements, on the other hand, are very detailed and outline exactly what needs to be done and would typically be read by business analysts, developers and project manager:
Accordingly, non-functional requirements are very detailed and they outline what needs to be tested and would typically be read by project manager and performance testers:
Doing such an activity, it is important to decline business requirements into technical requirements, this simply because without a correct definition there is no way of effectively communicating to stakeholders, to make sure that both parts have the same understanding about objectives and expected outcomes when the project will end.
While caring about correct translation of business requirements into technical requirements, we need to deeply consider at least other 3 factors:
Use cases show typical user interaction with the application deployment, describing the complete flow of an end user functionality. Each use case can include quantitative estimates about user behaviors, useful to determine system requirements for performance, availability, and other qualities of service. Use cases are also the starting point to design the logical architecture.
Usage analysis determines the usage patterns according to the different users type defined during the deployment design. The collected information provides a feedback on the expected load conditions and is later used to determine performance and other system requirements.
System requirements (e.g. availability, latent capacity, security, performance, etc.) describe the quality of service a deployed system must provide to meet the business requirements through business analysis (use cases and usage analysis).
Obviously, what mentioned above describes the generic case in which a brand new software has to be deployed, and the more level of detail is put when dealing with both business and technical requirements, the lower will be the risk of losing information during the overall project.Taking into account the two non-functional requirements previously stated, among all the existing non-functional tests, a load test – a testing technique that puts demand on a system or device and measures its response – would best verify them.
On the other hand, considering the functional requirements stated above, interface tests (to evaluate whether systems or components pass data and control correctly to one another) and GUI software tests (the process of testing a product that uses a graphical user interface, to ensure it meets its written specifications) would best verify them.
Moreover, when new parts of software are released (e.g. new features inserted in an already existing application) or technology refresh occurs (e.g. migration to a new operating system version) other type of tests (e.g. regression tests – that seeks to uncover software errors after changes to the program have been made, by retesting the program) would be required to ensure system non-regression verification.
Software testing is a big jungle, made of more than a hundred types of tests. Overall, a first categorization can be done dividing types of tests into two main macro-areas: functional and non-functional testing. Three brief use cases were provided to give an understanding about testing, which vary accordingly to objectives. Identifying which type of test best fits customer need is not trivial.
Basically, reasons for the above are: