# 11.3 Integración continua y pruebas automáticas en Azure DevOps

Para configurar Pipelines con Azure DevOps nos registramos en el siguiente link

[https://azure.microsoft.com/es-es/services/devops/pipelines/](https://azure.microsoft.com/es-es/services/devops/pipelines/)\
\
De momento debes llenar el siguiente formulario para tener agentes de forma gratuita en proyectos públicos o privados.

[https://aka.ms/azpipelines-parallelism-request](https://aka.ms/azpipelines-parallelism-request)

![](https://3731331968-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LKmGSg4qhizjqeDPHJC%2F-Lsia5fOOHzUl8MsCvrr%2F-LsiaOlWrbsVKJMc3xih%2Fimage.png?alt=media\&token=d2c3603d-a68f-4227-9837-c443156c8b9c)

Creamos un nuevo proyecto, elegí público para que este disponible sin restricciones de acceso por usuarios.

![](https://3731331968-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LKmGSg4qhizjqeDPHJC%2F-Lsia5fOOHzUl8MsCvrr%2F-LsibZAMPQH8J2einr_x%2Fimage.png?alt=media\&token=4c7b5caf-eec1-4bfe-b6d7-3885648c095a)

Seleccionamos GitHub

![](https://3731331968-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LKmGSg4qhizjqeDPHJC%2F-Lsia5fOOHzUl8MsCvrr%2F-LsibpUx5_5NC9R2Wm72%2Fimage.png?alt=media\&token=0f266e71-f8f3-473a-aff9-f78e87c6394f)

Seleccionamos el repositorio donde tenemos el código en mi caso es CaducaRest

![](https://3731331968-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LKmGSg4qhizjqeDPHJC%2F-Lsia5fOOHzUl8MsCvrr%2F-Lsic-LXPVh6WxRK6vNZ%2Fimage.png?alt=media\&token=1771bcbe-90bc-437e-8cbd-3a9e702df51b)

Seleccionamos la opción: **ASP .NET Core (.NET Framework)** esta opción te configura el pipeline para generar el build de tu proyecto y luego ejecutar el proyecto de pruebas automáticas

![](https://3731331968-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LKmGSg4qhizjqeDPHJC%2F-M2pomvxpVwvKO_J4wFp%2F-M2ps-U2dPIJgsjdyWHH%2Fimage.png?alt=media\&token=bc4b41cc-2533-420d-a27c-2e13d37396ec)

Edita la tarea para indicar la versión de .net por lo general a veces las nuevas versiones de .net tardan un poco en estar en Azure Pipelines. Si ves algún error en el pipeline relacionado a la versión de .net puedes instalar la versión que necesitas con este task

```yaml
- task: UseDotNet@2 
  displayName: "Instalar .NET Core 8.0.x"
  inputs:
        version: '8.0.x'
        performMultiLevelLookup: true
        packageType: sdk
```

La parte de pruebas la cambiamos para agregar el nombre de nuestro proyecto de pruebas unitarias.&#x20;

Agregamos una tarea de .Net Core

![](https://3731331968-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LKmGSg4qhizjqeDPHJC%2F-M5nKHj66BA_aRDpqNIg%2F-M5nKdmCIrv8s5Q8ArLK%2Fimage.png?alt=media\&token=b2fc7726-fbc9-401f-a73e-c47dc69b3524)

Especificamos las siguientes opciones:

* **Command**: Seleccionamos **test** de este manera ejecutaremos nuestro proyecto de pruebas unitarias.
* **Path to projects(s):** Tecleamos la ruta de nuestro proyecto de pruebas unitarias en este caso es **\*\*/xUnit.CaducaRest/.csproj**&#x20;
* **Arguments:** Tecleamos **'**-**-configuration $(buildConfiguration) /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura /p:CoverletOutput=$(Build.SourcesDirectory)/TestResults/Coverage/'** con esto indicamos que haga el build en release como esta en las variables al inicio. Con la opción **collect "Code Coverage"** se revisa la cantidad de código que tenemos con casos de prueba unitarias y nos indica en un porcentaje del 0 al 100 que tanto porcentaje del código tenemos probado.
* **Test run title:** puedes poner un título en mi caso fue **Unit Test.**&#x20;

![](https://3731331968-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LKmGSg4qhizjqeDPHJC%2F-M5nBEwXvwn1MlB9-ZrP%2F-M5nIdUc3vpPTOlSHQlf%2Fimage.png?alt=media\&token=942ea8ea-b5b8-48e2-ab79-add63998c107)

El código queda de la siguiente manera:

```yaml
- task: DotNetCoreCLI@2
  displayName: Testing Unit Test
  inputs:
    command: 'test'
    projects: '**/xUnit.CaducaRest/*.csproj'
    arguments: '--configuration $(buildConfiguration) /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura /p:CoverletOutput=$(Build.SourcesDirectory)/TestResults/Coverage/'
    testRunTitle: 'Unit Test'
```

Agrega otro task Publish Code Coverage Results

* Code coverage tool: Selecciona Cobertura
* Summary File: Es el archivo generado en el paso anterior. Teclea **'$(Build.SourcesDirectory)/\*\*/coverage.cobertura.xml'**

![](https://3731331968-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LKmGSg4qhizjqeDPHJC%2F-MDwMeshFXXEQo3AB5UP%2F-MDwNiUPlSN9dOQG3RyL%2Fimagen.png?alt=media\&token=b9b215b3-7b6d-4fa7-8675-73afa1ebf00f)

Da clic en **Add**.&#x20;

El código queda:

```yaml
- task: PublishCodeCoverageResults@1
  displayName: 'Publish code coverage report'
  inputs:
    codeCoverageTool: 'Cobertura'
    summaryFileLocation: '$(Build.SourcesDirectory)/**/coverage.cobertura.xml'
```

Y damos clic en Run

![](https://3731331968-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LKmGSg4qhizjqeDPHJC%2F-M5nBEwXvwn1MlB9-ZrP%2F-M5nHk5CMlfZcEubSx0r%2Fimage.png?alt=media\&token=5b80373b-c3d5-4901-a1c7-dfd4868da15c)

Si todo es correcto vemos esta pantalla

![](https://3731331968-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LKmGSg4qhizjqeDPHJC%2F-Lsia5fOOHzUl8MsCvrr%2F-Lsic_bXkfRs0QZLIHxQ%2Fimage.png?alt=media\&token=3f8545a4-516e-4481-909d-1ee00ba0937a)

Podemos ver los pasos que se están ejecutando

![](https://3731331968-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LKmGSg4qhizjqeDPHJC%2F-Lsia5fOOHzUl8MsCvrr%2F-LsicgOaNVK6UWU-8b9o%2Fimage.png?alt=media\&token=08f21c48-e21d-4adb-996f-bc04b1d1d22b)

Si todo es correcto vemos esta pantalla

![](https://3731331968-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LKmGSg4qhizjqeDPHJC%2F-Lsia5fOOHzUl8MsCvrr%2F-LsidFsZK-oFmlQmUgH7%2Fimage.png?alt=media\&token=02308005-8136-4371-945f-0daa44ccaeaa)

Puedes dar clic en la sección VSTest y verás el resultado de tus pruebas, te llega un correo con el resultado del build

![](https://3731331968-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LKmGSg4qhizjqeDPHJC%2F-Lsia5fOOHzUl8MsCvrr%2F-Lsid_GRavbsT-is4TaM%2Fimage.png?alt=media\&token=e768387a-2f5e-462e-996c-c1941a8e8c3e)

En la parte de Summary te genera un resumen de los Test que pasaron, y la cobertura de código, la cual te indica el porcentaje de código que contiene pruebas automáticas. En el ejemplo solo el 6.11% del código tiene alguna prueba automática.

![](https://3731331968-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LKmGSg4qhizjqeDPHJC%2F-M5m_jagiFe6pAkAQS46%2F-M5mbDFjZil7hXFOANIX%2Fimage.png?alt=media\&token=5a4bf6fe-7884-49b0-af39-f51a00a5d624)

Da clic en Code Coverage para ver el resumen donde por cada archivo indica cuantas líneas han sido probadas. Un buen porcentaje es el 80% de tu código. Te marca el archivo que mas riesgo tiene, en este caso es CustomMySQLException. El Cyclomatic complexity indica que tan complejo es tu código ya que tiene muchos if anidados, while, funciones muy largas, entre mayor sea el número es mas difícil de probar y puede ser una señal de que la clase hace demasiadas cosas a la vez.

<figure><img src="https://3731331968-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LKmGSg4qhizjqeDPHJC%2Fuploads%2FtJzzNR7Ri6b9vJ3N2SX4%2Fimage.png?alt=media&#x26;token=d34846f4-bf87-4c9c-853d-499e37898b40" alt=""><figcaption></figcaption></figure>

Si das clic en un archivo ves el resumen

![](https://3731331968-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LKmGSg4qhizjqeDPHJC%2F-MDwSgKLFxB9IzbPOfwe%2F-MDwZ8A4Z3nGvJkpEY6Q%2Fimagen.png?alt=media\&token=20e13147-bd43-474b-aeb5-993b179bb1b5)

<figure><img src="https://3731331968-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LKmGSg4qhizjqeDPHJC%2Fuploads%2FUlb6WsoXQ2e8DlpLvEr5%2Fimage.png?alt=media&#x26;token=fcad160d-2cf9-4a4e-8c44-afec962dcb45" alt=""><figcaption></figcaption></figure>

Te marca en verde el código que incluye al menos un un caso de prueba y en rojo lo que no tiene ningún caso de prueba.

![](https://3731331968-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LKmGSg4qhizjqeDPHJC%2F-MDwSgKLFxB9IzbPOfwe%2F-MDwZVaA3j0IQB5ZXHK1%2Fimagen.png?alt=media\&token=c19f2793-c239-4b7c-ac89-8459fc9ae164)

{% hint style="info" %}
Otra opción importante es el mutating testing. Donde se incluyen variaciones a las pruebas. Ejemplo si debes probar una operación de sumar, incluye tests para probar que si cambias el signo de la función sumar por -,/,\* y los test deben fallar. Si no fallan tú test esta mal. Puedes ver mas información [https://github.com/stryker-mutator/stryker-net](https://github.com/stryker-mutator/stryker-net)
{% endhint %}

Cambiamos la función Sumar para que reste, le damos commit para ver el error, de esta forma cada vez que realices un commit se ejecutaran las pruebas con Azure DevOps

![](https://3731331968-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LKmGSg4qhizjqeDPHJC%2F-Lsia5fOOHzUl8MsCvrr%2F-LsifQNbytk0dXkaP8Pv%2Fimage.png?alt=media\&token=e788b2e6-6936-4c98-86af-02ae866e21ab)

Si damos clic vemos el detalle

![](https://3731331968-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LKmGSg4qhizjqeDPHJC%2F-Lsia5fOOHzUl8MsCvrr%2F-LsifbndnuWIupDFUQ_w%2Fimage.png?alt=media\&token=978f3b85-adc1-4a8f-859d-d7da1854dd5d)

El archivo yaml queda de la siguiente forma

```yaml
# ASP.NET Core (.NET Framework)
# Build and test ASP.NET Core projects targeting the full .NET Framework.
# Add steps that publish symbols, save build artifacts, and more:
# https://docs.microsoft.com/azure/devops/pipelines/languages/dotnet-core

trigger:
- master

pool:
  vmImage: 'windows-latest'

variables:
  solution: '**/*.sln'
  buildPlatform: 'Any CPU'
  buildConfiguration: 'Release'
  system.debug: false

steps:

- task: UseDotNet@2 
  displayName: "Instalar .NET Core 8.0.x"
  inputs:
        version: '8.0.x'
        performMultiLevelLookup: true
        packageType: sdk
        
- script: dotnet build --configuration $(buildConfiguration)
  displayName: 'Build Project $(buildConfiguration) '

- task: DotNetCoreCLI@2
  displayName: Testing Unit Test
  inputs:
    command: 'test'
    projects: '**/xUnit.CaducaRest/*.csproj'
    arguments: '--configuration $(buildConfiguration) /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura /p:CoverletOutput=$(Build.SourcesDirectory)/TestResults/Coverage/'
    publishTestResults: true
    testRunTitle: 'Unit Test'

- task: PublishCodeCoverageResults@1
  displayName: 'Publish code coverage report'
  inputs:
    codeCoverageTool: 'Cobertura'
    summaryFileLocation: '$(Build.SourcesDirectory)/**/coverage.cobertura.xml'
  
```
