Для проекта я запрограммировал библиотеку сервиса wcf. Он может быть размещен в IIS и в самообслуживании.
Для всех внешних систем, которые подключены, я предоставил Mock-реализации, которые дают некоторые общие данные, поэтому такая служба (библиотека) продолжает работать и работать. Это классический автомат/машина конечного состояния.
Во время начальной загрузки все источники данных подключены. В режиме тестирования подключены макетные реализации. Поэтому, когда я запускаю тесты, служебная библиотека "запускается" из самообслуживаемой службы, а не IIS, а конечный автомат продолжает работать и обрабатывать пакеты данных.
Есть ли способ получить какое-то "тестовое покрытие" от такого запуска.
Я был бы очень признателен, если бы я мог определить, какие кодовые пути попадают в данные примера, которые я предоставляю от макетных объектов. А затем предоставить больше тестовых данных, чтобы получить более высокий охват.
Если бы я мог сделать это без необходимости предоставления "большого количества" тестового кода, было бы здорово. Я думаю, что многие случаи уже покрыты данными, полученными от макетов. Но сейчас у меня нет отправной точки для этого.
Вот несколько примеров кода, чтобы дать более четкое представление о том, что имеется в виду. Конечно, код сильно упрощается.
В очень простом консольном приложении для запуска службы (самообслуживаемая версия)
static void Main(string[] args)
{
using (var host = new ServiceHost(typeof(MyServiceLib.Service.MyServiceLib)))
{
host.Open();
Console.ReadLine();
host.Close();
}
}
В библиотеке сервисов из этого кода вызывается конструктор
public MyServiceLib()
{
Task.Factory.StartNew(this.Scaffold);
}
Это не что иное, как запуск конечного автомата
private void Scaffold()
{
// lots of code deleted for simplicity reasons
var dataSource = new MockDataSource();
// inject the mocked datasource
this.dataManager = new DataManager(dataSource);
// this runs in its own thread. There are parts that are started on a timer event.
this.dataManager.Start();
}
public class DataManager : IDataManager
{
public void Start()
{
while (this.IsRunning)
{
var data = this.dataSource.getNext();
if (data != null)
{
// do some work with the data retrieved
// lots of code paths will be hit from that
this.Process(data);
}
else
{
Thread.Sleep(1000);
}
}
}
public void Process(IData data)
{
switch (data.PackageType)
{
case EnumPackageType.Single:
{
ProcessSingle(data);
break;
}
case EnumPackageType.Multiple:
{
ProcessMultiple(data);
break;
}
// here are lots of cases
default:
{
Logger.Error("unknown package type");
break;
}
}
}
}
То, что я пробовал до сих пор:
- OpenCover
со специальной тестовой dll, которая создала бы Host, как показано выше, но хост не может быть создан должным образом, поэтому тестирование не запускается на самом деле. Я получаю сообщение об ошибке "Хост в состоянии сбоя". Я выполнил этот мини-учебник. Несмотря на это, я получаю отчет о покрытии с расчетным охватом около 20%. Но сервис только начинается, он пока не работает.
- Инструменты производительности Visual Studio
Этапы, по существу, описаны в этой статье. Я получаю файл myproject.coverage, но я не могу его просмотреть, потому что у меня только VS Professional, охват, по-видимому, используется только в версиях Test Premium или Ultimate.
Кроме того, попробовав эти два, я приму любой ответ, показывающий, как его запустить и запустить с любым из них (предпочитаемый OpenCover).
Принять ответ, который показывает, как проверить эту настройку и получить покрытие кода при использовании инструментов для генерации большей части кода (как pex, но после пробного просмотра я вижу, что он не генерирует очень хороший код).