Medición de tiempo de ejecución con StopWatch
StopWatch es un simple cronómetro que permite medir el tiempo de las tareas. Expone el tiempo total de ejecución y el tiempo de ejecución de cada tarea nombrada.
Documentación Oficial – StopWatch
A continuación, se exponen una serie de formas de utilizarlo con Spring-Boot:
Medición tests configurando el StopWatch en las fases ( @AferAll, … )
@SpringBootTest class StopwatchApplicationTests { static StopWatch stopWatch = new StopWatch(); @BeforeAll static void setUp() { stopWatch = new StopWatch(); } @BeforeEach void timeSetUp(TestInfo testInfo) { stopWatch.start( testInfo.getTestMethod().get().getName()); } @AfterAll static void setDown() { System.out.print( stopWatch.prettyPrint() ); } @AfterEach void timeSetDown() { stopWatch.stop(); } @Test void test_one() throws InterruptedException { Thread.sleep(2000); } ... }
Resultado obtenido
StopWatch '': running time = 6011364520 ns --------------------------------------------- ns % Task name --------------------------------------------- 2008182259 033 % test_one 2001327545 033 % test_two 2001854716 033 % test_three
Medición de los test utilizando un TestExecutionListener
Es necesario crear un listener que extienda de AbstractTestExecutionListener, el cuál nos permitirá sobreescribir los métodos beforeTestClass, afterTestClass, afterTestMethod,…
public class ExecutionTimeTestListener extends AbstractTestExecutionListener { private StopWatch stopWatch; @Override public void beforeTestClass(TestContext testContext) throws Exception { super.beforeTestClass(testContext); stopWatch = new StopWatch(testContext.getTestClass().getSimpleName()); } @Override public void beforeTestMethod(TestContext testContext) throws Exception { super.beforeTestMethod(testContext); stopWatch.start(testContext.getTestMethod().getName()); } @Override public void afterTestMethod(TestContext testContext) throws Exception { if (stopWatch.isRunning()) { stopWatch.stop(); } super.afterTestMethod(testContext); } @Override public void afterTestClass(TestContext testContext) throws Exception { System.out.println(stopWatch.prettyPrint()); super.afterTestClass(testContext); } }
Forma de utilización:
@ExtendWith(SpringExtension.class) @TestExecutionListeners({DependencyInjectionTestExecutionListener.class, ExecutionTimeTestListener.class}) class StopwatchWithListenerApplicationTest { @Test void test_one() throws InterruptedException { Thread.sleep(2000); } ... }
Resultado obtenido
StopWatch 'StopwatchWithListenerApplicationTest': running time = 6017421650 ns --------------------------------------------- ns % Task name --------------------------------------------- 2013933526 033 % test_one 2001191940 033 % test_two 2002296184 033 % test_three
Configuración utilizando Aspectj
Se crea un aspecto para que capture todas las ejecuciones del paquete service. Ademas se le pone el @Around para que envuelva el método que captura. Así podemos poner el StopWatch para que medir el tiempo que tarda en ejecutarlo.
Requiere añadir la dependencia spring-boot-starter-aop.
org.springframework.boot spring-boot-starter-aop
@Aspect @Component public class StopWatchAOP { @Around("execution(* es.com.disastercode.examplesspringboot.stopwatch.service.*.*(..))") public Object measureMethod(ProceedingJoinPoint pjp) throws Throwable { StopWatch sw = new StopWatch(); Object retVal; try { sw.start(pjp.getTarget()+"."+pjp.getSignature()); retVal = pjp.proceed(); } catch (Throwable e) { throw e; } finally { sw.stop(); System.out.println(sw.prettyPrint()); } return retVal; } }
Ejemplo de test.
@SpringBootTest class StopwatchWithAopApplicationTests { @Autowired private ProductService productService; @Test void test_one() throws InterruptedException { assertEquals("name 2", this.productService.findNameProductById(2)); } }
Resultado obtenido
StopWatch '': running time = 2050920963 ns --------------------------------------------- ns % Task name --------------------------------------------- 2050920963 100 % es.com.disastercode.examplesspringboot.stopwatch.service.ProductServiceImpl@3d20e575.String es.com.disastercode.examplesspringboot.stopwatch.service.ProductServiceImpl.findNameProductById(Integer)
Categorias
- adobe (2)
- agile (1)
- Alfresco (1)
- Android (26)
- Angular (6)
- angularjs (10)
- apache (1)
- axis (2)
- Bases de datos (14)
- Bootstrap (1)
- C# (3)
- Cámara (1)
- chrome (3)
- Codeigniter (2)
- Control de Versiones (2)
- CSS (25)
- CVS (1)
- Django (9)
- Django Rest Framework (1)
- DNS (1)
- Docker (3)
- dominio (1)
- eclipse (5)
- Entity Framework (2)
- ETL (1)
- Firefox (6)
- flash (1)
- freecad (1)
- Git (12)
- GitHub (4)
- gpg (2)
- Groovy (1)
- Handlebars (1)
- hibernate (4)
- hosting (1)
- HTML (50)
- HTML 5 (26)
- Impresión 3D (9)
- Inkscape (1)
- IOS (2)
- ireports (3)
- Java (44)
- Javascript (55)
- JBoss (5)
- JPA (2)
- JQuery (20)
- Json (7)
- JSP (6)
- Keycloak (1)
- Lamp (1)
- LDAP (2)
- lean (1)
- linkedin (1)
- LINQ (1)
- linux (13)
- Livecycle (1)
- log (1)
- microcontroladores (1)
- MongoDB (4)
- MySQL (8)
- Node.js (5)
- OC4J (1)
- Openshift (2)
- Oracle (6)
- Patrones de Diseño (1)
- Photoshop (2)
- php (20)
- PostgreSQL (1)
- python (19)
- rabbitmq (1)
- Raspberry PI (13)
- Raspherry PI (5)
- React (6)
- seguridad (3)
- Selenium (3)
- Sencha Touch (1)
- Sin categoría (29)
- Spring (17)
- spring-boot (3)
- SQL (7)
- SQLServer (1)
- SSO (1)
- struts (2)
- SVN (1)
- Talend (1)
- Tomcat (6)
- unity (3)
- Visual Studio Code (2)
- vmware (5)
- Web Services (11)
- windows (18)
- wordpress (10)
- Xiaomi (1)
- xml (2)
Trabajos Realizados
- App Android – Autoka Fr
- App Android – Cartelera Cántabra
- App Android – Gramática y Vocabulario Ingles
- App Android – Hoja de Gastos
- App Android – Hotel Torre Cristina
- App Android – OcioEnjoy
- App Android – Visor CardBoard
- App Firefox – Managapp
- DiamanteBomba – DisasterCode
- Generador de Partes de Trabajo
- GitHub – Android Web Generator
- GitHub – Dynamic Angular Gallery
- GitHub – Dynamic React Gallery
- GitHub – Sotilizator
- GitHub – SpringAngularJS
- GitHub – Swiper Dynamic Angular Gallery
- HazParejas – DisasterCode
- RompeCabezas – DisasterCode
- Unity Game – English Couple
- Unity Game – Kill Wasp
- WordPress – El Buen Apicultor
- WordPress – El Cajón de los Retales
- WordPress – El Vestidito Azul
- WordPress – Feuchas
- WordPress – Fragua de Navajas Ponce
- WordPress – Humor a las Tres
- WordPress – Photo Places