En un proyecto donde hay requisitos no funcionales que especifican el tiempo máximo de ejecución para una acción específica, el control de calidad debe verificar el rendimiento de esta acción en una máquina dedicada utilizando hardware preciso bajo carga precisa, tanto el hardware como la carga se especifican en los requisitos.
Por otro lado, algunos cambios erróneos en el código fuente pueden afectar gravemente el rendimiento. Notar este impacto negativo antes de tiempo , antes de que el código fuente alcance el control fuente y sea verificado por el departamento de control de calidad, podría ser beneficioso en términos de tiempo perdido por el departamento de control de calidad que informa el problema, y por el desarrollador que lo corrige varias confirmaciones más tarde.
Para hacer esto, es una buena idea:
Para usar las pruebas unitarias para tener una idea del tiempo empleado en ejecutar la misma acción² n veces,
¿Para usar el tiempo de espera por prueba a través del
[TestMethod, Timeout(200)]
atributo en C #?
Espero varios problemas con este enfoque:
Conceptualmente , las pruebas unitarias no son realmente para eso: se espera que prueben una pequeña parte de un código, nada más: ni la verificación de un requisito funcional, ni una prueba de integración, ni una prueba de rendimiento.
¿El tiempo de espera de las pruebas unitarias en Visual Studio mide realmente lo que se espera medir, teniendo en cuenta que la inicialización y la limpieza no existen para esas pruebas o son demasiado cortas para afectar los resultados?
Medir el rendimiento de esta manera es feo. Ejecutar un punto de referencia en cualquier máquina¹ independientemente del hardware, la carga, etc. es como hacer un punto de referencia que muestre que un producto de base de datos siempre es más rápido que otro. Por otro lado, no espero que esas pruebas unitarias sean un resultado definitivo, ni algo que utilice el departamento de control de calidad . Esas pruebas unitarias se usarán solo para dar una idea general sobre el rendimiento esperado, y esencialmente para alertar al desarrollador de que su última modificación rompió algo, afectando gravemente el rendimiento .
Test Driven Development (TDD) es imposible para esas pruebas. ¿Cómo fallaría, en primer lugar, antes de comenzar a implementar el código?
Demasiadas pruebas de rendimiento afectarán el tiempo requerido para ejecutar las pruebas, por lo que este enfoque se limita solo a acciones cortas.
Teniendo en cuenta esos problemas, todavía me parece interesante usar tales pruebas unitarias si se combina con las métricas de rendimiento real del departamento de control de calidad.
¿Me equivoco? ¿Hay otros problemas que hacen que sea totalmente inaceptable utilizar pruebas unitarias para esto?
Si me equivoco, ¿cuál es la forma correcta de alertar al desarrollador de que un cambio en el código fuente afectó gravemente el rendimiento, antes de que el código fuente llegue al control de origen y sea verificado por el departamento de control de calidad?
¹ En realidad, se espera que las pruebas unitarias se ejecuten solo en PC de desarrolladores que tengan un rendimiento de hardware comparable, lo que reduce la brecha entre las máquinas más rápidas que nunca podrán fallar la prueba de rendimiento y las máquinas más lentas que nunca lograrán pasarla.
² Por acción, me refiero a un fragmento de código bastante corto que tarda unos pocos milisegundos en ejecutarse.
fuente