- Убедитесь, что первый столбец вашей таблицы данных является уникальным идентификатором.
- Создайте делегат AsyncExecutionTask, который принимает DataRow и ничего не возвращает.
- Создание статического класса (ParallelTesting) с помощью метода AsyncExecutionContext, который принимает DataRow и делегат AsyncExecutionTask.
- В статическом классе добавьте статическое свойство BatchStarted.
- В статическом классе добавьте статическое свойство словаря AsyncExecutionTests.
В методе AsyncExecutionContext добавьте следующее:
public static void AsyncExecutionContext(DataRow currentRow, AsyncExecutionTask test)
{
if(!BatchStarted)
{
foreach(DataRow row in currentRow.Table)
{
Task testTask = new Task(()=> { test.Invoke(row); });
AsyncExecutionTests.Add(row[0].ToString(), testTask);
testTask.Start();
}
BatchStarted = true;
}
Task currentTestTask = AsyncExecutionTests[row[0].ToString()];
currentTestTask.Wait();
if(currentTestTask.Exception != null) throw currentTestTask.Exception;
}
Теперь используйте класс так:
[TestMethod]
public void TestMethod1()
{
ParallelTesting.AsyncExecutionContext(TestContext.DataRow, (row)=>
{
//Test Logic goes here.
}
);
}
Примечание: Вам нужно будет немного поработать с исключениями, чтобы заставить их правильно всплыть (здесь вы можете иметь совокупное исключение, вам понадобится первое исключение из него). Количество времени, отображаемое для выполнения каждого теста, больше не будет точным. Вы также захотите очистить класс ParallelTesting после завершения последней строки.
Как это работает: Тестовая логика заключена в лямбду и передается статическому классу, который будет выполнять логику один раз для каждой строки тестовых данных при первом вызове (первая строка выполняется). Последовательные вызовы статического класса просто ждут завершения предварительно запущенной тестовой задачи.
Таким образом, каждый вызов тестового фрейма, выполненного для TestMethod, просто собирает результаты теста соответствующего теста, который уже был выполнен.
Возможные улучшения:
- Заставить AsyncExecutionContext принять параметр maxSynchronousTasks.
- Посмотрите, как инфраструктура перемещает полные трассировки стека по неуправляемому коду, чтобы увидеть, можно ли передать Task.Exception в среду тестирования Visual Studio, не перебрасывая и не уничтожая трассировку стека.