En este tutorial vamos a realizar un análisis de la calidad de un proyecto ejemplo de acuerdo con la información de los índices de calidad que nos ofrece SonarCloud.
En este tutorial aprenderemos a:
SonarCLoudPara acceder al sitio oficial de SonarCloud.
Este tutorial ha sido desarrollado en la Universidad de los Andes, Colombia
Todos los issues detectados por Sonar al realizar el análisis estático de código tienen un esfuerzo o costo de remediación asociado. Este costo se expresa en minutos.
La suma de todos los costos de remediación de los issues tipo code smell conforman la deuda técnica. Recordemos que los issues tipo code smell son las no conformidades relacionadas con el atributo Mantenbilidad.
El esfuerzo necesario para corregir los issues de tipo bugs, es decir del atributo Confiabilidad, se llama "Esfuerzo de remediación de la confiabilidad" (Reliability remediation effort).
El esfuerzo necesario para corregir los issues de tipo vulnerabilidad, es decir del atributo Seguridad, se llama "Esfuerzo de remediación de la Seguridad" (Security remediation effort).
Atributo | Tipo de no conformidad/issue | Esfuerzo total para remediar los issues |
Mantenibilidad |
| Deuda técnica (Technical debt) |
Confiabilidad |
| Esfuerzo de remediación de la confiabilidad (Reliability remediation effort) |
Seguridad |
| Esfuerzo de remediación de la seguridad (Security remediation effort) |
Tabla 1: Vocabulario básico
El proyecto que vamos a analizar en este ejemplo se encuentra en el TutorialCanciones.
Para guíar el análisis vamos a completar la información de la siguiente tabla que resume los principales hallazgos.
Esfuerzo total para remediar los issues | # Issues | Costo | Índice de calidad | Datos cálculo índice |
Deuda técnica | #code smells | Deuda técnica | A,B,C, D o E | - |
- | ||||
- | ||||
Esfuerzo de remediación de la confiabilidad | #bugs | Esfuerzo de remediación de la confiabilidad | A,B,C, D o E | - |
Esfuerzo de remediación de la seguridad | #vulnerabilidades | Esfuerzo de remediación de seguridad | A,B,C, D o E | - |
Tabla 2: Resumen principales hallazgos
El índice de mantenibilidad se calcula a partir de la deuda técnica y del número de líneas de código totales del proyecto. La deuda técnica se calcula a partir de los issues de tipo code smells.
La siguiente figura presenta el reporte del tamaño del proyecto.

Figura 1: Tamaño del proyecto
El costo de desarrollo del proyecto se calcula multiplicando el número de líneas de código (lógicas) por 0,06 días. Este valor representa, en SonarQube, el esfuerzo para desarrollar una línea y ha sido definido por una comunidad de desarrolladores experimentados. Para el caso del ejemplo, el costo de desarrollo equivale a 428,16 horas, como se ve en el cálculo a continuación:
Costo de desarrollo = 892 * 0,06 días = 53,52 x 8 horas = 428,16 horas
La deuda técnica suma los esfuerzos de todos los code smells del proyecto. La siguiente figura muestra el reporte de la deuda técnica, para el caso del ejemplo:

Figura 2: Deuda técnica
Para el ejemplo, la deuda técnica corresponde a 3,72 horas, como se ve en el siguiente cálculo:
Deuda técnica = 3h 43 min = 3,72 horas
La razón o proporción de la deuda técnica con respecto al costo del proyecto se calcula dividiendo la deuda técnica por el costo de desarrollar las líneas de todo el proyecto. Para el caso del ejemplo, equivale a 0,8% como se ve el siguiente cálculo:
Technical debt ratio = 3,72/428,16 = 0,008 = 0,8%
Con estas informaciones podemos completar la tabla de resumen de los principales hallazgos:
Esfuerzo total para remediar los issues | # Issues | Costo | Índice de calidad | Datos cálculo índice |
Deuda técnica | 45 | 3h 43 min | A | LOCs: 892 |
Costo de desarrollo: 428,16 | ||||
Technical debt ratio: 0.8% |
Tabla 3: Resumen principales hallazgos el cálculo de los índices
Entonces, para el ejemplo, el índice de mantenibilidad es A porque el Debt Ratio es menor de 5%
En el proyecto ejemplo hay 45 code smells distribuidos por severidad como lo muestra la figura 3, 10 críticos, 2 mayores y 33 menores.

Figura 3: Severidad de los code smells
Los code smells de severidad crítica corresponden a violaciones de reglas de manejo de excepciones y de definición de constantes. Hay 10 code smells críticos en el ejemplo que violan las siguientes reglas:
"SystemExit" should be re-raised
Code Smell Critical Bad-practice error-handling suspicious SonarQube (Python) Constant/issue: 5min
String literals should not be duplicated
Code Smell Critical design SonarQube (Python) Linear with offset: 2min +2min per duplicate instance
Los code smells de severidad mayor corresponden a violaciones de reglas de código duplicado y a código comentado. Hay 2 issues que corresponden a violaciones de las siguientes reglas:
Functions and methods should not have identical implementations
Code Smell Major confusing duplicate suspicious SonarQube (Python) Constant/issue: 15min
Sections of code should not be commented out
Code Smell Major unused SonarQube (Python) Constant/issue: 5min
Los code smells de severidad menor corresponden a violaciones de reglas de convención de nombramiento. En el proyecto ejemplo, se utiliza camelcase y en el perfil la regla pide que la separación de palabras se haga con _ (barra al piso).
En el proyecto hay 33 code smells relacionados con las siguientes reglas:
Method names should comply with a naming convention
Code Smell Minor convention SonarQube (Python) Constant/issue: 5min
Field names should comply with a naming convention
Code Smell Minor convention SonarQube (Python) Constant/issue: 2min
Sharing some naming conventions is a key point to make it possible for a team to efficiently collaborate. This rule allows to check that field names match a provided regular expression.
Noncompliant Code Example
With the default regular expression ^[_a-z][_a-z0-9]*$:
class MyClass:
myField = 1
Compliant Solution
class MyClass:
my_field = 1
Al revisar el reporte de Mantenibilidad que muestra la deuda técnica contra el número de líneas de código de los archivos del proyecto, vemos que el archivo lógica/Colection.py es el que más issues tiene (24) con una deuda técnica 1h 48 min, estos son los issues críticos y menores.

Figura 4: Deuda técnica contra tamaño de los archivos
Módulo/archivo | Número de | Deuda técnica |
lógica/Colection.py | 24 | 1h 48 min |
vista/interfaz_coleccion.py | 2 | 28 min |
vista/vista_lista_cancion.py | 4 | 24 min |
Tabla 4: Distribución de la deuda técnica en los archivos del programa
Cualquier desarrollador debería revisar con frecuencia los issues que se presentan en la lista CWE top 25, ya que estos presentan no conformidades de alto impacto, muchos para la seguridad, que se presentan con gran frecuencia en los proyectos de desarrollo. Veamos cómo está el proyecto del ejemplo en este aspecto.
En el ejemplo que estamos analizando no hay ningún issue de ninguna de las tres categorías, que esté en la lista de los CWE top 25
Para saber el código del CWE, hay que ir al final de la regla como se muestra en la siguiente figura.


Figura 5: Lista de los CWE top 25.
En este ejemplo no tenemos bugs:

Figura 6: Información del índice de Confiabilidad.
Entonces, para el proyecto de ejemplo, el índice de confiabilidad es A porque el número de bugs críticos es 0.
El proyecto no tiene bugs.
El proyecto no tiene bugs.
El proyecto no tiene bugs.
En este ejemplo no tenemos vulnerabilidades:

Figura 7: Información del índice de Seguridad.
Entonces el índice de seguridad es A porque el número de vulnerabilidades es 0.
El proyecto no tiene vulnerabilidades.
El proyecto no tiene vulnerabilidades.
El proyecto no tiene vulnerabilidades
La tabla completa de los datos del proyecto:
Esfuerzo total para remediar los issues | # Issues | Costo | Índice de calidad | Datos cálculo índice |
Deuda Técnica | 45 | 3h 43 min | A | LOCs: 892 |
Costo de desarrollo: | ||||
| ||||
Esfuerzo de remediación de la confiabilidad | 0 | 0 | A | 0 |
Esfuerzo de remediación de la seguridad | 0 | 0 | A | 0 |
Tabla 5: Resumen principales hallazgos con cálculo de índices completos
A partir de la información que se ha recopilado y analizado hasta el momento, en especial el cálculo de los diferentes índices es posible concretar un diagnóstico de un proyecto en curso. Este tipo de diagnósticos se usan para, que el equipo de desarrollo mejore sus procesos. De la misma forma, se utiliza para evitar salir a producción con producto que no satisface condiciones de seguridad o confiabilidad mínimas.
De acuerdo con los índices de mantenibilidad, confiabilidad y seguridad, el proyecto tiene buena calidad ya que en todos los casos el valor es A. Significa que la deuda técnica es menor al 5% del costo de desarrollo de las 892 LOCS. En el proyecto no hay bugs ni vulnerabilidades lo que implica que el índice de confiabilidad y de seguridad son A.
Con respecto a la deuda técnica, esta proviene de dos code smells críticos, 10 code smells mayores y 24 code smells menores.
Los 24 code smells menores están todos ubicados en el archivo Colection.py y corresponden a no conformidades con las convenciones de nombramiento de acuerdo con el perfil de calidad por defecto de SonarQube. En el proyecto se utiliza camelcase y en el perfil la regla pide que la separación de palabras se haga con _ (barra al piso).
Con respecto a qué debemos corregir primero, consideramos que los issues críticos están relacionados con un inapropiado manejo de excepciones. Los code smells menores relacionados con las convenciones pueden esperar. Incluso, si la política de la organización es usar camelcase, se puede considerar cambiar la regla del perfil de calidad para que analice los nombres para que sean conformes con camel case.
Hay distintas formas de calcular los índices de calidad, una manera es el modelo Sqale. La compañía bitergarten desarrolló un plugin para SonarQube que reporta el análisis de calidad basado en Sqale. El plugin reporta el análisis como se muestra en la siguiente figura:

Figura tomada de: bitergarten
Para saber más sobre la lista de los CWE top 25 puedes visitar el siguiente enlace.
La compañía bitergarten tiene un plugin para SonarQube que reporta los issues encontrados en el proyecto que están en la lista de los CWE top 25, el plugin saca un reporte como el de la siguiente figura:

Figura tomada de bitergarten
© - Derechos Reservados: La presente obra, y en general todos sus contenidos, se encuentran protegidos por las normas internacionales y nacionales vigentes sobre propiedad Intelectual, por lo tanto su utilización parcial o total, reproducción, comunicación pública, transformación, distribución, alquiler, préstamo público e importación, total o parcial, en todo o en parte, en formato impreso o digital y en cualquier formato conocido o por conocer, se encuentran prohibidos, y solo serán lícitos en la medida en que se cuente con la autorización previa y expresa por escrito de la Universidad de los Andes.
De igual manera, la utilización de la imagen de las personas, docentes o estudiantes, sin su previa autorización está expresamente prohibida. En caso de incumplirse con lo mencionado, se procederá de conformidad con los reglamentos y políticas de la universidad, sin perjuicio de las demás acciones legales aplicables.