{"id":1303,"date":"2014-09-15T17:26:24","date_gmt":"2014-09-15T16:26:24","guid":{"rendered":"http:\/\/qualilogy.com\/es\/?p=1303"},"modified":"2014-09-16T10:49:45","modified_gmt":"2014-09-16T09:49:45","slug":"aplicacion-legacy-refactorizacion-reingenieria-6","status":"publish","type":"post","link":"http:\/\/qualilogy.com\/es\/aplicacion-legacy-refactorizacion-reingenieria-6\/","title":{"rendered":"Aplicaci\u00f3n Legacy \u2013 \u00bfRefactorizaci\u00f3n o reingenier\u00eda? (VI)"},"content":{"rendered":"<p><a href=\"http:\/\/500px.com\/Vicken\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-2026\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/09\/Qualilogy_Legacy_TestEffort1.jpg\" alt=\"Qualilogy -Application Legacy - Effort de test\" width=\"239\" height=\"360\" \/><\/a>Hemos presentado en los dos articulos anteriores la noci\u00f3n de prueba (unitaria) de caracterizaci\u00f3n propuesta por Michael Feathers en su libro \u00ab\u00a0Working Effectively with Legacy Code\u00a0\u00bb.<\/p>\n<p>Hemos visto brevemente c\u00f3mo podemos utilizar este tipo de pruebas con el fin de adquirir los conocimientos del comportamiento de las aplicaciones. Digo brevemente porque, idealmente, tendr\u00edamos que desarrollar y presentar algunas pruebas como ejemplo, pero esta serie es ya muy larga. Mejor leer el libro de Michael Feathers.<\/p>\n<p>Estas pruebas facilitar\u00e1n la transferencia de conocimientos de nuestra aplicaci\u00f3n Legacy, y cualquier operaci\u00f3n posterior de refactorizaci\u00f3n o de reingenier\u00eda ser\u00e1 m\u00e1s r\u00e1pida y m\u00e1s segura. <!--more--><\/p>\n<h2>Cobertura de pruebas<\/h2>\n<p>\u00bfQue deber\u00eda ser el alcance de esta operaci\u00f3n de caracterizaci\u00f3n? \u00bfCu\u00e1ndo podemos considerar que nuestra cobertura de pruebas es suficiente, y empezar a hacer cambios en el c\u00f3digo? \u00bfEs posible cuantificar el esfuerzo que representa?<\/p>\n<p>Michael Feathers recomienda escribir tantas pruebas que consideramos necesario para cada bloque de c\u00f3digo que tenemos que cambiar en el futuro. \u00bfSin embargo, que sucede si no se proporciona ning\u00fan cambio de c\u00f3digo en el futuro?<\/p>\n<p>No es un caso raro: cuando una empresa compra un editor de software, es posible que no desee cambiar el producto, sino simplemente ofrecer apoyo hasta que desaparezca de muerte natural, cuando ning\u00fan m\u00e1s cliente paga el mantenimiento.<br \/>\nOtro caso: conozco departamentos de TI que han perdido casi por completo el conocimiento de grupos enteros de aplicaciones Cobol, PL1, Natural\/Adabase, Oracle Forms, etc. Estas aplicaciones son:<\/p>\n<ul>\n<li>A menudo criticas, debido a que son en el coraz\u00f3n hist\u00f3rico del sistema de informaci\u00f3n.<\/li>\n<li>Completamente probadas, sin muchos defectos.<\/li>\n<li>Evoluan poco, y m\u00e1s bien en su interfaz para conectar con nuevas aplicaciones, que en su l\u00f3gica de negocio.<\/li>\n<\/ul>\n<p>Una estrategia posible para estos CIOs es la de subcontratar el c\u00f3digo, pero cuidando bien la fase de transferencia de conocimientos, con el fin de evitar &#8216;romper&#8217; lo que ya funciona.<\/p>\n<p><a title=\"Aplicaci\u00f3n Legacy C \u2013 \u00bfRefactorizaci\u00f3n o reingenier\u00eda? (I)\" href=\"http:\/\/qualilogy.com\/es\/aplicacion-legacy-c-refactorizacion-reingenieria-1\/\" target=\"_blank\">La misi\u00f3n que se nos ha asignado<\/a> es calcular el coste de la transferencia del conocimiento de nuestra aplicaci\u00f3n Legacy a otro equipo. \u00bfC\u00f3mo podemos estimar el esfuerzo de descubrir el c\u00f3digo a trav\u00e9s de estas pruebas de caracterizaci\u00f3n? \u00bfExiste una f\u00f3rmula que eval\u00faa este esfuerzo con un plan de recursos y un calendario?<\/p>\n<h2>Complejidad y legibilidad<\/h2>\n<p>Siempre he considerado en las diversas auditor\u00edas que realizo, que la Complejidad Ciclom\u00e1tica es representativa del esfuerzo de test.<\/p>\n<p>Una aplicaci\u00f3n reciente, peque\u00f1a, no cr\u00edtica, dentro de la empresa y sin usuarios externos (intranet por ejemplo), con cerca de 6 000 puntos de CC, puede validarse con pruebas de integraci\u00f3n por el equipo de proyecto, sin pasar por una fase formalizada de control de calidad.<\/p>\n<p>Una aplicaci\u00f3n m\u00e1s antigua, abierta al exterior \u2013 por ejemplo, un front-end de otras aplicaciones y software de pedidos, facturaci\u00f3n, inventario, etc. \u2013 pues cr\u00edtica para la empresa, y con m\u00e1s de 60 000 puntos de CC: fase de control de calidad requerida por un equipo de probadores especializados, con juegos de prueba formalizados, y si es posible automatizada.<\/p>\n<p style=\"text-align: left\"><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/Word_Complexity.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-1751\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/04\/Word_Complexity.jpg\" alt=\"Word_Complexity\" width=\"348\" height=\"160\" \/><\/a><a title=\"Auditor\u00eda de una aplicaci\u00f3n Legacy en C \u2013 Microsoft Word 1.1a (I)\" href=\"http:\/\/qualilogy.com\/es\/auditoria-aplicacion-legacy-c-microsoft-word-1-1a-1\/\" target=\"_blank\">Hemos visto<\/a> que nuestra aplicaci\u00f3n ten\u00eda 43 846 puntos de CC, distribuidos en 3 936 funciones y 349 archivos.<\/p>\n<p>La <a title=\"Aplicaci\u00f3n Legacy C \u2013 \u00bfRefactorizaci\u00f3n o reingenier\u00eda? (I)\" href=\"http:\/\/qualilogy.com\/es\/aplicacion-legacy-c-refactorizacion-reingenieria-1\/\" target=\"_blank\">distribuci\u00f3n de la Complejidad Ciclom\u00e1tica<\/a> entre estas funciones es la siguiente:<\/p>\n<p style=\"text-align: center\"><strong><em>Tabla 1 &#8211; Complejidad ciclom\u00e1tica de las funciones dentro de Word 1.1a<\/em><\/strong><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/05\/Word_CCDistribFns.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1824\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/05\/Word_CCDistribFns.jpg\" alt=\"Word_CCDistribFns\" width=\"244\" height=\"272\" \/><\/a><\/p>\n<p style=\"text-align: left\">No voy a considerar una cobertura de pruebas del 100% de la Complejidad Ciclom\u00e1tica, porque como probablemente sabes, m\u00e1s all\u00e1 de un cierto l\u00edmite, el tiempo para escribir nuevas pruebas se hace m\u00e1s largo. El esfuerzo de pruebas corresponde (aproximadamente) a una ley de Pareto seg\u00fan la cual es posible escribir 80% de las pruebas en el 20% del tiempo.<\/p>\n<p style=\"text-align: left\">De hecho, creo que 80\/20 es un poco optimista y estoy pensando que el 60% de las pruebas se puede realizar en el 50% del tiempo, y un 40% adicional requerir\u00e1 otro 50%. Nuestro principal objetivo es llevar a cabo en primer lugar una transferencia de conocimientos a un nuevo equipo, no lograr una cobertura de 100%.<\/p>\n<p style=\"text-align: left\">Sin embargo, las funciones m\u00e1s complejas requieren una mayor atenci\u00f3n, ya que tienen un mayor riesgo de introducir un defecto en caso de cambio. Estas funciones tambi\u00e9n son posibles candidatas para refactorizaci\u00f3n, por lo que es deseable una mejor &#8216;caracterizaci\u00f3n&#8217;, sobre todo si son dif\u00edciles de leer, con un gran n\u00famero de l\u00edneas de c\u00f3digo o de defectos que afecten a la mantenibilidad. Por ello, incrementaremos nuestra exigencia para estas pruebas.<\/p>\n<p style=\"text-align: left\">Por lo tanto, voy a considerar las siguientes hip\u00f3tesis:<\/p>\n<ul>\n<li style=\"text-align: left\">Para las funciones con una CC menor o igual a 20 puntos, la cobertura de pruebas ser\u00e1 el 60% de la Complejidad Ciclom\u00e1tica.<\/li>\n<li style=\"text-align: left\">Para las funciones con m\u00e1s de 20 puntos de CC, queremos una cobertura del 100% de la Complejidad Ciclom\u00e1tica.<\/li>\n<\/ul>\n<p style=\"text-align: left\">SonarQube tiene una regla \u2018Avoid too complex function\u2019, que enumera las funciones m\u00e1s all\u00e1 de 20 puntos de CC, con su n\u00famero exacto. Esto nos permiti\u00f3 calcular <a title=\"Aplicaci\u00f3n Legacy C \u2013 \u00bfRefactorizaci\u00f3n o reingenier\u00eda? (I)\" href=\"http:\/\/qualilogy.com\/es\/aplicacion-legacy-c-refactorizacion-reingenieria-1\/\" target=\"_blank\">la siguiente distribuci\u00f3n<\/a>:<\/p>\n<p style=\"text-align: center\"><em><strong>Tabla 2 \u2013 Distribuci\u00f3n de las funciones m\u00e1s complejas <\/strong><\/em><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/05\/Word_CCDistribLargestFns.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1836\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/05\/Word_CCDistribLargestFns.jpg\" alt=\"Word_CCDistribLargestFns\" width=\"405\" height=\"195\" \/><\/a><\/p>\n<p>Otra regla\u00a0\u2018Function\/method should not have too many lines\u2019 lista de nuevo las funciones con m\u00e1s de 100 l\u00edneas de c\u00f3digo, y el n\u00famero exacto de ellos.<br \/>\nAs\u00ed que puedo cruzar estas dos listas para identificar las funciones con m\u00e1s de 20 puntos de CC y m\u00e1s de 100 l\u00edneas de c\u00f3digo:<\/p>\n<p style=\"text-align: center\"><em><strong>Tabla 3 &#8211; Distribuci\u00f3n de las funciones m\u00e1s complejas por tama\u00f1o (LOC)<\/strong><\/em><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/09\/Qualilogy-Legacy-CC-LOC.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2038\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/09\/Qualilogy-Legacy-CC-LOC.jpg\" alt=\"Qualilogy-Legacy-CC-LOC\" width=\"606\" height=\"228\" \/><\/a><\/p>\n<p style=\"text-align: left\">No he incluido en la tabla anterior las 6 funciones m\u00e1s complejas, m\u00e1s all\u00e1 de 200 puntos de CC, que tambi\u00e9n se encuentran en programas complejos o con un gran n\u00famero de l\u00edneas:<\/p>\n<p style=\"text-align: center\"><em><strong>Tabla 4 &#8211; 6 programas con las funciones m\u00e1s complejas<br \/>\n<\/strong><\/em><\/p>\n<p style=\"text-align: left\"><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/09\/Qualilogy-Legacy-TestEffort-6max.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-2039 aligncenter\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/09\/Qualilogy-Legacy-TestEffort-6max.jpg\" alt=\"Qualilogy-Legacy-TestEffort-6max\" width=\"194\" height=\"154\" \/><\/a><\/p>\n<h2 style=\"text-align: left\">Estimaci\u00f3n del esfuerzo de pruebas<\/h2>\n<p>As\u00ed llegamos a una clasificaci\u00f3n de los diferentes componentes en tres categor\u00edas, desde las funciones m\u00e1s simples con pocas l\u00edneas hasta las funciones complejas de tama\u00f1o grande a muy grande.<\/p>\n<p>Para calcular una medida del esfuerzo de pruebas, me basar\u00e9 en la siguiente f\u00f3rmula:<\/p>\n<p style=\"text-align: center\"><strong><em>Test Effort = Code Reading Time + Characterization Test<\/em><\/strong><\/p>\n<p style=\"text-align: center\">con: <strong>Code Reading time = CC\/2 (mn) x Readibility Factor%<\/strong><\/p>\n<p style=\"text-align: center\">y: <strong>Characterization Test = CC x N (mn)<\/strong><\/p>\n<p>Utilizo tres variables en esta f\u00f3rmula:<\/p>\n<ul>\n<li>Code Reading (CR) time es el tiempo necesario para &#8216;leer&#8217; una funci\u00f3n y deducir las pruebas de caracterizaci\u00f3n correspondientes.<\/li>\n<li>Readibility Factor% (RF%) es un factor de la legibilidad del c\u00f3digo.<\/li>\n<li>Characterization Test (CT) es el tiempo de escritura y ejecuci\u00f3n de estas pruebas, con el n\u00famero N de minutos dependiendo de la Complejidad Ciclom\u00e1tica, y que adaptar\u00e9 seg\u00fan el tipo de componente.<\/li>\n<\/ul>\n<p><a title=\"Aplicaci\u00f3n Legacy \u2013 \u00bfRefactorizaci\u00f3n o reingenier\u00eda? (V)\" href=\"http:\/\/qualilogy.com\/es\/aplicacion-legacy-refactorizacion-reingenieria-5\/\" target=\"_blank\">Recordemos<\/a> que una prueba de caracterizaci\u00f3n se utiliza para describir el comportamiento de un bloque de c\u00f3digo y por lo tanto, a diferencia de una prueba unitaria o una prueba de regresi\u00f3n, no tiene como objetivo verificar que el c\u00f3digo se comporta correctamente y hace lo que debe hacer, sino como se comporta la aplicaci\u00f3n.<\/p>\n<p>No se requiere entonces una comprensi\u00f3n completa de la funci\u00f3n y de cada una de sus variables, constantes, par\u00e1metros y valores de entrada \/ salida. \u00bfPor eso digo &#8216;leer&#8217; la funci\u00f3n, es decir, leer de manera suficientemente r\u00e1pida para poder empezar a escribir pruebas de caracterizaci\u00f3n.<\/p>\n<p>Sin embargo, una funci\u00f3n que ser\u00e1 algo compleja y dif\u00edcil de leer, con &#8216;goto&#8217;, &#8216;switch&#8217;, etc. ser\u00e1 menos f\u00e1cil de entender. Voy a utilizar un factor de facilidad de lectura \u2013 Code Reading (CR) \u2013 para modular el esfuerzo para descifrar la funci\u00f3n.<\/p>\n<p>Tambi\u00e9n voy a ajustar el tiempo de realizaci\u00f3n de las pruebas de caracterizaci\u00f3n, ya que ser\u00e1 diferente en funci\u00f3n del n\u00famero de puntos de CC. Vimos en <a title=\"Aplicaci\u00f3n Legacy \u2013 \u00bfRefactorizaci\u00f3n o reingenier\u00eda? (V)\" href=\"http:\/\/qualilogy.com\/es\/aplicacion-legacy-refactorizacion-reingenieria-5\/\" target=\"_blank\">el \u00faltimo post<\/a> que la funci\u00f3n m\u00e1s compleja de nuestra aplicaci\u00f3n incluye &#8216;switch&#8217; con condiciones en diferentes variables r\u00e1pidamente comprensibles y f\u00e1ciles de probar. En tal caso, no necesit\u00e1remos mucho m\u00e1s tiempo para probar un \u00fanico &#8216;switch&#8217; con 8 o 10 puntos de CC que un &#8216;if &#8230; else&#8217; con 2 o 3 puntos de CC.<\/p>\n<p>Una vez m\u00e1s, voy a considerar las siguientes hip\u00f3tesis:<\/p>\n<ul>\n<li>Para las funciones con una CC igual o inferior a 20 puntos, el tiempo de escritura de las pruebas ser\u00e1 de 4 minutos por cada punto de CC.<\/li>\n<li>Para las funciones con m\u00e1s de 20 puntos de CC, el tiempo de escritura\u00a0de las pruebas ser\u00e1 de 2 minutos por punto de CC.<\/li>\n<\/ul>\n<p>Con esta formula, una funci\u00f3n igual a una Complejidad Ciclom\u00e1tica de:<\/p>\n<ul>\n<li>1 punto, requiere medio minuto de tiempo de comprensi\u00f3n y 4 minutos de realizaci\u00f3n de la(s) prueba(s), para un total de 4 minutos y 30 segundos.<\/li>\n<li>2 puntos, requiere 1 minuto de tiempo de lectura y 8 minutos de finalizaci\u00f3n de las pruebas, para un total de 9 minutos.<\/li>\n<li>8 puntos, requiere 4 minutos de tiempo de lectura y 32 minutos de realizaci\u00f3n de pruebas, para un total de 36 minutos.<\/li>\n<li>12 puntos, requiere 6 minutos de lectura y 48 minutos para realizar las pruebas, con un total de 54 minutos.<\/li>\n<\/ul>\n<p>De hecho, no tengo la CC exacta para funciones con menos de 20 puntos, as\u00ed que voy a suponer que el tiempo de realizaci\u00f3n de las pruebas ser\u00e1 de 9 minutos para las funciones de 2-4 puntos de CC, 36 minutos para funciones de 8-10 puntos de CC, 54 minutos para las funciones de 12 hasta 20 puntos de CC, etc.<\/p>\n<p>Esto supone un factor de legibilidad del c\u00f3digo (RF%) = 1. Voy a modificar el valor de este p\u00e1rametro cuando las funciones ser\u00e1n m\u00e1s complejas (m\u00e1s all\u00e1 de 20 puntos) o menos legibles.<\/p>\n<p>Estas cifras me parecen bastante realistas, o al menos, no parecen subestimadas. Puedo perfectamente presentar esta hip\u00f3tesis de c\u00e1lculo a un equipo de proyecto o directivos: ellos pueden entender que es una aproximaci\u00f3n, una base aceptable para proseguir con nuestra estimaci\u00f3n.<\/p>\n<p>Vamos a ver lo que nos da todo esto, en primer lugar con las funciones dentro de los 20 puntos de Complejidad Ciclom\u00e1tica:<\/p>\n<p style=\"text-align: center\"><em><strong>Tabla 5 &#8211; C\u00e1lculo del esfuerzo de pruebas en las funciones m\u00e1s simples (&lt;20 CC)<\/strong><\/em><\/p>\n<p style=\"text-align: left\"><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/09\/Qualilogy-Legacy-TestEffort-CCSub20.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2048\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/09\/Qualilogy-Legacy-TestEffort-CCSub20.jpg\" alt=\"Calcul de l'effort de test sur les fonctions les moins complexes\" width=\"569\" height=\"213\" \/><\/a><\/p>\n<p style=\"text-align: left\">Contamos 3 397 funciones con menos de 20 puntos de CC, para las que tenemos el prop\u00f3sito de cubrir con pruebas el 60% de la Complejidad Ciclom\u00e1tica, y por lo tanto, equivalente a 2 039 funciones. Pues, podemos ver por ejemplo:<\/p>\n<ul>\n<li style=\"text-align: left\">413 de 689 funciones con 1 punto de CC, y un coste unitario de prueba de 4.5 minutos, representan hasta 31 horas de realizaci\u00f3n de pruebas, o cerca de 4 d\u00edas (8 horas al d\u00eda).<\/li>\n<li style=\"text-align: left\">522 de 870 funciones con 2-4 puntos de CC, y un coste unitario de prueba de 9 minutos representan 78.3 horas o cerca de 10 d\u00edas, para un total acumulado (con los anteriores 4 d\u00edas) de casi 14 d\u00edas.<\/li>\n<li style=\"text-align: left\">295 de 491 funciones con 12 a 20 puntos de CC, y un coste por cada prueba de 54 minutos representan aproximadamente 33 d\u00edas de trabajo, un tercio de los 93,5 d\u00edas requeridos en total.<\/li>\n<\/ul>\n<p style=\"text-align: left\">Guardamos este n\u00famero en mente por ahora y pasamos a las funciones m\u00e1s complejas. Hemos dicho que para ellas:<\/p>\n<ul>\n<li>Queremos una cobertura de pruebas equivalente al 100% de la Complejidad Ciclom\u00e1tica.<\/li>\n<li>Calculamos el tiempo de realizaci\u00f3n de una prueba de caracterizaci\u00f3n con el n\u00famero de puntos de CC x 2 minutos.<\/li>\n<\/ul>\n<p>Tambi\u00e9n voy a ajustar el factor de legibilidad (RF%) de la siguiente manera:<\/p>\n<ul>\n<li>Por menos de 100 l\u00edneas de c\u00f3digo (LOC), RF% = 1.<\/li>\n<li>De 100 hasta 200 LOC, RF% = 1.5.<\/li>\n<li>De 200 hasta 300 LOC, RF% = 2.<\/li>\n<li>De 300 hasta 500 LOC, RF% = 2.5.<\/li>\n<li>De 500 hasta 700 LOC, RF% = 4.<\/li>\n<li>M\u00e1s all\u00e1 de 700 LOC (pero menos de 200 CC), RF% = 10. Son s\u00f3lo cuatro funciones, sin incluir las 6 funciones m\u00e1s complejas, que veremos por separado.<\/li>\n<\/ul>\n<p>Aqu\u00ed est\u00e1 la tabla correspondiente:<\/p>\n<p style=\"text-align: center\"><em><strong>Tabla 6 &#8211; C\u00e1lculo del esfuerzo de pruebas de las funciones complejas (20 &lt;CC &lt;200))<\/strong><\/em><\/p>\n<p style=\"text-align: left\"><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/09\/Qualilogy-Legacy-TestEffort-CCSup20.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2049\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/09\/Qualilogy-Legacy-TestEffort-CCSup20.jpg\" alt=\"Calcul de l'effort de test pour les fonctions complexes \u00e0 tr\u00e8s complexes\" width=\"669\" height=\"554\" \/><\/a><\/p>\n<p>A modo de explicaci\u00f3n y para facilitar la comprensi\u00f3n de esta tabla:<\/p>\n<ul>\n<li style=\"text-align: left\">137 funciones, con menos de 100 LOC y una CC entre 20 y 30 puntos, cada una representando una carga de prueba de 40 minutos (RF% = 1) y una cobertura de pruebas del 100% de la CC, requieren 14,3 d\u00edas de trabajo.<\/li>\n<li style=\"text-align: left\">95 funciones, con una CC entre 20 y 30 puntos y un tama\u00f1o de entre 100 y 200 LOC, pues con un factor de legibilidad (RF%) igual a 1.5, y entonces una carga de pruebas de 55 minutos, requieren 10.9 d\u00edas de trabajo. Con la carga anterior, la suma es igual a 14.3 + 10.9 = 25.2 d\u00edas.<\/li>\n<li style=\"text-align: left\">1 funci\u00f3n con una CC entre 60 y 70 puntos y un tama\u00f1o de entre 500 y 700 LOC, con un RF% de 4, tendr\u00e1 un tiempo de lectura de 120 minutos (60\/2 x 4) y un tiempo de 120 minutos para programar las pruebas, con un total de 4 horas o medio d\u00eda.<\/li>\n<li style=\"text-align: left\">4 funciones con una CC entre 100 y 200 puntos y m\u00e1s de 700 LOC, con un RF% de 10, tendr\u00e1n un tiempo estimado de 700 minutos por funci\u00f3n, por un total de casi 6 d\u00edas de trabajo para &#8216;caracterizar&#8217; estas 4 funciones.<\/li>\n<\/ul>\n<p>Hice un c\u00e1lculo espec\u00edfico para cada una de las 6 funciones pesadas y complejas:<\/p>\n<p style=\"text-align: center\"><em><strong>TTabla 7 &#8211; C\u00e1lculo del esfuerzo de pruebas para las funciones m\u00e1s complejas<br \/>\n<\/strong><\/em><\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/09\/Qualilogy-Legacy-TestEffort-CC6max.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2051\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/09\/Qualilogy-Legacy-TestEffort-CC6max.jpg\" alt=\"Qualilogy-Legacy-TestEffort-CC6max\" width=\"671\" height=\"188\" \/><\/a><\/p>\n<p style=\"text-align: left\">Excepto la funci\u00f3n en el programa &#8216;command2.c&#8217; con menos de 400 l\u00edneas, y por lo tanto un factor RF% de 2.5, he asignado un RF% de 10 para las otras funciones y un RF% de 20 por la funci\u00f3n m\u00e1s importante en el programa &#8216;RTFOUT.c&#8217; (que ya hemos comentado en <a href=\"http:\/\/qualilogy.com\/es\/aplicacion-legacy-refactorizacion-reingenieria-5\/\" target=\"_blank\">el post anterior<\/a>).<\/p>\n<h2 style=\"text-align: left\">S\u00edntesis<\/h2>\n<p style=\"text-align: left\">Con las hip\u00f3tesis que hemos elegido, llegamos a un total de 234 d\u00edas para la realizaci\u00f3n de las pruebas de caracterizaci\u00f3n para nuestra aplicaci\u00f3n Legacy en C, con el objetivo de transferir el conocimiento a un nuevo equipo, o durante un outsourcing.<\/p>\n<p style=\"text-align: left\">Estos 234 d\u00edas, un poco menos de 12 meses \/ hombre (sobre la base de 20 d\u00edas por mes) se distribuyen de la siguiente manera:<\/p>\n<ul>\n<li style=\"text-align: left\">93.5 d\u00edas para la cobertura de pruebas de 60% de la Complejidad Ciclom\u00e1tica total de 3 397 funcions con menos de 20 puntos de CC.<\/li>\n<li style=\"text-align: left\">117 d\u00edas para una cobertura total de las 533\u00a0 funciones entre 20 y 200 puntos de CC.<\/li>\n<li style=\"text-align: left\">23.5 d\u00edas para caracterizar las 6 funciones m\u00e1s complejas y m\u00e1s grandes.<\/li>\n<\/ul>\n<p style=\"text-align: left\">\u00bfQu\u00e9 tal estos n\u00fameros? \u00bfSon nuestras suposiciones correctas o cuestionables? Si presentamos nuestros resultados a los equipos de proyecto (actual o nuevo) y a los directivos, \u00bfqu\u00e9 problemas pueden surgir y c\u00f3mo responder? \u00bfQu\u00e9 plan de acci\u00f3n podemos presentar?<\/p>\n<p>Voy a dejar que piensas acerca de esto, a la espera de reflexionar sobre estos puntos en nuestro pr\u00f3ximo post.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hemos presentado en los dos articulos anteriores la noci\u00f3n de prueba (unitaria) de caracterizaci\u00f3n propuesta por Michael Feathers en su libro \u00ab\u00a0Working Effectively with Legacy Code\u00a0\u00bb. Hemos visto brevemente c\u00f3mo podemos utilizar este tipo de pruebas con el fin de adquirir los conocimientos del comportamiento de las aplicaciones. Digo brevemente porque, idealmente, tendr\u00edamos que desarrollar [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-1303","post","type-post","status-publish","format-standard","hentry","category-calidad-de-aplicaciones"],"_links":{"self":[{"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/posts\/1303"}],"collection":[{"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/comments?post=1303"}],"version-history":[{"count":31,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/posts\/1303\/revisions"}],"predecessor-version":[{"id":1334,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/posts\/1303\/revisions\/1334"}],"wp:attachment":[{"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/media?parent=1303"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/categories?post=1303"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/tags?post=1303"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}