Unit тестирование в Silverlight 4

    • Silverlight
    • Test
    • Mock
    • Silverlight 4
    • CCNet
    • Continuous Integration
    • ReSharper
    • Moq
    • StatLight
    • AgUnit
  • modified:
  • reading: 4 minutes

Наша команда настроила свою среду для тестирования Silverlight приложений еще год назад для Silverlight 3. Потом, со временем, просто обновляли библиотеки и приложения. Я бы хотел с вами поделиться теми удобными утилитами, которыми мы пользуемся для тестирования кода Silverlight приложений, как для запуска на локальном компьютере, так и для автоматизированного запуска на интеграционном сервере. Я буду говорить именно о Unit тестировании (блочном тестировании), а не о UI тестировании (тестирование интерфейсов). В нашей компании у нас есть команда QA, которая занимается UI тестированием, мы же просто пишем тесты для кода моделей представления и моделей. Для того, чтобы настроить среду для тестирования, мне понадобились: Silverlight Toolkit, Moq, R#, AgUnit, StatLight. А теперь обо всем по порядку.

Среда для тестирования

Год назад особо выбирать было не из чего. Честно, не знаю изменилось ли что-нибудь сейчас. Я использую Silverlight Unit Test Framework. Знаю, что есть порт NUnit для Silverlight, тогда он тоже был, но был сыроват. Я бы с удовольствием бы его использовал, так как для .NET мы используем именно NUnit.

Чтобы использовать Silverlight Unit Test Framework нужно установить последний Silverlight Toolkit. После установки у вас появится возможность создавать проекты Silverlight Unit Test Application:

new_project

На самом деле, не обязательно устанавливать сам Silverlight Toolkit – можно сделать и по другому. Скачать архив Silverlight 4 Toolkit April 2010.zip с http://silverlight.codeplex.com (либо другой последний архив). Там будет папка Testing с двумя библиотеками, которые нам нужны. Нужно просто создать проект типа Silverlight Application, удалить оттуда все, кроме файлов App. Добавить в References обе библиотеки из папки Testing (я их так же кладу в репозиторий). И в методе Application_Startup класса App поменять код на:

private void Application_Startup(object sender, StartupEventArgs e)
{
    RootVisual = UnitTestSystem.CreateTestPage();
}

Теперь у нас есть библиотека, в которую мы будем класть наши Unit тесты.

Если вы создали проект из шаблона, поставляемого с Silverlight Toolkit, то у вас уже будет один файл с тестами:

using Microsoft.VisualStudio.TestTools.UnitTesting;
 namespace SilverlightUnitTesting.Tests
{
    [TestClass]    public class Tests
    {
        [TestMethod]        public void TestMethod1()
        {
        }
    }
}

Чего мне хотелось бы дальше, так это пользоваться Unit Test Runner, к которому я так привык, и который поставляется с ReSharper. Для этого необходимо скачать плагин для R# с сайта http://agunit.codeplex.com/. Положить его нужно в папку plugins туда, где установлен сам ReSharper, у меня это c:\Program Files (x86)\JetBrains\ReSharper\v5.1\Bin\plugins\. Последняя версия AgUnit на данный момент не работает с версией R# 5.1.3. Автор библиотеки AgUnit зачем-то жестко привязывает к номерам версий R# свои билды, я же пересобрал проект без такой жесткой привязанности, и теперь можно им пользоваться пока R# не поменяет API (а меняет он его часто), скачать можно с моего сайта. (Пока я писал этот пост, вышел AgUnit 0.3 для версии ReSharper 5.1.3.)

После установки у вас появится возможность запускать unit тесты из студии, как вы это делаете для .NET проектов:

ide

При первом запуске, скорее всего, вы увидите такое сообщение:

Failed

Дело в том, что ваша библиотека, в которой находятся тесты должна подгружать все необходимые для AgUnit библиотеки. После создания проекта мне понадобилось добавить Reference только на одну библиотеку System.Xml.Linq (еще пришлось перезагрузить проект, видимо, Test Runner подвис).

Теперь можно спокойно писать тесты, как привыкли.

Автоматизация тестов

До знакомства с AgUnit, я сначала узнал про библиотеку StatLight, при помощи которой можно запускать тесты из консоли. Здесь все очень просто: скачиваем тулзу, кладем куда хотим и запускаем все тесты в библиотеке при помощи, например, такого батника

StatLight.exe -x=".\Bin\Debug\SilverlightUnitTesting.Tests.xap"

Я стараюсь после каждого изменения тестов (или добавления тестов), перед чекином исходного кода в репозиторий, запустить локально у себя все тесты, чтобы ненароком не порушить билд. Да, на билд сервере, у нас, конечно же, запускаются тесты после каждого билда. Мы используем CCNet, для которого можно даже найти решение для отображения результатов тестов: Displayin StatLight Unit Test Results in CruiseControl.Net Web Dashboard

При использовании StatLight в CCNet нужно для CCNet win сервиса установить галочку Allow service to interact with desktop:

service

Для создания Moq и Stub объектов мы используем Moq, как для .NET, так и для Silverlight.

А какие инструменты используете вы? Есть ли сейчас более правильный подход?

See Also