Как распараллелить модульный тест, управляемый данными, в Visual Studio 2010?

Я знаю, что обычные модульные тесты MS-Test можно распараллелить на многоядерной машине (конечно, с оговорками), указав атрибут parallelTestCount в файле .testresults в тестовом решении. Нравится,

<Execution parallelTestCount="1">
    <TestTypeSpecific />
    <AgentRule name="Execution Agents"></AgentRule>
</Execution>

Подробнее: http://blogs.msdn.com/b/vstsqualitytools/archive/2009/12/01/executing-unit-tests-in-parallel-on-a-multi-cpu-core-machine.aspx

Тем не менее, у меня есть тест на основе данных, что-то вроде этого, это всего лишь один тест, но входные данные поступают из CSV и прогоняют тысячи записей через < strong>тот же тест.

[DeploymentItem("InputDataRows.csv"), Timeout(37800000), DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV", "|DataDirectory|\\InputDataRow.csv", "InputDataRow#csv", DataAccessMethod.Sequential)]                
[TestMethod]
public void RunProcessing()
{
    int userId = Convert.ToInt32(TestContext.DataRow[0].ToString());
    int connId = Convert.ToInt32(TestContext.DataRow[1].ToString());
    string xml = TestHelper.GetDataFromDb(userId, connId);
    a = doStuffA(xml); 
    b = doStuffB(xml);
    Assert.IsTrue(a == b);
}

Поскольку это медленный процесс, я рассматриваю возможность распараллеливания этого модульного теста.

Последовательное перечисление в атрибуте — это просто способ доступа к данным, другой вариант — Random, который по-прежнему является последовательным, а не параллельным.


person Vin    schedule 28.10.2010    source источник
comment
Какой язык вы используете? С#?   -  person Ryan Gates    schedule 31.05.2013
comment
Какую версию .Net вы используете? Кроме того, можете ли вы предоставить некоторые подробности о том, как устанавливается TestContext?   -  person Paul Tsai    schedule 03.01.2017


Ответы (5)


Чтобы распараллелить этот модульный тест, вам понадобятся doStuffA() и doStuffB(), чтобы иметь возможность работать с подмножеством данных (например, фрагментом или даже одной строкой вашего csv за раз). Если вы можете реорганизовать свои методы, чтобы они вели себя таким образом, вы можете использовать задачи или параллельный цикл foreach, чтобы этот тест выполнялся параллельно. Предположим, ваши методы были реорганизованы для обработки строки вашего csv, вы могли бы сделать что-то вроде этого:

int userId = Convert.ToInt32(TestContext.DataRow[0].ToString());
int connId = Convert.ToInt32(TestContext.DataRow[1].ToString());
string xml = TestHelper.GetDataFromDb(userId, connId);
var rows = xml.Split('\n');

Parallel.ForEach(rows, (row) =>
{
    var a = doStuffOnRowA(row);
    var b = doStuffOnRowB(row);
    Assert.AreEqual(a, b);
});
person cortez    schedule 28.07.2017

Это может показаться немного сложным, но выслушайте меня. В MSTest есть ограничение, заключающееся в том, что вы не можете запускать тесты, управляемые данными, параллельно. Что я сделал в прошлом, чтобы обойти это, так это создал «пользовательский инструмент» в Visual Studio.

https://msdn.microsoft.com/en-us/library/bb166508.aspx

OR

https://msdn.microsoft.com/en-us/library/bb166817.aspx

Пользовательский инструмент, который мы создали, делал следующее:

  1. Разделите CSV на несколько CSV-файлов, в каждом из которых будет только одна строка.
  2. Создайте отдельный тест для каждого из вновь созданных файлов csv.

Когда эти тесты были сгенерированы, мы добавили к ним определенные тестовые атрибуты, чтобы мы могли указать запускать тесты только с этим атрибутом.

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

person Michiel Bugher    schedule 07.12.2017

Если в xml нет изменений данных (или методы не изменяют одни и те же части xml), вы можете сделать..

var numCompleted = 0;
var a = Task.Run(() => { doStuffOnRowA(xml); });
var b = Task.Run(() => { doStuffOnRowB(xml); });
Task.WaitAll(new Task[2] { a, b });

Это может не запуститься, если вы скопируете и вставите псевдокод. Не совсем параллельно, но, по крайней мере, будет работать примерно в одно и то же время!

person Garett Roberts    schedule 10.09.2018
comment
Вам лучше использовать эту функцию фреймворка, когда вы ожидаете несколько задач Task.WaitAll msdn.microsoft.com/en-us/library/windows/apps/ - person David; 09.10.2018
comment
Спасибо, только что поменял! - person Garett Roberts; 09.10.2018

Параллельное выполнение тестов, управляемых данными, не поддерживается. См. здесь: RFC 004 - Параллельное выполнение в сборке

person pvlakshm    schedule 04.07.2019

Насколько я знаю: отдельные строки данных в тесте НЕ запускаются параллельно. Но если у вас есть несколько модульных тестов, они выполняются параллельно.

person Venkata Sadineni    schedule 14.08.2013