Знакомство и установка NUnit


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

Автоматизированный тестовый код

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

Прежде чем использовать NUnit, давайте рассмотрим, каким образом мы могли бы создавать тесты до того, как были доступны платформы модульного тестирования. Чтобы пример кода не стал громоздким, мы рассмотрим очень простой пример. Класс ниже используется для расчета комиссии, выплачиваемой продавцу, на основе стоимости заказа. Бизнес-правила гласят, что продажи менее 1000 рублей обеспечивают комиссию в размере 2,5 %, заказы свыше 1000 рублей и менее 10 000 рублей привлекают комиссию в размере 5 %, а продажи в размере 10 000 рублей и более приносят комиссию в размере 7,5 %. Этот класс содержит несколько ошибок.

    class CommissionCalculator
    {
        public double CalculateCommission(double saleValue)
        {
            double commission;
            if (saleValue < 1000)
                commission = saleValue * 0.025;
            else if (saleValue > 10000)
                commission = saleValue * 0.075;
            else
                commission = saleValue * 0.005;

            return Math.Round(commission, 2, MidpointRounding.AwayFromZero);
        }
    }
Без фреймворка тестирования C# мы можем решить создать консольное приложение, которое ссылается на сборку, содержащую вышеуказанный класс, и содержит наши тесты. Код для тестов может быть добавлен в основной метод консольного приложения. Каждый тест может быть отдельным методом, который выполняет действие и проверяет, соответствуют ли результаты ожидаемым. Например, тестовый код может быть следующим:

  static CommissionCalculator _calculator = new CommissionCalculator();

        private static void Test999_99Sale()
        {
            if (_calculator.CalculateCommission(999.99) != 25)
                Console.WriteLine("Fail - Commission on 999.99 should be 25.00");
        }

        private static void Test1000_00Sale()
        {
            if (_calculator.CalculateCommission(1000) != 50)
                Console.WriteLine("Fail - Commission on 1000.00 should be 50.00");
        }

        private static void Test9999_99Sale()
        {
            if (_calculator.CalculateCommission(9999.99) != 500)
                Console.WriteLine("Fail - Commission on 9999.99 should be 500.00");
        }

        private static void Test10000Sale()
        {
            if (_calculator.CalculateCommission(10000) != 750)
                Console.WriteLine("Fail - Commission on 10000.00 should be 750.00");
        }
В приведенном выше коде у нас есть четыре теста, каждый из которых вычисляет комиссию для другого значения и проверяет правильность результата. Значения, выбранные для расчетов, находятся на границах изменения процентных ставок комиссии. Мы проверили все проценты, чтобы убедиться, что выполняется каждый путь с помощью метода CalculateCommission.

Выполнение тестового кода приводит к следующему результату:

Fail - Commission on 1000.00 should be 50.00
Fail - Commission on 9999.99 should be 500.00
Fail - Commission on 10000.00 should be 750.00
Эти три сбоя указывают на ошибки в коде. Теперь мы могли бы попытаться исправить эти ошибки и повторно запустить тесты, пока все они не пройдут, и мы не убедимся, что ошибки исправлены. Однако отчеты об ошибках не особенно полезны. Они сообщают нам, каков был ожидаемый результат и что тест не удался, но они не сообщают нам, каково было фактическое расчетное значение.

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

Фреймворки для тестирования

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

Существует множество платформ тестирования, доступных для .NET-разработчиков. Некоторые из них являются коммерческими продуктами, для которых необходимо приобрести лицензию. Другие предоставляются бесплатно. Некоторые включают графические инструменты для выполнения тестов, другие предоставляют средства запуска тестов из командной строки или интеграцию с Visual Studio.

На этом и следующих уроках вы увидите примеры использования платформы тестирования NUnit. Я выбрал NUnit, потому что его можно быстро загрузить, использовать бесплатно и он имеет графический инструмент для выполнения тестов. Он может быть интегрирован в Visual Studio с помощью дополнительных инструментов, таких как TestDriven.NET, но также может использоваться автономно, поэтому совместим со всеми выпусками Visual Studio.

Установка NUnit

Процесс установки NUnit будет отличаться в зависимости от выбранной версии и полученного установочного пакета. Проще всего в визуал студии выбрать nuget



И уже в нем ввести NUnit и установить



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

Повторный просмотр тестового кода с помощью NUnit

С установленным NUnit мы можем вернуться к коду автоматического тестирования из консольного приложения. Для начала создайте новый проект библиотеки классов и добавьте в него класс CommissionCalculator. Затем добавьте в решение другой проект библиотеки классов. Этот проект будет содержать тесты. Рекомендуется хранить тесты в отдельном проекте, чтобы они не включались ни в одну сборку, поставляемую с вашим продуктом.

Для тестового проекта требуется две ссылки. Чтобы он мог получить доступ к тестируемому коду, добавьте ссылку на проект, содержащий класс CommissionCalculator. Чтобы упростить код, убедитесь, что вы включили следующую директиву using в свои тестовые классы.

using NUnit.Framework;
Чтобы завершить тестовый проект, добавьте приведенный ниже код в новый класс с именем "Commissioncalculatortests". Этот код содержит логику тестирования в общедоступных методах. Обратите внимание на атрибуты, используемые для идентификации тестов, и команды Assert, которые определяют ожидаемую функциональность.

    public class CommissionCalculatorTests
    {
        CommissionCalculator _calculator = new CommissionCalculator();

        [Test]
        public void Test999_99Sale()
        {
            Assert.AreEqual(25, _calculator.CalculateCommission(999.99));
        }

        [Test]
        public void Test1000_00Sale()
        {
            Assert.AreEqual(50, _calculator.CalculateCommission(1000));
        }

        [Test]
        public void Test9999_99Sale()
        {
            Assert.AreEqual(500, _calculator.CalculateCommission(9999.99));
        }

        [Test]
        public void Test10000Sale()
        {
            Assert.AreEqual(750, _calculator.CalculateCommission(10000));
        }
    }
Обратите внимание на атрибуты, используемые для идентификации тестов, и команды Assert, которые определяют ожидаемую функциональность. Использование этих элементов будет описано в следующих статьях цикла.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегизаметки, си шарп, тестирование, NUnit




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




Урок 10. Получение результатов от параллельных задач C#
Урок по работе со строками (String) на C#
Урок 23. Введение в JCF Java