2010-10-28 37 views
14

Sé que las pruebas de unidad de prueba ms regulares se pueden paralelizar en una máquina multi-core (con advertencias, por supuesto) especificando el atributo parallelTestCount en el archivo .testresults en la solución de prueba. De esta manera,¿Cómo se puede paralelizar una prueba unitaria basada en datos en Visual Studio 2010?

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

Más en: http://blogs.msdn.com/b/vstsqualitytools/archive/2009/12/01/executing-unit-tests-in-parallel-on-a-multi-cpu-core-machine.aspx

Sin embargo, tengo una prueba basada en datos, algo como esto, esto es sólo una prueba, pero la entrada viene de un csv y ejecuta 1000s de registros a través de la misma prueba.

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

Debido a que este es un proceso lento, que estoy mirando paralelización de esta unidad de prueba.

El Sequential enum en el atributo es sólo la forma en que se accede a los datos, la otra opción es aleatoria, que sigue siendo de serie y no en paralelo.

+0

¿Qué idioma estás usando? DO#? –

+0

C#, sí, por supuesto! – Vin

+0

¿Qué versión de .Net estás usando? Además, ¿puede proporcionar algunos detalles sobre cómo se está configurando TestContext? –

Respuesta

-1

Como sé: las filas de datos individuales en una prueba NO se ejecutan en paralelo. Pero si tienes múltiples pruebas unitarias, se ejecutan en paralelo.

0

Para paralelizar esta prueba unitaria, necesitará doStuffA() y doStuffB() para poder operar en un subconjunto de los datos (por ejemplo, un fragmento o incluso una sola fila de su csv a la vez). Si puede refactorizar sus métodos para comportarse de esta manera, puede utilizar tareas o un bucle Foreach paralelo para que esta prueba se ejecute en paralelo. Supongamos que sus métodos fueron refactorizan para manejar una fila de la CSV, se podría hacer algo como esto:

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

Esto puede parecer un poco complejo, pero escúchame. Existe una limitación en MSTest de que no puede ejecutar pruebas basadas en datos en paralelo. Lo que he hecho en el pasado para evitar esto es crear una "herramienta personalizada" en Visual Studio.

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

O

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

La herramienta personalizada que creamos hizo lo siguiente:

  1. Dividir el csv en varios archivos CSV con sólo una fila cada uno.
  2. Genera una prueba individual para cada una de las csvs recién generadas.

Cuando se generaron estas pruebas, les pusimos atributos de prueba específicos, por lo que podríamos especificar ejecutar solo las pruebas con ese atributo.

Esto suena un tanto exagerado, pero si haces un buen trabajo construyendo la herramienta personalizada, en realidad es un proceso muy sencillo.

Cuestiones relacionadas