Как распараллелить управляемый данными модульный тест в Visual Studio 2010? - PullRequest
15 голосов
/ 28 октября 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 и пропускает тысячи записей через Тот же тест.

[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);
}

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

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

Ответы [ 5 ]

0 голосов
/ 04 июля 2019

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

0 голосов
/ 11 сентября 2018

Если в xml нет данных, изменяемых (или методы не изменяют одни и те же части xml), вы можете сделать это.вставить, вид псевдокода.Не совсем Parallel, но, по крайней мере, будет бегать в то же время!

0 голосов
/ 28 июля 2017

Чтобы распараллелить этот модульный тест, вам понадобятся 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);
});
0 голосов
/ 08 декабря 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. Сгенерируйте индивидуальный тест для каждого из вновь сгенерированных csvs.

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

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

0 голосов
/ 14 августа 2013

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

...