Из этой статьи вы узнаете, как с помощью платформы Visual Studio Unit Testing Framework можно тестировать приложения Windows Phone 8 (и более поздних версий).
Введение
При модульном тестировании приложение разделяется на несколько независимых дискретных модулей, которые далее сравниваются с ожидаемыми значениями образца данных. Такой подход к тестированию позволяет выявить ошибки, возникающие во время технического обслуживания («регрессивные тесты»), поскольку эти тесты можно запускать автоматически после каждого изменения кода. Их выполнение будет прекращено, если внутренние изменения повлияли на поведение приложения на уровне интерфейса. Модульные тесты обычно малоэффективны, если объектом проверки является пользовательский интерфейс приложения, они в основном используются для проверки бизнес-логики.
В состав пакета Visual Studio 2012 Update 2 входит платформа Visual Studio Unit Testing Framework, которая позволяет тестировать приложения для Windows Phone 8 и более поздних версий. В процессе тестирования автоматически создается тестовое приложение для Windows Phone, которое затем устанавливается без какого-либо взаимодействия с пользователем.
Из этой статьи вы узнаете, как с помощью платформы Visual Studio Unit Testing Framework протестировать приложения для Windows Phone 8.
Примечание. Кроме того, платформу Windows Phone Toolkit Test Framework можно использовать для тестирования приложений Windows Phone 7 и Windows Phone 8 (см. статью «Как создать модульный тест для приложений Windows Phone»). Платформа Visual Studio Unit Testing Framework обладает рядом преимуществ: так, она не требует установки дополнительных инструментов или ссылки на них. Кроме того, разработчики приложений для настольных систем, решившие заняться программированием для Windows Phone, могут использовать хорошо знакомую им платформу.
Создание проекта модульного теста
В этой статье рассказывается о тестировании примера кода из статьи Collection of Value converters for Windows Phone apps («Коллекция конвертеров величин для приложений Windows Phone»). Поскольку это проект приложения для Windows Phone 7, а платформа поддерживает только Windows Phone 8, сначала следует обновить проект. Для этого выберите пункт Upgrade to Windows Phone 8 (Обновить до Windows Phone 8) в контекстном меню проекта в окне Solution View (Представление решения).
Пример решения для конвертера величин. Обновление до Windows Phone 8.
Далее мы создадим проект для модульного теста Windows Phone на основе шаблона Windows Phone Unit Test App.
Примечание. Шаблон находится в разделе Windows Phone, а не в разделе Test (Тест).
Увеличить
Диалоговое окно New Project (Новый проект) для создания проекта теста.
После создания проекта теста добавьте ссылку на тестируемое приложение Windows Phone 8.
Увеличить
Добавление ссылок.
На данный момент у нас имеется проект теста со ссылкой на проект или приложение, подлежащее тестированию. Проект теста содержит класс UnitTest1, включающий функцию TestMethod1. Далее мы рассмотрим тестовый класс.
Создание тестового класса
Проект модульного теста может содержать несколько тестовых классов, включающих, в свою очередь, несколько тестовых функций. Каждая функция может содержать свыше одного теста или одного утверждения. Пустой тестовый класс выглядит следующим образом:
using System;
using Microsoft.VisualStudio.TestPlatform.UnitTestFramework;
namespace TestApp1
{
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
}
}
}
Мы будем тестировать конвертер BooleanToVisibilityConverter. Он должен вернуть Visibility.Visible при входном значении true и Visibility.Collapsed при входном значении false. Мы проверяем оба случая, а также случай ввода неверного значения для методов Convert()и ConvertBack():
[TestMethod]
public void TestMethod1()
{
var conv = new BooleanToVisibilityConverter();
Assert.AreEqual(Visibility.Visible, conv.Convert(true, typeof(Visibility), null, null));
Assert.AreEqual(Visibility.Collapsed, conv.Convert(false, typeof(Visibility), null, null));
Assert.AreEqual(Visibility.Collapsed, conv.Convert(null, typeof(Visibility), null, null));
Assert.IsTrue((bool)conv.ConvertBack(Visibility.Visible, typeof(bool), null, null));
Assert.IsFalse((bool)conv.ConvertBack(Visibility.Collapsed, typeof(bool), null, null));
Assert.IsFalse((bool)conv.ConvertBack(1234, typeof(bool), null, null));
}
У класса Assert есть несколько функций-членов, которые можно использовать для проверки результата тестирования. Чаще остальных применяются функции Assert.AreEqual иAssert.IsTrue.
После создания тестовой функции мы выполним построение проекта, и тест появится в окне Test Explorer (Обозреватель тестов).
Окно Test Explorer (Обозреватель тестов)
Окно Test Explorer (Обозреватель тестов) — основная панель для работы с тестами. Здесь представлены все тесты, которые можно сгруппировать по различным критериям (имя или класс), а также признаку выполнения и успешности. Здесь можно запустить тест и увидеть результат.
Test Explorer (Обозреватель тестов).
В контекстном меню показаны доступные команды.
Контекстное меню Test Explorer (Обозревателя тестов).
Теперь можно запустить тест, нажав Run all (Запустить все) в главном меню Run Selected Tests (Запустить выбранные тесты) или контекстном меню.
Совет. Проверьте настройки проекта для телефона или эмулятора. Для устройства необходимо явным образом указать AMD, а для эмулятора — x86. Тесты с неверными настройками неработоспособны.
Запуск тестов
После запуска тестовой функции тестовый проект будет развернут на телефоне или в эмуляторе. Тестовое приложение имеет максимально простой интерфейс:
В тестовом приложении не нужно ничего делать, оно закроется автоматически после окончания тестирования. Результаты тестирования появятся в окне Test Explorer (Обозреватель тестов).
Совет. Не забудьте разблокировать экран устройства перед началом тестирования. Сообщение об ошибке не появится.
В случае успешного завершения будет показано только время выполнения. При возникновении ошибки будет выведен текст с описанием причины или исключения.
Давайте создадим заведомо ошибочное утверждение и посмотрим на результат:
public void TestMethod1()
{
var conv = new BooleanToVisibilityConverter();
Assert.AreEqual(Visibility.Visible, conv.Convert(true, typeof(Visibility), null, null));
Assert.AreEqual(Visibility.Collapsed, conv.Convert(false, typeof(Visibility), null, null));
Assert.AreEqual(Visibility.Collapsed, conv.Convert(null, typeof(Visibility), null, null));
Assert.IsTrue((bool)conv.ConvertBack(Visibility.Visible, typeof(bool), null, null));
Assert.IsFalse((bool)conv.ConvertBack(Visibility.Collapsed, typeof(bool), null, null));
Assert.IsFalse((bool)conv.ConvertBack(1234, typeof(bool), null, null));
Assert.Fail();
}
После компиляции и запуска окно Test Explorer (Обозреватель тестов) будет выглядеть следующим образом:
Окно Test Explorer (Обозревателя тестов) с «неудачным» тестом.
Если сообщения об ошибке и трассировки стека недостаточно, можно запустить отладку теста. Создайте точку останова в тестовой процедуре и выберите Debug Selected Tests (Отладка выбранных тестов) в контекстном меню.
Покрытие кода
Предупреждение. На момент подготовки этого документа функции покрытия кода VS не работали для Windows Phone, и на экране появлялось следующее сообщение: Code coverage is not available for Windows Store or Windows Phone apps («Покрытие кода недоступно для приложений для Магазина Windows или устройств на базе Windows Phone»). Отдайте свой голос за решение этой проблемы на странице UserVoice!
Инструменты оценки покрытия кода помогут выяснить, какие части кода подвергаются проверке при модульном тестировании, и предоставят количественную оценку объема проверяемого кода. Как правило, достаточно проверить 80 % (чем больше, тем лучше), но обычно даже такого покрытия добиться очень трудно.
Чтобы оценить покрытие кода, в текст программы в процессе компиляции вставляются специальные контрольные вызовы. Тесты компилируются и выполняются, при этом каждая проверенная строка получает специальную метку. Выделить проверенные строки цветом можно с помощью кнопки в окне с результатами оценки покрытия кода.
Заключение
Платформа Unit Testing Framework для Windows Phone 8 — полезное дополнение для Visual Studio, которое очень просто интегрировать и использовать. В настоящее время в версии для Windows Phone отсутствует возможность оценки покрытия кода, в отличие от версии для разработчиков приложений для ПК.