Как проверить код в visual studio
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Open with Desktop
- View raw
- Copy raw contents Copy raw contents
Copy raw contents
Copy raw contents
Сведения о том, как создать, выполнить и настроить серию модульных тестов с помощью платформы модульных тестов Майкрософт для управляемого кода и обозревателя тестов в Visual Studio.
Пошаговое руководство. Создание и запуск модульных тестов для управляемого кода
Создайте проект для тестирования
Запустите Visual Studio.
В меню Файл выберите Создать > Проект.
Откроется диалоговое окно Новый проект .
Присвойте проекту имя Bank и нажмите кнопку ОК.
Будет создан проект Bank. Он отобразится в обозревателе решений, а его файл Program.cs откроется в редакторе кода.
[!NOTE] Если файл Program.cs не откроется в редакторе, дважды щелкните Program.cs в обозревателе решений, чтобы открыть его.
Запустите Visual Studio.
На начальном экране выберите Создать проект.
Назовите проект Bank и щелкните Далее.
Будет создан проект Bank. Он отобразится в обозревателе решений, а его файл Program.cs откроется в редакторе кода.
[!NOTE] Если файл Program.cs не откроется в редакторе, дважды щелкните Program.cs в обозревателе решений, чтобы открыть его.
Переименуйте файл в BankAccount.cs, щелкнув его правой кнопкой мыши и выбрав команду Переименовать в обозревателе решений.
В меню Сборка нажмите Построить решение (или нажмите клавиши CTRL + SHIFT + B).
Теперь у вас есть проект с методами, которые можно протестировать. В этой статье тестирование проводится на примере метода Debit . Метод Debit вызывается, когда денежные средства снимаются со счета.
Создание проекта модульного теста
В меню Файл выберите Добавить > Создать проект.
[!TIP] В обозревателе решений щелкните решение правой кнопкой мыши и выберите пункты Добавить > Создать проект.
В поле Имя введите BankTests , а затем нажмите кнопку ОК.
Проект BankTests добавляется в решение Банк.
[!NOTE] в Visual Studio 2019 версии 16.9 шаблон проекта MSTest имеет формат проекта модульного теста.
Назовите проект BankTests и щелкните Далее.
Проект BankTests добавляется в решение Банк.
В проекте BankTests добавьте ссылку на проект Банк.
В обозревателе решений щелкните Зависимости в проекте BankTests, а затем выберите в контекстном меню элемент Добавить ссылку или Добавить ссылку на проект.
В диалоговом окне Диспетчер ссылок разверните Проекты, выберите Решение и выберите элемент Банк.
Создание тестового класса
Создание тестового класса, чтобы проверить класс BankAccount . Можно использовать UnitTest1.cs, созданный в шаблоне проекта, но лучше дать файлу и классу более описательные имена.
Переименуйте файл и класс
- Чтобы переименовать файл, в обозревателе решений выберите файл UnitTest1.cs в проекте BankTests. В контекстном меню выберите команду Переименовать (или нажмите клавишу F2), а затем переименуйте файл в BankAccountTests.cs.
- Чтобы переименовать класс, выберите Да в открывшемся диалоговом окне, предлагающем также переименовать ссылки на элемент кода.
- Чтобы переименовать класс, поместите курсор в UnitTest1 в редакторе кода, щелкните правой кнопкой мыши и выберите команду Переименовать (или нажмите клавиши F2). Введите название BankAccountTests и нажмите клавишу ВВОД.
Файл BankAccountTests.cs теперь содержит следующий код:
Добавьте оператор using
Можно также добавить оператор using в класс, чтобы тестируемый проект можно было вызывать без использования полных имен. Вверху файла класса добавьте:
Требования к тестовому классу
Минимальные требования к тестовому классу следующие:
Атрибут [TestClass] является обязательным в любом классе, содержащем методы модульных тестов, которые необходимо выполнить в обозревателе тестов.
Каждый метод теста, предназначенный для запуска в обозревателе тестов, должен иметь атрибут [TestMethod] .
Можно иметь другие классы в проекте модульного теста, которые не содержат атрибута [TestClass] , а также иметь другие методы в тестовых классах, у которых атрибут — [TestMethod] . Можно вызывать эти другие классы и методы в методах теста.
Создание первого тестового метода
В этой процедуре мы напишем методы модульного теста для проверки поведения метода Debit класса BankAccount .
Существует по крайней мере три поведения, которые требуется проверить:
Метод создает исключение xref:System.ArgumentOutOfRangeException , если сумма по дебету превышает баланс.
Метод создает исключение xref:System.ArgumentOutOfRangeException, если сумма по дебету меньше нуля.
Если значение дебета допустимо, то метод вычитает сумму дебета из баланса счета.
[!TIP] Метод по умолчанию TestMethod1 можно удалять, так как он не используется в этом руководстве.
Создание метода теста
Первый тест проверяет, снимается ли со счета нужная сумма при допустимом размере кредита (со значением меньшим, чем баланс счета, и большим, чем ноль). Добавьте следующий метод в этот класс BankAccountTests :
Метод очень прост: он создает новый объект BankAccount с начальным балансом, а затем снимает допустимое значение. Он использует метод xref:Microsoft.VisualStudio.TestTools.UnitTesting.Assert.AreEqual%2A?displayProperty=nameWithType, чтобы проверить, что конечный баланс соответствует ожидаемому. Такие методы, как Assert.AreEqual , xref:Microsoft.VisualStudio.TestTools.UnitTesting.Assert.IsTrue%2A?displayProperty=nameWithType и другие, зачастую используются в модульном тестировании. Дополнительную концептуальную информацию о написании модульного теста см. в разделе Написание тестов.
Требования к методу теста
Метод теста должен удовлетворять следующим требованиям:
Он декорируется атрибутом [TestMethod] .
Он возвращает void .
Он не должен иметь параметров.
Сборка и запуск теста
В меню Сборка нажмите Построить решение (или нажмите клавиши CTRL + SHIFT + B).
Откройте Обозреватель тестов, выбрав Тест > Windows > Обозреватель тестов в верхней строке меню (или нажмите клавиши CTRL + E, T).
Выберите Запустить все, чтобы выполнить тест (или нажмите клавиши CTRL + R, V).
Во время выполнения теста в верхней части окна Обозреватель тестов отображается анимированная строка состояния. По завершении тестового запуска строка состояния становится зеленой, если все методы теста успешно пройдены, или красной, если какие-либо из тестов не пройдены.
В данном случае тест пройден не будет.
Выберите этот метод в обозревателе тестов для просмотра сведений в нижней части окна.
Исправление кода и повторный запуск тестов
Модульный тест обнаружил ошибку: сумма списания добавляется на баланс счета, вместо того чтобы вычитаться.
Повторный запуск теста
В обозревателе тестов выберите Запустить все, чтобы запустить тест повторно (или нажмите клавиши CTRL + R, V). Красно-зеленая строка становится зеленой, чтобы указать, что тест был пройден.
. moniker range="=vs-2022" . moniker-end
Использование модульных тестов для улучшения кода
В этом разделе рассматривается, как последовательный процесс анализа, разработки модульных тестов и рефакторинга может помочь сделать рабочий код более надежным и эффективным.
Мы создали тестовый метод для подтверждения того, что допустимая сумма правильно вычитается в методе Debit . Теперь проверим, что метод создает исключение xref:System.ArgumentOutOfRangeException, если сумма по дебету:
Создание и запуск новых методов теста
Создадим метод теста для проверки правильного поведения в случае, когда сумма по дебету меньше нуля:
Мы используем метод xref:Microsoft.VisualStudio.TestTools.UnitTesting.Assert.ThrowsException%2A для подтверждения правильности созданного исключения. Этот метод приводит к тому, что тест не будет пройден, если не возникнет исключения xref:System.ArgumentOutOfRangeException. Если временно изменить тестируемый метод для вызова более общего исключения xref:System.ApplicationException при значении суммы по дебету меньше нуля, то тест работает правильно — то есть завершается неудачно.
Чтобы проверить случай, когда размер списания превышает баланс, выполните следующие действия:
Создать новый метод теста с именем Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange .
Скопировать тело метода из Debit_WhenAmountIsLessThanZero_ShouldThrowArgumentOutOfRange в новый метод.
Присвоить debitAmount значение, превышающее баланс.
Выполните два теста и убедитесь, что они пройдены.
Еще раз проанализировав тестируемый метод BankAccount.Debit , можно заметить, что оба условных оператора используют конструктор ArgumentOutOfRangeException , который просто получает имя аргумента в качестве параметра:
Рефакторинг тестируемого кода
Затем изменим два условных оператора в методе Debit :
Рефакторинг тестовых методов
В этом случае метод Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange может выглядеть следующим образом:
Повторное тестирование, переписывание и анализ
Метод теста сейчас обрабатывает не все требуемые случаи. Если тестируемый метод Debit не смог выдать исключение xref:System.ArgumentOutOfRangeException, когда значение debitAmount было больше остатка (или меньше нуля), метод теста выдает успешное прохождение. Это нехорошо, поскольку метод теста должен был завершиться с ошибкой в том случае, если исключение не создается.
Это является ошибкой в методе теста. Для решения этой проблемы добавим утверждение xref:Microsoft.VisualStudio.TestTools.UnitTesting.Assert.Fail%2A?displayProperty=nameWithType в конце тестового метода для обработки случая, когда исключение не создается.
Однако повторный запуск теста показывает, что тест теперь оказывается непройденным при перехватывании верного исключения. Блок catch перехватывает исключение, но метод продолжает выполняться, и в нем происходит сбой на новом утверждении xref:Microsoft.VisualStudio.TestTools.UnitTesting.Assert.Fail%2A?displayProperty=nameWithType. Чтобы разрешить эту проблему, добавим оператор return после StringAssert в блоке catch . Повторный запуск теста подтверждает, что проблема устранена. Окончательная версия метода Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange выглядит следующим образом:
Усовершенствования тестового кода привели к созданию более надежных и информативных методов теста. Но что более важно, в результате был также улучшен тестируемый код.
[!TIP] В этом пошаговом руководстве используется платформа модульных тестов Microsoft для управляемого кода. Обозреватель тестов также может запускать тесты c платформ модульных тестов стороннего производителя, которые имеют адаптеры для обозревателя тестов. Дополнительные сведения см. в разделе Установка платформ модульного тестирования сторонних поставщиков.
Сведения о запуске тестов из командной строки см. в разделе Параметры командной строки VSTest.Console.exe.
В этом пошаговом руководстве рассматриваются возможности отладчика Visual Studio. Более полное описание функций отладчика см. в статье c Знакомство с отладчиком Visual Studio. Отладка приложения обычно означает запуск и выполнение приложения с подключенным отладчиком. При этом в отладчике доступно множество способов наблюдения за выполнением кода. Вы можете пошагово перемещаться по коду и просматривать значения, хранящиеся в переменных, задавать контрольные значения для переменных, чтобы отслеживать изменение значений, изучать путь выполнения кода, просматривать выполнение ветви кода и т. д. Если вы не знакомы с процессом отладки, перед выполнением задач в этой статье рекомендуется прочесть документ об отладке для начинающих.
В этом руководстве рассмотрены следующие задачи:
- Запуск отладчика и попадание в точки останова.
- Использование команд для пошагового выполнения кода в отладчике.
- Проверка переменных в подсказках к данным и окнах отладчика.
- Просмотр стека вызовов
Предварительные требования
У вас должна быть установлена среда Visual Studio и рабочая нагрузка Разработка классических приложений на C++ .
Установите Visual Studio бесплатно со страницы скачиваемых материалов Visual Studio, если еще не сделали этого.
Установите Visual Studio 2022 бесплатно со страницы скачиваемых материалов Visual Studio 2022, если еще не сделали этого.
Если вам нужно установить рабочую нагрузку, но вы уже используете Visual Studio, выберите пункт Средства > Получить средства и компоненты. , после чего запустится Visual Studio Installer. Запускается Visual Studio Installer. Выберите рабочую нагрузку Разработка классических приложений на C++ , а затем нажмите Изменить.
Создание проекта
Сначала вы создадите проект консольного приложения на C++. Для этого типа проекта уже имеются все нужные файлы шаблонов, что избавляет вас от лишней работы.
Откройте Visual Studio 2017.
В верхней строке меню последовательно выберите Файл > Создать > Проект.
В левой области диалогового окна Новый проект разверните узел Visual C++ и выберите Рабочий стол Windows. В средней области выберите Консольное приложение Windows. Назовите проект get-started-debugging.
Новый проект открывается в Visual Studio.
Запустите Visual Studio.
Если окно запуска не открыто, выберите Файл > Окно запуска.
На начальном экране выберите Создать проект.
В поле поиска окна Создание проекта введите консоль. Затем выберите C++ в списке языков и Windows в списке платформ.
Применив фильтры языка и платформы, выберите шаблон Консольное приложение и нажмите кнопку Далее.
В поле Имя проекта окна Настроить новый проект введите get-started-debugging. Затем нажмите Создать.
Новый проект открывается в Visual Studio.
Создание приложения
Откройте файл get-started-debugging.cpp и замените все его содержимое по умолчанию следующим кодом:
Запуск отладчика
Нажмите клавишу F5 (Отладка > Начать отладку) или кнопку Начать отладку на панели инструментов отладки.
При нажатии клавиши F5 происходит запуск приложения с присоединенным отладчиком. Но пока мы не сделали ничего особенного, чтобы проанализировать код. Поэтому приложение будет просто загружено, и вы увидите выходные данные консоли.
В этом руководстве мы более подробно рассмотрим приложение с отладчиком и познакомимся с возможностями отладчика.
Остановите отладчик, нажав красную кнопку остановки (SHIFT + F5).
В окне консоли нажмите клавишу ВВОД, чтобы закрыть его.
Установка точки останова и запуск отладчика
В цикле for функции main установите точку останова, щелкнув левое поле следующей строки кода:
В месте установки точки останова появится красный круг .
Точки останова — это один из самых простых и важных компонентов надежной отладки. Точка останова указывает, где Visual Studio следует приостановить выполнение кода, чтобы вы могли проверить значения переменных или поведение памяти либо выполнение ветви кода.
Нажмите клавишу F5 или кнопку Начать отладку. Запустится приложение и отладчик перейдет к строке кода, где задана точка останова.
Желтая стрелка представляет оператор, на котором приостановлен отладчик. В этой же точке приостанавливается выполнение приложения (этот оператор пока не выполнен).
Если приложение еще не запущено, клавиша F5 запускает отладчик и останавливается в первой точке останова. В противном случае F5 продолжает выполнение приложения до следующей точки останова.
Точки останова полезны, если вам известны строка или раздел кода, которые вы хотите подробно изучить. Дополнительные сведения о различных типах точек останова, которые можно задать, например об условных точках останова, см. в разделе Использование точек останова.
Переход по коду в отладчике с помощью пошаговых команд
Здесь мы используем в основном сочетания клавиш, так как они позволяют быстро выполнять приложение в отладчике (эквивалентные команды, например команды меню, отображаются в круглых скобках).
Во время приостановки в цикле for в методе main дважды нажмите клавишу F11 (или выберите Отладка > Шаг с заходом), чтобы перейти к вызову метода SendMessage .
После двойного нажатия клавиши F11 вы должны находиться на следующей строке кода:
Еще раз нажмите клавишу F11, чтобы выполнить шаг с заходом в метод SendMessage .
Желтый указатель перемещается в метод SendMessage .
F11 — это команда Шаг с заходом, которая выполняет приложение с переходом к следующему оператору. Клавишу F11 удобно использовать для более детальной проверки потока выполнения. (Мы также покажем другие варианты более быстрого перемещения по коду.) По умолчанию отладчик пропускает непользовательский код (дополнительные сведения см. в статье об отладке в режиме "Только мой код").
Предположим, что вы закончили изучать метод SendMessage и хотите выйти из него, но остаться в отладчике. Это можно сделать с помощью команды Шаг с выходом.
Нажмите сочетание клавиш SHIFT + F11 (или Отладка > Шаг с выходом).
Эта команда возобновляет выполнение приложения (и работу отладчика) до возврата данных текущим методом или текущей функции.
Вы должны вернуться в цикл for в методе main , приостановленный на вызове метода SendMessage .
Нажмите клавишу F11 несколько раз, пока не вернетесь к вызову метода SendMessage .
Во время приостановки на вызове метода один раз нажмите клавишу F10 (или выберите Отладка > Шаг с обходом).
Обратите внимание, что в этот раз отладчик не заходит в метод SendMessage . Клавиша F10 перемещает отладчик без захода в функции или методы в коде приложения (код продолжает выполняться). Нажав клавишу F10 (а не F11) в вызове метода SendMessage , мы пропускаем код реализации для SendMessage (пока это нас не интересует). Дополнительные сведения о различных способах перемещения по коду см. в разделе Навигация по коду в отладчике.
Переход по коду с помощью команды "Выполнение до щелкнутого"
Нажмите клавишу F5, чтобы перейти к точке останова.
В редакторе кода прокрутите вниз и наведите указатель мыши на функцию std::wcout в методе SendMessage , чтобы в левой части появилась зеленая кнопка Выполнение до щелкнутого. В подсказке для кнопки выводится "Выполнить до этого места".
Кнопка Выполнение до щелкнутого впервые появилась в Visual Studio 2017. (Если кнопка с зеленой стрелкой отсутствует, воспользуйтесь клавишей F11, чтобы переместить отладчик в нужное место.)
Отладчик перемещается к функции std::wcout .
Использование этой кнопки аналогично установке временной точки останова. Функция Выполнение до щелкнутого удобна для быстрой работы в видимой области кода приложения (можно щелкнуть в любом открытом файле).
Быстрый перезапуск приложения
Кнопка Перезапустить позволяет сэкономить время, затрачиваемое на остановку приложения и перезапуск отладчика. Отладчик приостанавливается в первой точке останова, достигнутой при выполнении кода.
Отладчик еще раз останавливается в точке останова, ранее заданной вами в цикле for .
Проверка переменных с помощью подсказок по данным
Функции, позволяющие проверять переменные, являются самыми полезными возможностями отладчика. Реализовывать эту задачу можно разными способами. Часто при попытке выполнить отладку проблемы пользователь старается выяснить, хранятся ли в переменных значения, которые требуются ему в определенное время.
При приостановке на операторе name += letters[i] наведите указатель мыши на переменную letters и увидите ее значение по умолчанию — size= .
Разверните переменную letters , чтобы просмотреть ее свойства, включая все элементы, которые она содержит.
Затем наведите указатель мыши на переменную name , чтобы просмотреть ее текущее значение — пустую строку.
Несколько раз нажмите клавишу F5 (или выберите Отладка > Продолжить), чтобы выполнить несколько итераций по циклу for , каждый раз снова приостанавливая выполнение в точке останова и наводя указатель мыши на переменную name , чтобы просмотреть ее значение.
Значение переменной изменяется при каждой итерации цикла for — f , затем fr , fre и т. д.
Часто при отладке требуется быстро проверить значения свойств в переменных, чтобы убедиться, что в них хранятся ожидаемые значения. Советы по данным — отличный способ это сделать.
Проверка переменных с помощью окон "Видимые" и "Локальные"
Взгляните на окно Видимые в нижней части редактора кода.
Если оно закрыто, откройте его во время приостановки в отладчике, выбрав Отладка > Окна > Видимые.
В окне Видимые отображаются переменные и их текущие значения. В окне Видимые отображаются все переменные, используемые в текущей или предыдущей строке (сведения о зависящем от языка поведении см. в соответствующей документации).
Затем посмотрите на окно Локальные на вкладке рядом с окном Видимые.
Разверните переменную letters , чтобы отобразить элементы, которые она содержит.
В окне Локальные показаны переменные, которые находятся в текущей области, то есть текущем контексте выполнения.
Установка контрольного значения
В основном окне редактора кода щелкните правой кнопкой мыши переменную name и выберите команду Добавить контрольное значение.
В нижней части редактора кода откроется окно Контрольное значение. В окне Контрольное значение можно указать переменную (или выражение), которую необходимо отслеживать.
Теперь у вас есть контрольное значение, заданное для переменной name , и по мере перемещения по отладчику вы можете наблюдать за изменением его значения. В отличие от других окон переменных, в окне Контрольное значение всегда отображаются просматриваемые вами переменные (они выделяются серым цветом, когда находятся вне области действия).
Просмотр стека вызовов
Во время приостановки в цикле for щелкните окно Стек вызовов, которое по умолчанию открыто в нижней правой области.
Если оно закрыто, откройте его во время приостановки в отладчике, выбрав Отладка > Окна > Стек вызовов.
Несколько раз нажмите клавишу F11, пока отладчик не приостановится в методе SendMessage . Взгляните на окно Стек вызовов.
В окне Стек вызовов показан порядок вызова методов и функций. В верхней строке приведена текущая функция (в данном приложении метод SendMessage ). Во второй строке показано, что функция SendMessage была вызвана из метода main и т. д.
Окно Стек вызовов аналогично перспективе "Отладка" в некоторых интегрированных средах разработки, например Eclipse.
Стек вызовов хорошо подходит для изучения и анализа потока выполнения приложения.
Дважды щелкните строку кода, чтобы просмотреть исходный код. При этом также изменится текущая область, проверяемая отладчиком. Это действие не перемещает отладчик.
Для выполнения других задач можно воспользоваться контекстными меню из окна Стек вызовов. Например, можно вставлять точки останова в указанные функции, перемещать отладчик с помощью функции Выполнение до текущей позиции и изучать исходный код. Дополнительные сведения см. в разделе Практическое руководство. просмотреть стек вызовов.
Изменение потока выполнения
Дважды нажмите клавишу F11, чтобы запустить функцию std::wcout .
Приостановив отладчик в вызове метода SendMessage , с помощью мыши захватите желтую стрелку (указатель выполнения) в левой части и переместите ее вверх на одну строку — обратно в std::wcout .
Нажмите клавишу F11.
Отладчик повторно выполнит функцию std::wcout (вы увидите это в выходных данных окна консоли).
Изменяя поток выполнения, можно решать множество задач, например тестировать различные пути выполнения кода или повторно выполнять код без перезапуска отладчика.
Как правило, при работе с этой функцией необходимо соблюдать осторожность — вы увидите соответствующее предупреждение во всплывающей подсказке. Могут отображаться и другие предупреждения. При перемещении указателя предыдущее состояние приложения не возвращается.
Чтобы продолжить выполнение приложения, нажмите клавишу F5.
Поздравляем с завершением этого учебника!
Следующие шаги
В этом руководстве вы узнали, как запускать отладчик, осуществлять пошаговое выполнение кода и проверять переменные. Возможно, вы захотите получить более полное представление о функциях отладчика, а также воспользоваться ссылками на дополнительные сведения.
Visual Studio включает эффективный интегрированный набор средств сборки и отладки проектов. Из этой статьи вы узнаете, как Visual Studio может помочь обнаружить проблемы в коде с помощью построения выходных данных, анализа кода, средств отладки и модульных тестов.
Мы разобрались, как работать с редактором, и написали код. Теперь необходимо убедиться, что код работает должным образом. Отладка в Visual Studio, как и в большинстве интегрированных сред разработки (IDE), осуществляется в два этапа: построение кода для обнаружения и устранения ошибок проекта и компилятора и выполнение кода для обнаружения ошибок времени выполнения и динамических ошибок.
Сборка кода
Существует два основных типа конфигурации сборки: отладка и выпуск. При использовании конфигурации отладка создается более крупный и медленный исполняемый файл, обеспечивающий более широкие интерактивные возможности отладки во время выполнения. Исполняемый файл конфигурации отладка никогда не следует отправлять. Конфигурация выпуск позволяет создать более быстрый оптимизированный исполняемый файл, подходящий для отправки (по крайней мере с точки зрения компилятора). По умолчанию используется конфигурация Отладка.
Самый простой способ выполнить сборку проекта — нажать клавишу F7, однако вы также можете начать сборку, выбрав в главном меню пункты Сборка > Собрать решение.
Процесс сборки можно наблюдать в окне Вывод в нижней части пользовательского интерфейса Visual Studio. Здесь отображаются ошибки, предупреждения и операции сборки. При наличии ошибок (или предупреждений выше заданного уровня) сборка завершится ошибкой. Можно щелкнуть ошибку и предупреждение, чтобы перейти к строке, где они возникли. Для перестроения проекта можно нажать клавишу F7 (чтобы перекомпилировать только файлы с ошибками) или CTRL+ALT+F7 (для чистого полного перестроения).
После успешного выполнения построения вы увидите примерно следующие результаты в окне Вывод:
Просмотр списка ошибок
Если вы внесли какие-либо изменения в код, который был ранее и успешно скомпилирован, возможно, возникнет ошибка. Если вы новичок в написании кода, возможно, их будет много. Ошибки иногда очевидны, например простая синтаксическая ошибка или неправильное имя переменной, а иногда их причину трудно выяснить, имея в распоряжении только зашифрованный код. Чтобы получить более четкое представление о проблеме, перейдите вниз окна Вывод сборки и щелкните вкладку Список ошибок. При этом вы перейдете к более организованному представлению ошибок и предупреждений для проекта и получите доступ к некоторым дополнительным параметрам.
Щелкните строку ошибки в окне Список ошибок, чтобы перейти в строку кода, в которой возникла ошибка. (Кроме того, номера строк можно включить, нажав клавиши Ctrl+Q, введя номера строк, а затем выбрав Включить или отключить отображение номеров строк в результатах. Это самый быстрый способ перехода в диалоговое окно Параметры, где можно включить номера строк.
Нажмите клавиши CTRL+G для быстрого перехода к номеру строки, в которой возникла ошибка.
Ошибку можно узнать по подчеркиванию красной волнистой линией Чтобы получить дополнительные сведения, наведите на нее указатель мыши. Внесите исправления, и подчеркивание исчезнет, хотя в результате исправления может возникнуть новая ошибка (это называется "регрессия").
Пройдите список ошибок и устраните все ошибки в коде.
Просмотр подробных сведений об ошибках
Многие ошибки трудны для восприятия, будучи представленными в терминах компилятора. В этом случае могут потребоваться дополнительные сведения. Из окна Список ошибок можно выполнить автоматический поиск в поисковой системе Bing для получения дополнительных сведений об ошибке или предупреждении. Щелкните правой кнопкой мыши по соответствующей строке записи и выберите Показать справочные сведения об ошибке из контекстного меню или щелкните гиперссылку с кодом ошибки в столбце код в списке ошибок.
В зависимости от настроек результаты поиска по коду и описанию ошибки откроются в веб-браузере либо во вкладке Visual Studio с результатами поиска Bing. Представленные результаты — из различных источников в Интернете, и, возможно, не все они будут полезными.
Анализ кода
Средства анализа выполняют поиск общих проблем в коде, которые могут привести к ошибкам времени выполнения или проблемам управления кодом.
Анализ кода C++
Чтобы выполнить анализ кода C++, запустите статический анализ кода. Запустить этот компонент после устранения всех очевидных ошибок, препятствующих успешной сборке, и потратить некоторое время, чтобы устранить создаваемые им предупреждения, — очень полезная привычка. Вы сможете избавиться от определенных будущих проблем, а также научитесь некоторым полезным приемам написания кода.
Нажмите клавиши ALT+F11 (или выберите в верхнем меню команду Анализ > Выполнить анализ кода в решении) для запуска статического анализа кода.
Все новые или обновленные предупреждения отображаются на вкладке Список ошибок в нижней части интегрированной среды разработки. Щелкните предупреждение для перехода к нему в коде.
Использование быстрых действий для исправления или рефакторинга кода
Если вы привыкли работать с клавиатурой, вы можете использовать клавиши со стрелками и сочетание клавиш CTRL+ . для проверки возможностей оптимизации и очистки кода!
Запуск очистки кода
Помимо форматирования пробелов, отступов и т. п., функция Очистка кода применяет определенные вами соглашения о стиле кода. Ваши настройки для каждого стиля кода считываются из файла EditorConfig, если такой существует в проекте, или из раздела Параметры стиля кода, который доступен через диалоговое окно Параметры.
Отладка выполняемого кода
Успешно завершив сборку кода и его очистку, запустите код, нажав клавишу F5 или выбрав команду Отладка > Начать отладку. Приложение будет запущено в среде отладки, и вы сможете пронаблюдать его поведение. Интегрированная среда разработки Visual Studio изменяется во время выполнения приложения: окно Вывод заменяется двумя новыми окнами (в конфигурации окон по умолчанию): окном с вкладками Видимые/Локальные/Контрольные значения и окном с вкладками Стек вызовов/Точки останова/Параметры исключений/Вывод. Эти окна имеют несколько вкладок, которые позволяют просмотреть и проверить переменные, потоки, стеки вызовов приложения и другие характеристики поведения во время выполнения приложения.
Остановите приложение, нажав клавиши SHIFT+F5 или кнопку Остановить. Кроме того, можно просто закрыть главное окно приложения (или диалоговое окно командной строки).
Задание простых точек останова
Точки останова — это один из самых простых и важных компонентов надежной отладки. Точка останова указывает, где Visual Studio следует приостановить выполнение кода, чтобы вы могли проверить значения переменных или поведение памяти либо выполнение ветви кода. После установки или удаления точек останова перестраивать проект не нужно.
Установите точку останова, щелкнув дальнее поле строки, в которой требуется приостановить выполнение, или нажмите клавишу F9, чтобы установить точку останова в текущей строке кода. Выполнение кода прерывается (останавливается) перед инструкциями для этой строки кода.
Чаще всего точки останова используются для решения следующих задач.
Чтобы точнее определить источник аварийного завершения или отсутствия отклика программы, расставьте точки останова вокруг и непосредственно в коде вызова метода, который, по вашему мнению, приводит к сбою. При выполнении кода в отладчике удаляйте, а затем снова устанавливайте точки останова ближе друг к другу, пока не найдете строку кода, вызывающую ошибку. Выполнение кода в отладчике описывается в следующем разделе.
При добавлении нового кода установите точку останова в его начале и выполните код, чтобы убедиться в том, что он работает правильно.
При реализации сложного поведения задайте точки останова для алгоритмического кода, чтобы можно было проверить значения переменных и данные при прерывании программы.
При написании кода C или C++ используйте точки останова для остановки кода, чтобы можно было проверить значения адреса (ищите значение NULL) и просмотреть значения счетчиков при отладке ошибок, связанных с памятью.
Дополнительные сведения о точках останова см. в статье Использование точек останова.
Проверка кода во время выполнения
Когда выполнение кода приостанавливается из-за достижения точки останова, строка кода, помеченная желтым цветом (текущий оператор), еще не выполнена. Вы можете выполнить текущий оператор и проверить, как изменились значения. Для выполнения кода в отладчике можно использовать ряд команд пошагового выполнения. Если отмеченный код является вызовом метода, вы можете выполнить шаг с заходом, нажав клавишу F11. Кроме того, можно выполнить шаг с обходом строки кода, нажав клавишу F10. Дополнительные команды и подробные сведения о пошаговом выполнении кода см. в статье Навигация по коду с помощью отладчика.
Код, представленный на предыдущей иллюстрации, может выполняться отладчиком по одному оператору. Для этого можно нажимать клавишу F10 или F11 (так как здесь нет вызова метода, результат выполнения обеих команд будет одинаковым).
Когда отладчик приостанавливает выполнение, можно проверить переменные и стеки вызовов, чтобы разобраться в происходящем. Находятся ли значения в тех диапазонах, которые вы ожидали увидеть? Выполняются ли вызовы в правильном порядке?
Наведите курсор на переменную для просмотра ее текущего значения и ссылок. Если отображается значение, которое вы не ожидали увидеть, возможно, в предыдущем или вызывающем коде имеется ошибка. Более подробные сведения об отладке см. в статье об использовании отладчика.
Кроме того, Visual Studio выводит на экран окно средств диагностики, где можно наблюдать за загрузкой ЦП и использованием памяти приложением в динамике по времени. В дальнейшем в процессе разработки приложения эти средства можно применять для выявления случаев непредвиденно высокой загрузки ЦП или чрезмерного выделения памяти. Это окно можно использовать в сочетании с окном Контрольные значения и точками останова, чтобы определить причину непредвиденно интенсивного использования или неосвобожденных ресурсов. Дополнительные сведения см. в статье Обзор возможностей профилирования.
Запуск модульных тестов
Модульные тесты — это первая линия защиты от ошибок в коде, так как при правильном проведении они позволяют проверять отдельные "модули" кода (как правило, это отдельные функции), которые проще отлаживать, чем всю программу. Visual Studio устанавливает платформу модульного тестирования Майкрософт для управляемого и машинного кода. Платформа модульного тестирования используется для создания модульных тестов, их запуска и передачи результатов таких тестов. Завершив внесение изменений, запустите модульные тесты повторно, чтобы убедиться, что код по-прежнему работает правильно. При использовании выпуска Visual Studio Enterprise можно настроить автоматический запуск тестов после каждой сборки.
Чтобы приступить к работе с модульными тестами, ознакомьтесь со статьей Создание модульных тестов для кода с помощью IntelliTest.
Дополнительные сведения о модульных тестах в Visual Studio, а также о том, как они могут помочь в создании более качественного кода, см. в статье Основные сведения о модульных тестах.
При включении функции Live Unit Testing в решении Visual Studio она визуально описывает охват тестов и их состояние. Она также динамически выполняет тесты при каждом изменении кода и немедленно уведомляет, если изменение вызвало сбой.
Предварительные требования
Создание решения и проекта библиотеки классов
Решение — это просто контейнер для одного или нескольких проектов. Чтобы создать пустое решение, откройте Visual Studio и сделайте следующее:
Выберите Файл > Создать > Проект в меню верхнего уровня Visual Studio.
Введите решение в поле поиска шаблона и выберите шаблон Пустое решение. Присвойте проекту имя UtilityLibraries.
Завершите создание решения.
После создания решения вы создадите библиотеку классов с именем StringLibrary, которая содержит несколько методов расширения для работы со строками.
- В обозревателе решений щелкните решение UtilityLibraries правой кнопкой мыши и последовательно выберите пункты Добавить >Новый проект.
Присвойте проекту имя StringLibrary.
Щелкните Создать, чтобы создать проект.
Замените весь существующий код, отображаемый в редакторе кода, следующим кодом:
StringLibrary имеет три статических метода:
StartsWithUpper возвращает true , если строка начинается с прописной буквы; в противном случае он возвращает false .
StartsWithLower возвращает true , если строка начинается со строчной буквы; в противном случае он возвращает false .
HasEmbeddedSpaces возвращает true , если строка содержит внедренный пробел; в противном случае он возвращает false .
Выберите Сборка > Сборка решения в меню верхнего уровня Visual Studio. Сборка должна выполниться успешно.
Создание тестового проекта
Следующим шагом является создание проекта модульного теста для тестирования библиотеки StringLibrary. Создайте модульные тесты, выполнив следующие действия:
- В обозревателе решений щелкните решение UtilityLibraries правой кнопкой мыши и последовательно выберите пункты Добавить >Новый проект.
Модульные тесты необязательно писать на том же языке, что и библиотеку классов.
Этот учебник по началу работы использует Live Unit Testing с платформой тестирования MSTest. Вы также можете использовать платформы тестирования xUnit и NUnit.
Назовите проект StringLibraryTests и щелкните Далее.
Этот учебник по началу работы использует Live Unit Testing с платформой тестирования MSTest. Вы также можете использовать платформы тестирования xUnit и NUnit.
Проект модульного теста не может автоматически получить доступ к тестируемой библиотеке классов. Вы предоставляете доступ к библиотеке тестов, добавив ссылку на проект библиотеки классов. Для этого щелкните проект StringLibraryTests правой кнопкой мыши и выберите Добавить > Ссылка. В диалоговом окне Диспетчер ссылок щелкните вкладку Решение и выберите проект StringLibrary, как показано на следующей иллюстрации.
Замените стандартный код модульного теста, включенный в шаблон, следующим кодом:
Сохраните проект, выбрав значок Сохранить на панели инструментов.
Так как код модульного теста включает некоторые отличные от ASCII символы, появится указанное ниже диалоговое окно с предупреждением о том, что при сохранении файла в формате ASCII по умолчанию некоторые символы будут потеряны.
В раскрывающемся списке Кодировка диалогового окна Дополнительные параметры сохранения выберите параметр Юникод (UTF-8, без сигнатуры), кодовая страница 65001, как показано на следующей иллюстрации:
Скомпилируйте проект модульного теста, выбрав Сборка > Перестроить решение в меню верхнего уровня Visual Studio.
Вы создали библиотеку классов, а также несколько модульных тестов для нее. Вы завершили подготовку к использованию Live Unit Testing.
Включение Live Unit Testing
Вы уже написали тесты для библиотеки классов StringLibrary, но еще не запускали их. После включения функция Live Unit Testing выполняет их автоматически. Для этого сделайте следующее:
В меню верхнего уровня Visual Studio выберите Тест > Live Unit Testing > Запустить.
Visual Studio запускает функцию Live Unit Testing, которая автоматически выполняет все тесты.
По окончании выполнения обозреватель тестов отображает как общие результаты, так и результаты отдельных тестов. Кроме того, в окне редактора кода выводится графическое представление для результатов тестов и объема протестированного кода. Как показано на следующей иллюстрации, все три теста прошли успешно. Кроме того, видно, что наши тесты охватили все ветви кода в методе StartsWithUpper и все эти тесты были выполнены успешно (на что указывает зеленая галочка "✓"). Наконец, показано, что ни один из других методов в StringLibrary не имеет объем протестированного кода (на что указывает синяя линия "➖").
По окончании выполнения Live Unit Testing отображает как общие результаты, так и результаты отдельных тестов. Кроме того, в окне редактора кода выводится графическое представление для результатов тестов и объема протестированного кода. Как показано на следующей иллюстрации, все три теста прошли успешно. Кроме того, видно, что наши тесты охватили все ветви кода в методе StartsWithUpper и все эти тесты были выполнены успешно (на что указывает зеленая галочка "✓"). Наконец, показано, что ни один из других методов в StringLibrary не имеет объем протестированного кода (на что указывает синяя линия "➖").
Вы также можете получить более подробные сведения о покрытии и результатах тестов, щелкнув отдельный значок объема протестированного кода в окне редактора кода. Чтобы изучить эту информацию, сделайте следующее:
Щелкните зеленую галочку в строке, где if (String.IsNullOrWhiteSpace(s)) считывается в методе StartsWithUpper . Как показано на следующей иллюстрации, Live Unit Testing указывает, что эту строку кода охватили три теста и все они были выполнены успешно.
Щелкните зеленую галочку в строке, где return Char.IsUpper(s[0]) считывается в методе StartsWithUpper . Как показано на следующей иллюстрации, Live Unit Testing указывает, что эту строку кода охватили только два теста и все они были выполнены успешно.
Основной поднятый Live Unit Testing вопрос — это неполный объем протестированного кода. Ему и посвящен следующий раздел.
Увеличение объема протестированного кода
В этом разделе вы расширите область действия модульных тестов, чтобы они захватывали метод StartsWithLower . При этом Live Unit Testing продолжит динамически тестировать ваш код.
Чтобы увеличить объем протестированного кода, захватив метод StartsWithLower , сделайте следующее:
Добавьте следующие методы TestStartsWithLower и TestDoesNotStartWithLower в файл исходного кода теста проекта:
Измените метод DirectCallWithNullOrEmpty , добавив следующий код сразу после вызова метода Microsoft.VisualStudio.TestTools.UnitTesting.Assert.IsFalse .
Live Unit Testing автоматически выполняет новые и измененные тесты, когда вы изменяете исходный код. Как показано на следующей иллюстрации, все тесты, включая два добавленных и один измененный, были выполнены успешно.
Перейдите в окно, содержащее исходный код для класса StringLibrary. Live Unit Testing показывает, что объем протестированного кода расширен и распространяется на метод StartsWithLower .
В некоторых случаях успешные тесты в обозревателе тестов могут быть выделены серым. Это означает, что тест выполняется прямо сейчас либо не запускался повторно из-за отсутствия изменений в коде, которые повлияли бы на тест, со времени последнего его выполнения.
Пока что все наши тесты прошли успешно. В следующем разделе мы рассмотрим, что делать в случае сбоя теста.
Обработка сбоя при тесте
В этом разделе вы узнаете, как использовать Live Unit Testing для идентификации, диагностики и устранения сбоев тестов. Для этого вы расширите объем протестированного кода, захватив метод HasEmbeddedSpaces .
Добавьте следующий метод в файл теста:
При выполнении теста Live Unit Testing указывает, что произошел сбой метода TestHasEmbeddedSpaces , как показано на следующей иллюстрации:
Выберите окно, где отображается код библиотеки. Для Live Unit Testing был расширен объем протестированного кода с захватом метода HasEmbeddedSpaces . Эта функция также сообщает о сбое теста, добавляя красные значки "🞩" для строк, охваченных непройденными тестами.
Наведите указатель мыши на строку с сигнатурой метода HasEmbeddedSpaces . Live Unit Testing отображает подсказку, сообщающую, что метод охвачен одним тестом, как показано на следующей иллюстрации:
Выберите непройденный тест TestHasEmbeddedSpaces. Live Unit Testing предлагает вам ряд возможностей, в том числе выполнение всех тестов и отладку всех тестов, как показано на этой иллюстрации:
Выберите Отладить все, чтобы отладить непройденный тест.
Visual Studio выполняет тест в режиме отладки.
В тесте каждая строка массива назначается переменной с именем phrase , которая передается в метод HasEmbeddedSpaces . Когда выражение утверждения в первый раз принимает значение false , выполнение программы приостанавливается и вызывается отладчик. Диалоговое окно исключения, полученное в результате непредвиденного значения в вызове метода Microsoft.VisualStudio.TestTools.UnitTesting.Assert.IsTrue , показано на следующей иллюстрации.
Кроме того, для диагностики непройденного теста мы можем использовать все предоставляемые Visual Studio средства отладки, как показано на следующей иллюстрации:
Обратите внимание, что в окне Видимые переменная phrase имеет значение "Name\tDescription", что соответствует второму элементу массива. Метод теста ожидает, что HasEmbeddedSpaces возвращает true при передаче данной строки; вместо этого он возвращает false . Очевидно, он не распознает символ табуляции "\t" как внедренный пробел.
Выберите Отладка > Продолжить нажмите клавишу F5 или кнопку Продолжить на панели инструментов, чтобы продолжить выполнение программы тестирования. Так как возникло необработанное исключение, тест был завершен. Это дает достаточно сведений для предварительного исследования ошибки. Либо подпрограмма тестирования TestHasEmbeddedSpaces сделала неверное допущение, либо HasEmbeddedSpaces неправильно распознает все внедренные пробелы.
Чтобы выявить и устранить проблему, начните с метода StringLibrary.HasEmbeddedSpaces . Посмотрите на сравнение в методе HasEmbeddedSpaces . В нем внедренный пробел считается равным U+0020. Однако в стандарте Юникод есть ряд других пробелов. Это дает основания полагать, что код библиотеки был неправильно протестирован на пробелы.
Live Unit Testing автоматически перезапускает метод непройденного теста.
Live Unit Testing отображает обновленные результаты, в том числе в окне редактора кода.
Поэтому возникает необходимость как-то это тестирование автоматизировать, хотя бы частично. Автоматизация такого процесса заключается в том, что приходится помимо программы, которая решает бизнес-задачу, писать ещё программу для тестирования.
Для чего это всё нужно? Представим ситуацию: вы написали сложную программу, которая содержит множество классов. Вы всё проверили о оттестировали. Возникла необходимость внести изменения в какой-то класс. После таких изменений может возникнуть ситуация, что программа вдруг перестаёт работать корректно на каком-то шаге (при добавлении нового функционала перестаёт работать старый). В данном случае, если у вас есть тестовые методы, можно их запустить и проверить работоспособность. Таким образом тестирование предотвращает появление данных проблем и позволяет быстро проверить работоспособность.
В состав Visual Studio входит модульное тестирование.
Такое тестирование отдельных частей программы, называется unit-тестированием (модульное тестирование) .
Задача состоит в том, чтобы написать дополнительный класс с методами, который будет тестировать наши основные классы.
Как создать модули-тестирования?
Добавим новый проект в наш "Solution". Воспользуемся мастером, который входит в состав "Visual Studio". Шаблон проекта: "Unit Test Project" (Проект модульного теста). Имя проекта укажем "MyTest":
Отличие от обычно класса заключается в том, что здесь присутствуют атрибуты "TestClass" и "TestMethod":
Атрибут — это некий ярлык, который можно навесить на класс, на метод, на поле, на свойство. Атрибут представляет из себя класс. Если существует атрибут "TestClass", то существует класс "TestClassAttribute".
Эти 2 атрибута навешены для того, чтобы компонент NUnit (компонент Visual Studio) , когда мы захотим запустить тесты, понял где эти тесты находятся.
В этом тестовом проекте необходимо добавить ссылку ("Add reference") на основной проект, также добавить ссылку на основной проект, используя using.
Что является пройденным и непройденным тестированием?
Если метод нормально закончил работу, значит тест считается пройденным. Если было выброшено любое исключение, то тест считается непройденным. Исключения можно выбрасывать самим. Также можно использовать методы класса "Assert".Например, у данного класса есть метод "AreEqual()". Он сравнивает то, что ожидаем получить с тем, что получилось по факту.
Тесты запускаются через "Run — All Tests" (Ctrl + R).
Также есть атрибут "TestInitialize" и "TestCleanup", который навешивается на метод. Методы, помеченные данными атрибутами будут вызываться один раз.
"TestInitialize" вызывается перед тестированием, "TestCleanup" — после тестирования.
Обычно эти атрибуты используются при сложном тестировании. Для чего они могут быть нужны? Допустим перед началом тестирования вам нужно поместить какие-то тестовые данные в базу данных, либо какой-нибудь файл. После окончания тестирования то содержимое, которое мы добавили для этой базы или файла, нужно удалить.
Давайте напишем простой пример.
Напишем класс "Room"
Класс для тестирования:
Если мы теперь запустим тестирование, то выйдет ошибка тестирования (на скриншоте):
В данной статье вы немного узнали про модульное тестирование в Visual Studio, а также как его запускать.
Пусть вас не вводит в заблуждение простота данного примера, на самом деле код для тестирования занимает гораздо больше строк. Его количество зависит от того функционала, который вы хотите протестировать.
На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.
Читайте также: