Национальный исследовательский ядерный университет «МИФИ»
Опубликован: 28.11.2007 | Доступ: свободный | Студентов: 5108 / 774 | Оценка: 4.53 / 3.65 | Длительность: 22:18:00
ISBN: 978-5-94774-825-3
Специальности: Программист, Тестировщик
Лекция 3:

Тестирование программного кода (тестовые примеры)

4.1.2. Типы тестовых примеров

Рассмотрим различные классы тестовых примеров, направленные на выявление различных дефектов в работе программной системы.

  • Допустимые данные

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

    record_type   test_value1;
    int       i;
    
    test_value1.A         = false;
    for (i=0;i<20;i++)
       test_value1.B[i]   = i;
    for (i=0;i<5;i++)
       test_value1.C[i]   = i+5;
    test_value1.D[0]     = i+8;
    test_value1.CRC     = 0;
    
    Set_CRC(test_value1);
    
    printf("%d\n", test_value1.CRC);

    Сценарием будет вызов функции Set_CRC, а ожидаемым выходным значением - корректное значение поля CRC, рассчитанное по алгоритму CRC32.

    Обычно для проверки допустимых данных достаточно одного тестового примера. Но функциональные требования могут определять различные группы допустимых данных, которые могут объединяться в классы эквивалентности. В этом случае необходимо определять как минимум один тестовый пример для одного класса эквивалентности. Более подробно речь о классах эквивалентности пойдет далее.

  • Граничные данные

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

    Для тестирования функции Set_CRC на граничных условиях можно определить два тестовых примера с минимальными и максимальными значениями полей в записи.

    record_type   test_value2;
    record_type   test_value3;
    int         i;
    
    test_value2.A       = false;
    for (i=0;i<20;i++)
       test_value2.B[i]    = 0;
    for (i=0;i<5;i++)
       test_value2.C[i]    = 0;
    test_value2.D[0]    = 0;
    test_value2.CRC  = 0;
    
    Set_CRC(test_value2);
    
    printf("%d\n", test_value2.CRC);
    
    test_value3.A       = true;
    for (i=0;i<20;i++)
       test_value3.B[i]   = pow(2,sizeof(test_value3.B[i])*8)-1;
    for (i=0;i<5;i++)
       test_value3.C[i]    = pow(2,sizeof(test_value3.C[i])*8)-1;
    test_value3.D[0]    = pow(2,sizeof(test_value3.D[0])*8)-1;
    test_value3.CRC  = pow(2,sizeof(test_value3.CRC)*8)-1;
    
    Set_CRC(test_value3);
    
    printf("%d\n", test_value3.CRC);
  • Отсутствие данных

    Дефекты могут проявиться и в случае, если системе не передается никаких данных или передаются данные нулевого размера. Для тестирования функции Set_CRC при отсутствии данных можно вызвать ее, передав в качестве параметра неинициализированную структуру. Однако такой тест не является точным примером отсутствия данных, скорее, это пример случайных данных (возможно - неверных).

    record_type test_value4;
    
    Set_CRC(test_value4);
    
    printf("%d\n", test_value4.CRC);
  • Повторный ввод данных

    В случае повторной передачи на вход системы тех же самых данных могут получаться различия в выходных данных, не предусмотренные в требованиях. Как правило, дефекты такого типа проявляются в результате того, что система не устанавливает внутренние переменные в исходное состояние или в результате ошибок округления.

    record_type   test_value5;
    int       i;
    
    test_value5.A       = false;
    for (i=0;i<20;i++)
       test_value5.B[i]    = i;
    for (i=0;i<5;i++)
       test_value5.C[i]    = i+5;
    test_value5.D[0]    = i+8;
    test_value5.CRC  = 0;
    
    Set_CRC(test_value5);
    printf("%d\n", test_value5.CRC);
    
    Set_CRC(test_value5);
    printf("%d\n", test_value5.CRC);
  • Неверные данные

    При проверке поведения системы необходимо не забывать проверять ее поведение при передаче ей данных, не предусмотренных требованиями - слишком длинных или слишком коротких строк, неверных символов, чисел за пределами вычислимого диапазона и т.п. Неверные данные, как и допустимые, также можно разделять на различные классы эквивалентности. Примером неверных данных для функции Set_CRC может служить запись с другой структурой, переданная в функцию через приведение типов. Если расчет контрольной суммы использует имена полей записи, то контрольная сумма может оказаться вычисленной неверно или может произойти перезапись областей памяти, не предназначенных для хранения данных.

    struct record_type2
    {
      int F;
      int G[45];
      int H[8];
      unsigned int CRC;
      int K[2];
    }
    record_type2   test_value6;
    
    Set_CRC((record_type)test_value6);
    
    printf("%d\n", test_value6.CRC);
  • Реинициализация системы

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

    Примером реинициализации модуля вычисления CRC может служить принудительное обнуление переменной empty.

    record_type   test_value7;
    int       i;
    
    test_value7.A       = false;
    for (i=0;i<20;i++)
       test_value7.B[i]    = i;
    for (i=0;i<5;i++)
       test_value7.C[i]    = i+5;
    test_value7.D[0]    = i+8;
    test_value7.CRC  = 0;
    
    Set_CRC(test_value7);
    
    printf("%d\n", test_value1.CRC);
    
    empty=true;
    
    Set_CRC(test_value7);
    
    printf("%d\n", test_value1.CRC);
  • Устойчивость системы

    Под устойчивостью системы можно понимать ее способность выдерживать нештатную нагрузку, явно не предусмотренную требованиями. Например, стоит вопрос, сохранит ли система работоспособность после 10 тысяч вызовов. Для функции Set_CRC можно реализовать следующий тестовый пример:

    record_type   test_value8;
    int       i;
    
    test_value8.A       = false;
    for (i=0;i<20;i++)
       test_value8.B[i]    = i;
    for (i=0;i<5;i++)
       test_value8.C[i]    = i+5;
    test_value8.D[0]    = i+8;
    test_value8.CRC  = 0;
    
    for (i=0;i<10000;i++)
       Set_CRC(test_value8);
    
    printf("%d\n", test_value1.CRC);

    Аналогичный анализ может быть сделан путем просмотра текста программы (если он доступен при тестировании) на основании отсутствия "истории" (хранимых данных) в реализации программы, т.е. данных, значение которых может меняться в зависимости от количества запусков программы. Таким образом, в ряде случаев тестирование может быть заменено анализом программного кода.

  • Нештатные состояния среды выполнения

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

    Примером тестового примера, создающего нештатное состояние среды, для функции Set_CRC может служить выделение всей свободной памяти перед вызовом функции. Если Set_CRC использует динамическую память, то в ней должны присутствовать проверки на возможность выделить память, в противном случае выполнение функции вызовет ее аварийное завершение:

    record_type   test_value9;
    int       i;
    int       *heap;
    
    heap = malloc(_MAXMEM);
    
    test_value9.A       = false;
    for (i=0;i<20;i++)
       test_value9.B[i]    = i;
    for (i=0;i<5;i++)
       test_value9.C[i]    = i+5;
    test_value9.D[0]    = i+8;
    test_value9.CRC  = 0;
    
    Set_CRC(test_value9);
    
    free(heap);
    
    printf("%d\n", test_value9.CRC);
Илья Макаренко
Илья Макаренко

Добрый день.

Вопрос №1

Какова стоимость получения диплома о мини-МБА по данному курсу? Или ориентироваться на указанную на сайте?

Вопрос №2

Возможно ли начать обучение без потери результатов, не отправив документы на зачисление, а отправку выполнить позже?

Александр Медов
Александр Медов

Здравствуйте, какова полная сумма предоставленной услуги с печатью документа и отправкой по почте?