Archivo de la categoria 'Testing'

Como obtener el testId generado por Visual Studio en un archivo .loadtest

English Version

Durante estos días hemos estado trabajando en Southworks haciendo una herramienta para automatizar la ejecucion de load tests.

El objetivo era parsear el archivo .loadtest, basandonos en un template, que estaba configurado para un escenario en particular con un set de counters. Una vez parseado este template ya estamos listos para agregar el nodo TestMix y un nodo TestProfile por cada test que deseamos ejecutar, los cuales se encuentran definidos en el assembly del loadtest.

El obstáculo

En el momento de crear el nodo TestProfile, nos dimos cuenta que cada unit test tenía un id especifico (representado por un identificador único a.k.a. Guid). Lo que no sabíamos hasta ejecutar el load test, era que éste identificador era generado dinámicamente por Visual Studio.

Intentamos descubrir de qué forma estos identificadores se generaban usando reflector con varios assemblies de Visual Studio pero no tuvimos suerte.

Una posible solución

Buscando en internet, después de un buen rato, encontré este post, en el que el autor mostraba de qué forma se podía calcular este id:

private static Guid GetGuidFromString(string value) { SHA1CryptoServiceProvider provider = new SHA1CryptoServiceProvider(); byte[] buffer1 = provider.ComputeHash(Encoding.Unicode.GetBytes(value)); byte[] buffer2 = new byte[0x10]; Array.Copy(buffer1, buffer2, 0x10); return new Guid(buffer2); }

Con esta función ya podemos recorrer todo el assembly en busca de los métodos de tipo test y asignarles el id correcto, como muestro a continuación:

private static IList<TestEntry> GetUnitTests() { IList<TestEntry> unitTests = new List<TestEntry>(); Assembly assembly = Assembly.LoadFrom("Tests\\PerformanceTests.dll"); Type[] assemblyTypes = assembly.GetTypes(); foreach (Type type in assemblyTypes) { if (type.IsClass && type.GetCustomAttributes(typeof(TestClassAttribute), false).Length > 0) { MethodInfo[] info = type.GetMethods(); foreach (MethodInfo m in info) { if (m.GetCustomAttributes(typeof(TestMethodAttribute), false).Length > 0) { Guid testGuid = GetGUIDFromString(type.FullName + "." + m.Name); unitTests.Add(new TestEntry(testGuid, m.Name)); } } } } return unitTests; }

Espero que este post les sea de utilidad.