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

Тестовое окружение

< Лекция 4 || Практическая работа 3: 12 || Лекция 5 >

7.3.2 На примере "Калькулятора"

Тесты, проделанные нами на прошлом семинаре, как правило, проводятся не вручную. Для целей тестирования пишут специальную программу — тестовый драйвер, который и проводит тестирование. Более того, такие программы часто пишутся на другом языке, нежели тестируемая программа, или создаются автоматически, с помощью специальных утилит.

На этом семинаре мы сами напишем простой тестовый драйвер на C# для тестирования функций "Калькулятора", используя спецификацию второго семинара.

Замечание. Код программы слегка изменен для упрощения компиляции отдельных модулей. Так, исключена работа с переменной Program.res, а класс CalcClass объявлен как public.

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

  1. Оба входных параметра принадлежат допустимой области, и выходное значение принадлежит допустимой области.
  2. Первый входной параметр принадлежит допустимой области, второй не принадлежит допустимой области
  3. Первый входной параметр не принадлежит допустимой области, второй принадлежит допустимой области
  4. Оба входных параметров принадлежат допустимой области, а значение функции не принадлежит допустимой области.

Составим программу:

private void buttonStartDel_Click(object sender, EventArgs e)
        {
            try
            {
                richTextBox1.Text = "";
                richTextBox1.Text += "Test Case 1\n";
                richTextBox1.Text += "Входные данные: a= 78508, b = -304\n";
                richTextBox1.Text += "Ожидаемый результат: res = 78204 &&
                                     error = \"\""+"\n";
                int res = CalcClass.Add(78508, -304);
                string error = CalcClass.lastError;
                richTextBox1.Text += "Код ошибки: " + error + "\n";
                richTextBox1.Text += "Получившийся результат: " +"res = "+
                                     res.ToString() +" error = "+error.ToString() +"\n";
                if (res == 78204 && error == "")
                {
                    richTextBox1.Text += "Тест пройден\n\n";
                }
                else
                {
                    richTextBox1.Text += "Тест не пройден\n\n";
                }
            }
            catch (Exception ex)
            {
                richTextBox1.Text += "Перехвачено исключение: " +
                                     ex.ToString() + "\nТест не пройден.\n";
            }

            try
            {
                richTextBox1.Text += "Test Case 2\n";
                richTextBox1.Text += "Входные данные: a= -2850800078, b =
                                     3000000000\n";
                richTextBox1.Text += "Ожидаемый результат: res = 0 && error =
                                     \"Error 06\"\n";
                int res = CalcClass.Add(-2850800078, 3000000000);
                string error = CalcClass.lastError;
                richTextBox1.Text += "Код ошибки: " + error + "\n";
                richTextBox1.Text += "Получившийся результат: " + "res = " +
                                     res.ToString() + " error = " + error.ToString() + "\n";
                if (res == 0 && error == "Error 06")
                {
                    richTextBox1.Text += "Тест пройден\n\n";
                }
                else
                {
                    richTextBox1.Text += "Тест не пройден\n\n";
                }
            }
            catch (Exception ex)
            {
                richTextBox1.Text += "Перехвачено исключение: " +
                                     ex.ToString() + "\nТест не пройден.\n";
            }

            try
            {
                richTextBox1.Text += "Test Case 3\n";
                richTextBox1.Text += "Входные данные: a= 3000000000, b = -
                                     2850800078\n";
                richTextBox1.Text += "Ожидаемый результат: res = 0 && error =
                                     \"Error 06\"\n";
                int res = CalcClass.Add(3000000000, -2850800078);
                string error = CalcClass.lastError;
                richTextBox1.Text += "Код ошибки: " + error+"\n";
                richTextBox1.Text += "Получившийся результат: " + "res = " +
                                     res.ToString() + " error = " + error.ToString() + "\n";
                if (res == 0 && error == "Error 06")
                {
                    richTextBox1.Text += "Тест пройден\n\n";
                }
                else
                {
                    richTextBox1.Text += "Тест не пройден\n\n";
                }
            }
            catch (Exception ex)
            {
                richTextBox1.Text += "Перехвачено исключение: " +
                                     ex.ToString() + "\nТест не пройден.\n";
            }

            try
            {
                richTextBox1.Text += "Test Case 4\n";
                richTextBox1.Text += "Входные данные: a= 2000000000, b =
                                     2000000000\n";
                richTextBox1.Text += "Ожидаемый результат: res = 0 && error =
                                     \"Error 06\"\n";
                int res = CalcClass.Add(2000000000, 2000000000);
                string error = CalcClass.lastError;
                richTextBox1.Text += "Код ошибки: " + error +"\n";
                richTextBox1.Text += "Получившийся результат: " + "res = " +
                                     res.ToString() + " error = " + error.ToString() + "\n";
                if (res == 0 && error == "Error 06")
                {
                    richTextBox1.Text += "Тест пройден\n\n";
                }
                else
                {
                    richTextBox1.Text += "Тест не пройден\n\n";
                }
            }
            catch (Exception ex)
            {
                richTextBox1.Text += "Перехвачено исключение: " +
                                     ex.ToString() + "\nТест не пройден.\n";
            }
 }
Листинг 7.1. Текст программы

Каждый тестовый пример находится внутри блока try-catch для того, чтобы перехватить любое сгенерированное исключение внутри методов Add().

При этом файл CalcClass.dll, в котором и реализованы все математические методы, необходимо добавить в References проекта.

Проведем тестирование и получим следующий результат:

Test Case 1
Входные данные: a= 78508, b = -304
Ожидаемый результат: res = 78204 && error = ""
Код ошибки:
Получившийся результат: res = 78204 error =
Тест пройден

Test Case 2
Входные данные: a= -2850800078, b = 3000000000
Ожидаемый результат: res = 0 && error = "Error 06"
Код ошибки: Error 06
Получившийся результат: res = 0 error = Error 06
Тест пройден

Test Case 3
Входные данные: a= 3000000000, b = -2850800078
Ожидаемый результат: res = 0 && error = "Error 06"
Код ошибки: Error 06
Получившийся результат: res = 0 error = Error 06
Тест пройден

Test Case 4
Входные данные: a= 2000000000, b = 2000000000
Ожидаемый результат: res = 0 && error = "Error 06"
Код ошибки: Error 06
Получившийся результат: res = 0 error = Error 06
Тест пройден

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

Замечание. Мы считаем, что тестовый драйвер сам не содержит ошибок. Тестирование тестового драйвера выходит за пределы изучаемой темы.

7.4. Раздаточный материал

7.4.1. Программа

Будут выданы .dll файлы, которые нужно протестировать методом "черного ящика", и пример тестового драйвера.

7.5. Домашнее задание

Составить тест-план и провести модульное тестирование следующих методов:

  1. Нахождение остатка.

    /// <summary>
            /// Деление по модулю
            /// </summary>
            /// <param name="a">делимое</param>
            /// <param name="b">делитель</param>
            /// <returns>остаток</returns>
            public static int Mod(long a, long b)
  2. Унарный плюс.

    /// <summary>
            /// унарный плюс
            /// </summary>
            /// <param name="a"></param>
            /// <returns></returns>
            public static int ABS(long a)
  3. Унарный минус.

    /// <summary>
            /// унарный минус
            /// </summary>
            /// <param name="a"></param>
            /// <returns></returns>
            public static int IABS(long a)
  4. Вычитание.

    /// <summary>
            /// вычитание
            /// </summary>
            /// <param name="a">уменьшаемое</param>
            /// <param name="b">вычитаемое</param>
            /// <returns>разность</returns>
            public static int Sub(long a, long b)
  5. Умножение.

    /// <summary>
            /// умножение
            /// </summary>
            /// <param name="a">множитель</param>
            /// <param name="b">множитель</param>
            /// <returns>произведение</returns>
            public static int Mult(long a, long b)
  6. Деление.

    /// <summary>
            /// частное
            /// </summary>
            /// <param name="a">делимое</param>
            /// <param name="b">делитель</param>
            /// <returns>частное</returns>
         public static int Div(long a, long b)
< Лекция 4 || Практическая работа 3: 12 || Лекция 5 >
Илья Макаренко
Илья Макаренко

Добрый день.

Вопрос №1

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

Вопрос №2

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

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

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