Software testing is a very broad term. It includes different methods, approaches as well as previous knowledge about the tested object. The methods are divided into functional and non-functional tests. Functional testing is a type of software testing in which the system is tested against the functional requirements/specifications. Functions (or features) are tested by providing them with inputs and examining the outputs. Non-functional testing, as the name suggests, tests the non-functional features of the software. These include security, performance or usability.
The approach differentiates between manual and automated testing. Automated tests use tools to perform the tests automatically. For example, clicking in a web shop can be automated very well with tools such as Selenium or Appium, while code reviewing is most promising when performed by multiple reviewers. Code reviewing requires access to the code. In this context, one speaks of white-box testing. In the example of the web shop, the testers interact with the application without having insight into the internals of the system or code. This is called black-box testing because no a-priori information about the test system is necessary.
What Is a Functional Test?
In software testing, functional testing includes a variety of different test methods that bring enormous benefits to the development process. When done correctly, it improves communication between project/team leads, developers and testers. Ultimately, development speed is increased because well communicated requirements lead to less follow-up work. Testing also leads to a modular architecture design with sub-components that meet clear requirements. The main goal of functional testing is to verify the functionality of the software system. It mainly focuses on
- Functionality: Testing the main functions of an application
- Accessibility: Checks the accessibility of the system for the user
- Error conditions: Use of testing techniques to check for fault conditions. The system checks whether suitable error messages are displayed.
What Methods Are There?
A code review belongs to the class of white-box testing because access to the code is required. Code review, sometimes referred to as peer review, is a software quality assurance activity in which one or more people review a program, mainly by reading and analyzing parts of the source code and looking for ways to improve it. Although the direct detection of quality problems is often the main objective, code reviews are usually conducted to achieve a combination of objectives:
- Better code quality: Improvement of the internal code quality and maintainability (readability, uniformity, comprehensibility, ...)
- Finding errors: Improvement of quality with regard to external aspects, especially correctness, but also finding performance problems, security holes, infiltrated malware, ...
- Learning/knowledge transfer: help in transferring knowledge about the code base, solution approaches, quality expectations, etc.
- Strengthening the sense of mutual responsibility: strengthening the sense of collective code ownership and solidarity
- Finding better solutions: Generate ideas for new and better solutions and ideas that go beyond existing coding guidelines
- Compliance with QA guidelines: Code reviews are mandatory in some applications, e.g. for safety-critical applications such as air traffic software or banking software
Although code review has historically matured from a manual approach, some aspects such as improving code quality or finding bugs have been automated. A distinction is made between static and dynamic code analysis. The difference is that in the latter case the code is examined at runtime, i.e. depending on the inputs, which can lead to different outputs.
Unit testing ensures that each part of the code developed in a component produces the desired output. In unit testing, developers only consider the interface and specification for a component. Unit tests are usually performed by a developer who has written the units of code, but they are also black-box tests, even though the code for them is usually available.
This usually involves writing unit tests that call the methods in each unit and validate them when the required parameters are passed and the return value is as expected. Code coverage is an important part of unit tests, where the tests cover the most important cases. A distinction is made between code coverage, code path coverage, and method coverage. A good unit test should maximize coverage in the three cases. To achieve this maximization, the automation of unit tests is of great advantage.
Integration tests are performed to test individual components to see how they work together. In other words, it is performed to test the modules that function correctly individually and do not have any errors during integration. It is the most common type of functional testing and is performed as an automated test; generally, developers build several modules of the system/software at the same time and do not focus on others. They perform extensive black and white box functional testing, such as code reviews and unit testing, on each module. Integration tests cause data that then leads to events to flow between the modules, which means that they must act as parts of an overall system rather than as individual components. This typically reveals problems with UI operations, data formats, operation timing, API calls, database access, and user interface operation.
Whenever developers change or modify functionality, it is highly likely that the updates will cause unexpected behavior. Regression testing ensures that a change or the new feature has not corrupted any of the existing functionality. Its purpose is to find bugs that may have been introduced into the existing build by mistake. Regression testing can be easily automated.
System tests are tests that are performed on a complete, integrated system to assess its compliance with the defined requirements, and after completion of the integration tests, the product is released for system testing. System tests are performed by independent testers who have not played a role in the development of the program. These tests are performed in an environment that accurately reflects production. System testing is very important because it verifies that the application meets the technical, functional and business requirements defined by the stakeholders.
What Is the Challenge in Functional Testing?
A functional test is based on the knowledge of what is and what is not acceptable behaviour. Acceptable behavior is defined in a function or requirement specification. It is a document that describes what a user is allowed to do so that he can determine the conformance of the application or system with it.
In addition, this can sometimes include the actual business side scenarios to be validated, so functional testing can be performed using two common techniques:
- Testing on the basis of requirements: Contains all functional specifications that form a basis for all tests to be performed.
- Testing on the basis of business scenarios: Contains all functional specifications that form the basis for all tests to be performed: Contains the information about how the system is perceived from a business process perspective.
Working out the requirements is a really challenging task, because it requires not only the tools of a test engineer, such as programming test automation, but above all the technical knowledge of the software product to be tested, which usually only works with the right domain knowledge, an understanding of customer requirements and the culture of the industry in which the customer operates, as well as their business model. In other words, you can only test what you understand.
Our experts are familiar with functional testing and select the right methods to implement an efficient QA strategy tailored to your software. We pay great attention to the automation of functional tests, so that even small development teams can meet the high customer requirements for high-quality software. We design together with the customer and implement functional testing within CI/CD pipelines to combine the advantages of continuous integration, fast release and automatable continuous testing.