Опубликован: 05.03.2005 | Доступ: свободный | Студентов: 14172 / 1942 | Оценка: 4.11 / 3.63 | Длительность: 13:20:00
ISBN: 978-5-9556-0027-7
Специальности: Тестировщик
Лекция 2:

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

< Лекция 1 || Лекция 2: 1234 || Лекция 3 >

Три фазы тестирования

Реализация тестирования разделяется на три этапа:

  • Создание тестового набора (test suite) путем ручной разработки или автоматической генерации для конкретной среды тестирования (testing environment).
  • Прогон программы на тестах, управляемый тестовым монитором (test monitor, test driver [IEEE Std 829-1983], [ 9 ] ) с получением протокола результатов тестирования (test log).
  • Оценка результатов выполнения программы на наборе тестов с целью принятия решения о продолжении или остановке тестирования.

Основная проблема тестирования - определение достаточности множества тестов для истинности вывода о правильности реализации программы, а также нахождения множества тестов, обладающего этим свойством.

Простой пример

Рассмотрим вопросы тестирования на примере простой программы (Пример 2.6) на языке С#. Текст этой программы и некоторых других несколько видоизменен с целью сделать иллюстрацию описываемых фактов более прозрачной.

/* Функция вычисляет неотрицательную
   степень n числа x */
1  double Power(double x, int n){
2  double z=1; int i;
3  for (i=1;
4  n>=i;
5  i++)
6  {z = z*x;} /* Возврат в п.4 */
7  return z;}
2.6. Пример простой программы на языке С#
/* Функция вычисляет неотрицательную
   степень n числа x */
1  double Power(double x, int n){
2  double z=1; int i;
3  for (i=1;
4  n>=i;
5  i++)
6  {z = z*x;} /* Возврат в п.4 */
7  return z;}
2.6.1. Пример простой программы на языке С
Управляющий граф программы

Рис. 2.2. Управляющий граф программы

Управляющий граф программы (УГП) на Рис. 2.2 отображает поток управления программы. Нумерация узлов графа совпадает с нумерацией строк программы. Узлы 1 и 2 не включаются в УГП, поскольку отображают строки описаний, т.е. не содержат управляющих операторов.

Управляющий граф программы

Управляющий граф программы (УГП) – граф G(V,A), где V(V1,… Vm) – множество вершин (операторов), A(A1,… An) – множество дуг (управлений), соединяющих операторы-вершины.

Путь – последовательность вершин и дуг УГП, в которой любая дуга выходит из вершины Vi и приходит в вершину Vj, например: (3,4,7), (3,4,5,6,4,5,6), (3,4), (3,4,5,6)

Ветвьпуть (V1, V2, … Vk), где V1 - либо первый, либо условный оператор программы, Vk - либо условный оператор, либо оператор выхода из программы, а все остальные операторы – безусловные, например: (3,4) (4,5,6,4) (4,7). Пути, различающиеся хотя бы числом прохождений цикла – разные пути, поэтому число путей в программе может быть не ограничено. Ветви - линейные участки программы, их конечноe число.

Существуют реализуемые и нереализуемые пути в программе, в нереализуемые пути в обычных условиях попасть нельзя.

float H(float x,float y)
  {
  float H;
1  if (x*x+y*y+2<=0)
2  H = 17;
3  else H = 64;
4  return H*H+x*x;
  }
2.7. Пример описания функции с реализуемыми и нереализуемыми путями
float H(float x,float y)
  {
  float H;
1  if (x*x+y*y+2<=0)
2  H = 17;
3  else H = 64;
4  return H*H+x*x;
  }
2.7.1. Пример описания функции с реализуемыми и нереализуемыми путями

Например, для функции Пример 2.7 путь (1,3,4) реализуем, путь (1,2,4) нереализуем в условиях нормальной работы. Но при сбоях даже нереализуемый путь может реализоваться.

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

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

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

    Это означает, что компьютеру, работающему на частоте 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) для проверки программы в общем случае неразрешима.

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

< Лекция 1 || Лекция 2: 1234 || Лекция 3 >
Анастасия Соляник
Анастасия Соляник
Ольга Софинская
Ольга Софинская

Прошла он-лайн курс "Основы тестирования программного обеспечения"

Александр Тотьмянин
Александр Тотьмянин
Россия