Основы тестирования программного обеспечения

       

Основные проблемы тестирования


Рассмотрим два примера тестирования:

  1. Пусть программа H(x:int, y:int) реализована в машине с 64 разрядным словами, тогда мощность множества тестов ||(X,Y)||=2**64

    Это означает, что компьютеру, работающему на частоте 1Ггц, для прогона этого набора тестов (при условии, что один тест выполняется за 100 команд) потребуется ~ 3K лет.

  2. На Рис. 2.3 приведен фрагмент схемы программы управления схватом робота, где интервал между моментами срабатывания схвата не определен.

    Этот тривиальный пример требует прогона бесконечного множества последовательностей входных значений с разными интервалами срабатывания схвата (Пример 2.8).

// Прочитать значения датчика static public bool ReadSensor(bool Sensor) { //...чтение значения датчика Console.WriteLine("...reading sensor value"); return Sensor; } // Открыть схват static public void OpenHand() { //...открываем схват Console.WriteLine("...opening hand"); } // Закрыть схват static public void CloseHand() { //...закрываем схват Console.WriteLine("...closing hand"); } [STAThread] static void Main(string[] args) { while (true) { Console.WriteLine("Enter Sensor value (true/false)"); if (ReadSensor(Convert.ToBoolean(Console.ReadLine()))) { OpenHand(); CloseHand(); } } } Пример 2.8. Фрагмент программы срабатывания схвата#include <stdio.h> /* Прочитать значения датчика */ int ReadSensor(int Sensor) { /* ...чтение значения датчика */ printf("...reading sensor value\n"); return Sensor; } /* Открыть схват */ void OpenHand() { /* ...открываем схват */ printf("...opening hand\n"); } /* Закрыть схват */ void CloseHand() { /* ...закрываем схват */ printf("...closing hand\n"); } void main(void) { int s; while (1) { printf("Enter Sensor value (0/1)"); scanf("%d",&s); if (ReadSensor(s)) { OpenHand(); CloseHand(); } } } Пример 2.8.1. Фрагмент программы срабатывания схвата


Рис. 2.3.  Тестовая последовательность сигналов датчика схвата

Отсюда вывод:

  • Тестирование программы на всех входных значениях невозможно.
  • Невозможно тестирование и на всех путях.
  • Следовательно, надо отбирать конечный набор тестов, позволяющий проверить программу на основе наших интуитивных представлений

    Требование к тестам - программа на любом из них должна останавливаться, т.е. не зацикливаться. Можно ли заранее гарантировать останов на любом тесте?

  • В теории алгоритмов доказано, что не существует общего метода для решения этого вопроса, а также вопроса, достигнет ли программа на данном тесте заранее фиксированного оператора.

Задача о выборе конечного набора тестов(X,Y) для проверки программы в общем случае неразрешима.

Поэтому для решения практических задач остается искать частные случаи решения этой задачи.



Содержание раздела