Dynamics
Test Plan $Revision: 1.10 $ State approved
Date 05-Dec-1998 Author Kimmo Mustonen
Review date 08-Dec-1998 Reviewed by Jouni Malinen
Approval date 08-Dec-1998 Approved by Jouni Malinen
$Id: test_plan.html,v 1.10 1998/12/08 21:04:29 jkmaline Exp $

Table of contents

Summary

1. Introduction
        1.1. Terms
        1.2. Document structure
2. Testing areas and objectives
        2.1. Preliminary module testing
        2.2. Module testing
        2.3. Integration testing
        2.4. System testing
        2.5. Objectives
3. Test environment
4. Organization and reports
        4.1. Test reports
        4.2. Schedule
5. Test cases and acceptance criteria
        5.1. Preliminary module tests
        5.2. Module tests
        5.3. Integration tests
        5.4. System test
6. Testing non-functional properties
        6.1. Performance
        6.2. Updatability
        6.3. Portability
        6.4. Usability
        6.5. Installation


Summary

This test plan describes how the testing of the hierarchical IP tunneling project will be done. The goal of the testing is to guarantee that the system meets the specified requirements.

The system will be thoroughly tested by dividing the system into smaller components, called modules, that will be tested first. After passing this test they will be combined to form entities and finally the whole system will be tested. When the system test has been successfully completed, the system should be a stable working prototype that can be further developed.

The testing will be done mainly in Spektri Kvintti using the Linux systems installed there. Most tests can be done without physical attendance.

The programmer of the module is responsible for the first module test, called preliminary module test. After that there will be the module test, integration test and system test that will be done by the test group. The test group is organized by the test manager. The tester fills in the test report forms that will be used while examining the test results. Non-functional properties, like performance, will also be tested.

1. Introduction

This is the test plan for the hierarchial IP tunneling project being done by the Dynamics group. Testing will help to verify that the system works as it is supposed to work and that it meets the requirements specified in the requirements specification document. Both the functional and non-functional properties will be tested.

1.1. Terms

The terminology used in this document follows the custom taken into use in this project. The terms are used as in RFCs of the mobile IP field and they are defined in a separate terminology specification.

This document specifies a few additional terms that are related to testing. These terms are not used elsewhere and they are thus explained here.

Module
A module is a package that consists of a group of functions that are collected together. That functional entity forms a component to the system that the other components may use.

Equivalence class
A set of input values that the function or module processes the same way. In order to be able to test all possible input value combinations, the input values are partitioned into a preferable small number of sets. The sets are chosen so that any input selected from that set produces the same kind of operation. For example, if the input is a signed integer, partitioning to negative numbers, zero and positive numbers forms three different equivalence classes to be tested.

ASSERT() macro
ASSERT() macro tests that the specified condition is true every time that piece of code is executed. The programmers can use ASSERT() macros to claim something about the internal state of the function. Usually there are many conditions that must hold for the correct operation of the function. For example, if a pointer is passed to the function, the programmer may demand that it must not be a null pointer. However, a care must be taken when using ASSERT() macros, because if the condition doesn't hold, the software execution is immediately stopped. That means that assertions must not be used to check if the user has entered valid input to the system but only to verify the internal state of the software.

1.2. Document structure

This document begins with a short summary. Chapter 1 (Introduction) describes briefly this document. The terms used in this document are also explained. Chapter 2 (Testing areas and objectives) defines what is going to be tested and the main objectives of the testing. Chapter 3 (Test environment) defines where the tests will be made. The hardware and software required for testing are described. Chapter 4 (Organization and reports) explains the testing itself. The responsibilities and the test result processing are presented. Chapter 5 (Test cases and acceptance criteria) defines the test cases that will be executed and how the results will be reported. Chapter 6 (Testing non-functional properties) describes how to test other features of the system such as performance and portability.

2. Testing areas and objectives

The whole system will be tested piece by piece to make sure that it is functioning the way it is defined and planned. In order to make the system function well, the underlying components must be carefully designed and implemented. By starting the test from small independent modules we try to make sure that the upper level modules have a stable base underneath to rely on.

2.1. Preliminary module testing

The programmers of the modules will make the first tests of the functions and modules they have implemented. The functions of the modules will contain plenty of ASSERT() macros to make sure that the functions are internally working the way they are designed to do. If any of those assertions fail, we will immediately know what was the place in code where the internal state of the process was not what the programmer had planned it to be. There are hardly ever too many ASSERT() macros in the source code, so we will use them a lot.

If the function or module is only used internally, assertions may be used to check that the input values to the function are valid. Preferably, the function should have a way to return an error code to the calling function. If the functions are called with parameters that come from any external source, like the user or administrator or the network, all invalid input values must be handled without crashing the software. That means that anything the user of the tunnel does, must not cause the assertions to fail.

The programmer will document the module well enough that it can easily be tested. The test functions used in the early module test are included so that the module can easily be tested using that test program. All the valid and invalid inputs should be categorized into different equivalence classes so that we don't need to test every possible combination of input values. The module will be tested until it is functioning as specified and there are no known bugs. When the module seems to be working well and the programmer cannot figure out any way to cause erroneous results, the module is ready for module testing.

2.2. Module testing

In the module testing all the modules will be tested separately. The documentation is checked and the source code is read through. The tester checks all the possible input values and checks that the programmer has correctly separated the input values to equivalence classes. If there are any problems, the tester contacts the programmer to check if there is a problem in the documentation.

The tester will choose at least one set of input values from each equivalence class, also invalid input values. If any one of the test cases does not behave like expected and defined or there are some problems with the source code or documentation, the programmer will be contacted.

2.3. Integration testing

In integration testing the sets of modules will be tested together. The modules that interact with each other are chosen and tested. All the modules should have already passed the module testing and be ready to be connected to other modules. The sets of modules to be tested will be chosen later. If the integration test fails, we will investigate what causes the problem and the malfunctioning module will be corrected.

2.4. System testing

When the integration tests have been successfully completed, the whole system can be tested. The installation and configuration can be tested separately. Also the non-functional properties are tested.

2.5. Objectives

When the system test has completed, the system should be stable and be able to perform the functions as defined. We will keep in mind that the system will only be a prototype. The most important thing is that the main system is functioning so that it can be further developed. All the small details are not as important as in a final end-user product.

3. Test environment

The test environment will mainly be three Linux machines located in Spektri Kvintti. The machines are equipped with 2.1.xxx kernel that is the current development version of the kernel. Most of the tests can be done online through the network, so physical attendance is not required. The necessary software is installed on the machines.

When testing modules that depend on other modules, the programmer will make the necessary stub functions or modules required in the module testing. The programmer will also make the necessary test functions needed to test the module. The test function must make it possible for the tester to easily change the input values and check the output values and possible intermediate values to make sure that the module is working as specified.

For integration tests the stub versions of the main system components are needed. These dummy modules are Home Agent, Foreign Agent and Mobile Node.

4. Organization and reports

The programmer takes care of the preliminary module testing, including the addition of ASSERT() macros, dividing the input values into different equivalence classes and creating the test program for the module. These tests are done at the same time as the module is programmed. All the other tests are done by the test group organized by the test manager. The test group consists of the team members and one or more external volunteers.

4.1. Test reports

The programmer makes the documentation for the module. No separate test report is required for the preliminary module test. The other test results are reported by filling the test form. The module test form is the same for all modules. It is filled by the tester who finally tests the module.

The integration test consists of multiple modules that are combined to make a functional entity. The tester fills in an integration test form that contains the names of the modules and the test results.

The system test is used to test that all components of the whole system work together. The tester fills in the system test form that includes the requirements from the requirement specification. The goal is that the final system passes all these tests.

4.2. Schedule

Module testing is done regularly during the phases. When the programmer has made a module, done the preliminary test for it and documented what it should do, the test manager organizes testing of that module. In each phase of the project, all changed modules will be tested. The integration tests are done when one whole entity of the system is ready to be tested. System tests are done at each phase to verify that the product works at the end of each phase as planned. Some of the non-functional tests can and also will be done during different phases, like estimation of the performance, updatability and portability.

In the P1 phase, all the modules that are used in the prototype will be tested. Integration tests of the entities to be prototyped will be done. The requirements that should be implemented in the prototype will be selected and system tests are run to verify that those properties have been implemented as required.

At the end of the P2 phase the main properties of the system should be functional. The module tests are done on the modules that have changed. Integration tests on the entities, at least Mobile Node, Foreign Agent and Home Agent will be completed. All the system test cases will be checked to verify which of them are still to be implemented. We may be able to test some of the non-functional properties in the previous phases but the main goal is to test them in the P2 phase.

At the end of the project, the changed modules and entities are tested and all the system tests will be performed to make sure that the system is functioning as documented and planned. The non-functional properties will also be tested and documented.

5. Test cases and acceptance criteria

The system is divided into modules. All the modules have their own test cases depending on the module. They will be generated by the programmer and the tester of the module will check them. When the modules are functioning, the three main components will be tested separately in the integration tests. The requirements of the final product are tested in the system test phase.

5.1. Preliminary module test

The programmer divides the input values to different equivalence classes. At least one test case of input values from each equivalence class is performed.

The preliminary module test is accepted when the module works as defined and planned. This requires that all the test cases that the programmer could invent have been done and no known faults exist. The module must function properly with any valid input value and it must not crash with any valid input value. If possible, the module should recognize invalid input values. If the input came from the user, the module must be able to handle the error without causing failed assertions.

5.2. Module test

A person from the test group verifies the equivalence classes created by the programmer and verifies that all the possible cases are covered.

The module test is accepted when the module works the way it should and none of the test cases has revealed any bugs. The end user may not be able to crash the module in the system. If the module is used only internally and there is no reasonable way to report the invalid input values, the module may crash because of assertion failed. However, only internal programming errors may be able to cause that kind of situation, the end user must not be able to cause this.

Each module test produces a filled version of the module test form.

5.3. Integration test

When the different modules and their interaction is known, the team will select a group of interacting modules and test that the modules work together. At least the three main components of the system will be tested in the integration test. These components are Home Agent, Foreign Agent and Mobile Node.

Each test produces a filled versions of the integration test form.

5.3.1. Home Agent

The functionality of the Home Agent will be tested. The integration test cases of this component are defined in the Home Agent test form and the test results will be filled into the same form.

5.3.2. Foreign Agent

The functionality of the Foreign Agent will be tested. The integration test cases of this component are defined in the Foreign Agent test form and the test results will be filled into the same form.

5.3.3. Mobile Node

The functionality of the mobile node will be tested. The integration test cases of this component are defined in the Mobile Node test form and the test results will be filled into the same form.

5.4. System tests

At least the system with one Home Agent, two Foreign Agents and one Mobile Node will be tested. The installation and configuration will be tested separately. The test cases are in the system test form. The test produces a filled version of the test report form.

6. Testing non-functional properties

Usually testing a functional part gives the result quite easily, it is either working as it should be or not. Measuring non-functional properties is more difficult. Usually the level of the non-functional property can only be estimated.

The non-functional parts of this system are performance, updatability, portability, usability and ease of installation.

6.1. Performance

The performance of the tunnel can be tested by transferring a big file for example using FTP through the tunnel. The same file is transferred also without the tunnel. The resulting speeds can then be compared.

Response times can be tested in a similar way. We choose a node in the home network and ping it using the tunnel and repeat the same test without the tunnel. The node in the home network is chosen because otherwise the routes could be totally different.

6.2. Updatability

The system and especially the protocol version numbering scheme is analysed to verify that it is possible and easy to create a simple protocol enhancement or design new protocol versions.

6.3. Portability

Some parts of the source code will be tested if they can be compiled using different compilers on different systems. In addition to gcc/Linux/i386, also gcc/Digital Unix/alpha, cc/Digital Unix/alpha and SAS/Amiga/m68k will be tested. That way we can have some idea about the portability of the system. This can also reveal some programming errors, because different compilers report different kind of things. Because of the kernel differences, the system will probably not be able to run on those environments without taking additional actions that we are not going to do. Thus, porting to other systems will not be done.

6.4. Usability

The overall usability of the system and the configuration tools will be estimated. A user who is not involved in the project should be able to establish tunneling and control the tunnels with the help of the online help functions after having read the user's manual.

6.5. Installation

The system will also be installed by users that have not been involved in the project. If the installation causes problems, the installation instructions have to be made easier to understand.