Автоматическое тестирование кода PCL проектов в Visual Studio

Microsoft продолжает совершенствовать инструменты разработки для .NET. И вот недавно Visual Studio 2012 получила возможность автоматических тестов кода в проектах типа Portable Class Library.

По сути, это первый шаг по переносу функциональности Pex в новые версии Visual Studio. Его движок анализирует возможные пути исполнения .NET кода библиотеки с целью выявить ошибки и исключения. Результат такого исследования помогает понять поведение последнего в различных ситуациях.

Давайте посмотрим как все это выглядит на практике. Для запуска тестов необходимо установить расширение Microsoft Code Digger.

Создадим тестовый проект типа Portable Class Library с именем PortableClassLibraryTest. В качестве целевых платформ PCL возьмем .NET 4, Silverlight 4, Windows Phone 7 и .NET for Windows Store.

Код единственного класса самой библиотеки будет очень простым:

namespace PortableClassLibraryTest
{
    using System.Linq;

    public class TestClass
    {
        public string TestMethod(int index, string value, int[] numbers)
        {
            var aPos = value.IndexOf('a');
            return string.Format("{0} {1} {2} {3}", index, value, aPos, numbers.Sum());
        }
    }
}

Приступим к тестам. Для этого внутри кода метода TestMethod() откроем контекстное меню и выберем пункт "Generate Inputs / Outputs Table".

Контекстное меню Code Digger

Это приведет к запуску автоматических тестов, результат которых будет выведен в виде таблицы:

Результаты Code Digger

В ней хорошо видно, при каких значениях параметров выполнение TestMethod() закончилось ошибкой. Обратите внимание, что все они выделены жирным шрифтом и отмечены соответствующей иконкой.

Давайте исправим одну из ситуаций и добавим проверку на null последнего аргумента метода.

namespace PortableClassLibraryTest
{
    using System;
    using System.Linq;

    public class TestClass
    {
        public string TestMethod(int index, string value, int[] numbers)
        {
            if (numbers == null)
                throw new ArgumentNullException("numbers");

            var aPos = value.IndexOf('a');
            return string.Format("{0} {1} {2} {3}", index, value, aPos, numbers.Sum());
        }
    }
}

Теперь пересоберем проект и запустим тесты заново.

Результаты Code Digger

Обратите внимание, что исключения, выбрасываемые самим методом, не отмечены как ошибки. Разработчику остается проанализировать оставшиеся ситуации и внести в код соответствующие изменения.

К сожалению, текущая версия Code Digger для Visual Studio 2012 имеет ограничения:

  • предназначена только для Portable Class Libraries;
  • работает только с public методами в public классах;
  • не понимает вызовы Code Contracts в теле методов.

Будем надеяться что в дальнейшем это будет исправлено.

Добавить комментарий