Тестирование подпрограмм обработки массивов — различия между версиями

Материал из Вики ИТ мехмата ЮФУ
Перейти к: навигация, поиск
(Новая страница: «Предположим, нам следует протестировать функцию <tt>MakeOddArr(N)</tt>, которая создаёт массив из …»)
 
(MakeIntArr → Arr)
 
Строка 1: Строка 1:
Предположим, нам следует протестировать функцию <tt>MakeOddArr(N)</tt>, которая создаёт массив из ''N'' первых нечётных натуральных чисел.
+
Предположим, нам следует протестировать функцию <tt>MakeOddArr(N)</tt>, которая создаёт массив из ''N'' первых нечётных натуральных чисел. Результирующие тесты должны выглядеть так
 
 
=== Шаг 1: создание эталонных массивов ===
 
 
 
 
 
Рассмотрим функцию <tt>MakeIntArr</tt> для создания массива из заданных элементов — аргументов функции.
 
   
 
<source lang="pascal">
 
        /// Конструирует и возвращает массив, состоящий
 
        /// из целых чисел-аргументов функции
 
        function MakeIntArr(params args: array of integer): IntArr;
 
        begin
 
          result := new integer[args.Length];
 
          for var i := 0 to args.Length - 1 do
 
            result[i] := args[i];
 
        end;
 
</source>
 
 
 
Она позволяет легко создать массив из нужных элементов. Например, вызов
 
  
 
<source lang="pascal">
 
<source lang="pascal">
         var myOddArr := MakeIntArr(1, 3, 5);
+
         Assert(IntArrsAreEqual(MakeOddArr(0), new integer[0]));
 +
        Assert(IntArrsAreEqual(MakeOddArr(1), Arr(1)));
 +
        Assert(IntArrsAreEqual(MakeOddArr(3), Arr(1, 3, 5)));  
 
</source>
 
</source>
  
создает массив <tt>myOddArr</tt>, состоящий из трёх элементов: 1, 3, 5.
+
Где функция <tt>IntArrsAreEqual</tt> позволяет поэлементно сравнить два массива: она возвращает истину тогда и только тогда, когда они имеют одинаковую длину и состоят из одних и тех же элементов, расположенных в одном порядке. На занятиях эта функция обычно выдаётся в заготовках тестирующих модулей, но для полноты приведём здесь её реализацию.
 
 
=== Шаг 2: сравнение содержимого массивов на равенство ===
 
 
 
Функция <tt>IntArrsAreEqual</tt> сравнивает содержимое двух данных массивов на равенство: она возвращает истину, если они имеют одинаковую длину и состоят из одних и тех же элементов, расположенных в одном порядке.
 
 
      
 
      
 
<source lang="pascal">
 
<source lang="pascal">
Строка 49: Строка 29:
 
           end;
 
           end;
 
         end;
 
         end;
</source>
 
 
=== Результат ===
 
 
Функцию сравнения массивов можно использовать для написания тестов. Пример тестов для функции <tt>MakeOddArr</tt>, как показано ниже.
 
<source lang="pascal">
 
        Assert(IntArrsAreEqual(MakeOddArr(0), MakeIntArr));
 
        Assert(IntArrsAreEqual(MakeOddArr(1), MakeIntArr(1)));
 
        Assert(IntArrsAreEqual(MakeOddArr(3), MakeIntArr(1, 3, 5)));   
 
 
</source>
 
</source>
  
 
[[Категория:Основы программирования]]
 
[[Категория:Основы программирования]]

Текущая версия на 10:31, 7 декабря 2016

Предположим, нам следует протестировать функцию MakeOddArr(N), которая создаёт массив из N первых нечётных натуральных чисел. Результирующие тесты должны выглядеть так

        Assert(IntArrsAreEqual(MakeOddArr(0), new integer[0]));
        Assert(IntArrsAreEqual(MakeOddArr(1), Arr(1)));
        Assert(IntArrsAreEqual(MakeOddArr(3), Arr(1, 3, 5)));

Где функция IntArrsAreEqual позволяет поэлементно сравнить два массива: она возвращает истину тогда и только тогда, когда они имеют одинаковую длину и состоят из одних и тех же элементов, расположенных в одном порядке. На занятиях эта функция обычно выдаётся в заготовках тестирующих модулей, но для полноты приведём здесь её реализацию.

        /// Проверяет массивы a, b на равенство и возвращает
        /// истину, если они равны
        function IntArrsAreEqual(a, b: IntArr): boolean; 
        begin
          Assert(a <> nil, 'a is nil');
          Assert(b <> nil, 'b is nil');
          // сравниваем длины
          Result := a.Length = b.Length;
          if Result then
          begin
            // здесь result is true
            var i := 0;
            while (i < a.Length) and (a[i] = b[i]) do
              i += 1;
            // если не дошли до конца, значит какие-то элементы не совпадают
            if i < a.Length then
              Result := false;
          end;
        end;