Pregunta

Estoy tratando de cargar el servicio web.

Tengo un método simple que lleva 2 parames que se envían al servicio web y devuelven la respuesta, y creé una prueba de unidad de este método.

Debido a que quiero necesidad para probar varias entradas diferentes para probar efectivamente el servicio, configuro un CSV con ~ 1000 filas como un DataSource para la prueba de la unidad.

Puedo ejecutar esta prueba de una unidad y girará a través de todas las filas, llamando secuencialmente el servicio web con diferentes valores.

Sin embargo , esto no es lo que necesito. I necesidad cada fila para corresponder a un usuario diferente en un hilo diferente, usando la configuración de prueba de carga para incluir tiempos de pensamiento, aumentar los usuarios con la carga de paso, la configuración de la mezcla de prueba, etc.

Puedo lograrlo eliminando mi fuente de datos de la prueba de la unidad y los valores de codificación de duros. Pero esta es una prueba fundamentalmente defectuosa: para Realmente Pruebe el servicio web, necesito que cada usuario esté enviando diferentes valores y obteniendo resultados diferentes.

...

Entonces, ¿cómo puedo enganchar una fuente de datos a una prueba de carga y tener esa prueba de carga iniciar la instancia de cada usuario de una prueba de unidad con diferentes valores?

¿Fue útil?

Solución

Terminé usando esta respuesta como una guía: https://stackoverflow.com/a/7813465/237723

En lugar de crear una prueba de unidad del método de la aplicación de la consola y la prueba de carga que Prueba de la unidad, creé un simple formulario web ASP.NET que tomó las entradas y se llamó el servicio web.

Recordé una prueba de rendimiento web con este nuevo formulario y creó una prueba de carga para ejecutar ese WPTest.


  1. Después de grabar la prueba, agregué el CSV como un DataSource a esta prueba.

  2. Hubo 2 'solicitudes' registradas: la publicación inicial y posterior. ¡Asegúrese de que los dejes a ambos ! Quité la solicitud FAVICON.ICO porque no existía. (estas precauciones pueden ser evitables)

  3. Al expandir la solicitud de publicación, modificé las propiedades de los parámetros de los cuadros de texto que correspondían a mis 2 entradas de servicio web para obtener sus valores de la columna apropiada en el CSV.

  4. Cambié el método de acceso de DataSource para 'no mover el cursor automáticamente' (debe expandir la fuente de datos a la tabla y editar sus propiedades a través de clic derecho / F4).

  5. He creado luego el webTestPlugin (de la respuesta vinculada) que mueve manualmente el cursor de acuerdo con el usuario (un INT) que se ejecuta. Esto corresponderá a la instancia de usuario, la prueba de carga se rala de acuerdo con el plan de paso. Después de crear esta clase, construir el proyecto y luego agregarlo a su prueba de rendimiento web.


  6. public class webtestplugin : WebTestPlugin
    {
        public override void PreWebTest(object sender, PreWebTestEventArgs e)
        {
            base.PreWebTest(sender, e);
            e.WebTest.MoveDataTableCursor("DataSource1", "addresses#csv", e.WebTest.Context.WebTestUserId);                        
        }
    }
    

Otros consejos

Solo para responder a su pregunta, estoy bastante seguro de que esto no se puede hacer fuera de la caja de Mstest y Nunit ( Este enfoque no se mantendrá en este escenario).


Pero, imho, simplemente no vayas allí ... Desde mi experiencia, simulando ~ 1000 usuarios de una sola máquina producirá los resultados , porque la prueba se encontrará con todo tipo de clientes Límites: temas de hilo de la piscina, problemas de tráfico salientes e entrantes, etc. No estoy diciendo que esto no se pueda superar, pero está lo suficientemente torcido como para considerar un enfoque diferente.

En realidad, no recomiendo usar las herramientas de prueba de carga (hay muchas de ellas por allí) en este caso, ya que es lo suficientemente simple como para escribir un poco de su propio herramienta y omitir los problemas de configuración y las curvas de aprendizaje de un 3er fiesta.

Lo que hago recomiendo, es escribir una herramienta propia y ejecutarla de máquinas separadas. No tiene que ser administrado por un marco de prueba (no puedo llamarlo una prueba de unidad, porque no lo es), una aplicación de consola hará el truco. Aquí hay algún código para comenzar:

private ConcurrentBag<string> logs = new ConcurrentBag<string>();

public void GetLoad(int numberOfUsers, List<string> myParams)
{
    var users = new string[numberOfUsers];
    for (int i = 0; i < numberOfUsers; i++)
    {
        users[i] = string.Format("LoadTest{0}", i + 1);
    }

    var userThreads = new List<Thread>();
    for (int i = 0; i < numberOfUsers; i++)
    {
        int index = i;
        userThreads.Add(new Thread(()=> CallWebService(users[index], myParams[index])));
    }

    Parallel.ForEach(userThreads, thread=>thread.Start());
    foreach (var userThread in userThreads)
    {
        userThread.Join();
    }
    var outputFilename = string.Format("LoadTest.{0}Users.txt", numberOfUsers);
    File.AppendAllLines(outputFilename, logs);
}

La imagen muestra la muestra dónde realizar la modificación.

 ingrese la descripción de la imagen aquí

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top