Marc d’Automatització de Testing (MAT)
El Marc d’Automatització de Testing (MAT) és un framework especialitzat en l’automatització de proves d’integració contínua, dissenyat per a integrar-se amb els fluxos de treball de desenvolupament i desplegament en GitHub Enterprise Cloud (GHEC), tant per al SIC3.0 com el SIC+. El seu objectiu és garantir la qualitat del programari mitjançant l’execució automatitzada de proves en entorns preproductius, facilitant així la detecció precoç d’errors i la validació contínua de les aplicacions abans d’arribar a l’entorn productiu.
El MAT es basa en un enfocament modular i flexible, permetent als equips de desenvolupament definir i executar proves específiques per a les seves aplicacions. Cada tipus de prova, funcional, de regressió, de rendiment o de api, tindrà associada un repositori específic que allotjarà el codi dels tests, així com els recursos necessaris per a la seva execució.
La documentació oficial del MAT pot trobar-se en la següent direcció Documentació Marc d’Automatització de Testing (MAT). En ella s’explica detalladament aquest framework desenvolupat per l’equip de Qualitat del CTTI.
Per a trobar informació sobre el desenvolupament de tests de Selenium, JMeter o Postman ha de consultar-se la documentació desenvolupada per l’equip de qualitat, i qualsevol dubte referent al desenvolupament d’aquests test, o la funcionalitat del framework ha de ser consultada a l’equip de Qualitat i no a l’equip del SIC, sent aquest únicament responsable de la integració amb aquest framework des de GitHub i els seus workflows i no del seu desenvolupament.
Per a la gestió i el control d’integració amb el MAT, s’ha implementat un orquestador que s’encarrega de coordinar l’execució de les proves en funció dels desplegaments realitzats. Aquest orquestador processa un arxiu de configuració (release.yml) que defineix quines proves s’han d’executar, en quina ordre i amb quins paràmetres, assegurant així una integració fluida amb els fluxos de treball definits fent ús de GitHub Actions.
Tipus de proves del MAT
El SIC+ s’integra amb el MAT amb l’execució de 4 tipus de proves diferents, funcionals, de regressió, de rendiment i de API. Cadascun d’aquests tipus de proves té el seu propi repositori i estructura de codi.
Proves funcionals
El repositori de proves funcionals s’utilitza per a validar el comportament esperat de l’aplicació en escenaris específics Functional Tests Template. Aquestes proves se centren en verificar que les funcionalitats implementades compleixen amb els requisits definits i funcionen correctament. L’eina utilitzada per a les proves és Selenium, que permet simular interaccions d’usuari amb l’aplicació web i verificar que els resultats són els esperats.
Aquest repositori conté el fitxer “release.yml” en l’arrel del repositori, que és l’encarregat de definir les proves que s’executaran en una release concreta. Aquest fitxer segueix una estructura específica que permet orquestrar les proves de manera adequada.
El repositori, a més, compta amb tres branques principals, igual que la resta de repositoris del SIC+, develop, release i màster, i un conjunt de workflows de CI/CD que s’hauran d’usar seguint el GitFlow comú del SIC+ per al desenvolupament de les proves de Selenium per a l’aplicatiu en concret.
Proves de regressió
El repositori de proves de regressió s’utilitza per a validar que els canvis realitzats en l’aplicació no introdueixen nous errors o afecten negativament les funcionalitats existents Regression Tests Template. Igual que les proves funcionals, s’utilitzen eines com Selenium per a simular interaccions d’usuari i verificar els resultats.
El repositori, igual que en el de proves funcionals, també compta amb tres branques principals, igual que la resta de repositoris del SIC+, develop, release i màster, i un conjunt de workflows de CI/CD que s’hauran d’usar seguint el GitFlow comú del SIC+ per al desenvolupament de les proves de Selenium per a l’aplicatiu en concret.
Proves de rendiment
El repositori de proves de rendiment s’utilitza per a avaluar el comportament de l’aplicació baix diferents càrregues i condicions Performance Tests Template. Aquestes proves permeten identificar colls d’ampolla, mesurar temps de resposta i garantir que l’aplicació pot manejar el volum d’usuaris.
Aquestes proves s’executen amb l’eina JMeter, que permet simular múltiples usuaris i mesurar el rendiment de l’aplicació en diferents escenaris.
Aquest repositori, a diferència dels anteriors, només compta amb la branca “màster”
Proves de API
El repositori de proves de API s’utilitza per a validar el correcte funcionament de les interfícies de programació d’aplicacions (API) del sistema Api Tests Template. Aquestes proves se centren en verificar que les API responen correctament a les sol·licituds i compleixen amb els contractes definits.
Aquestes proves s’executen amb l’eina Postman, que permet definir i executar proves sobre les API de manera senzilla i efectiva.
El repositori de proves de API, igual que el de proves de rendiment, només compta amb la branca “màster”.
Estructura del orquestador (fitxer “release.yml”)
S’ha creat un fitxer d’orquestració anomenat “release.yml” que es troba en l’arrel del repositori de proves funcionals de cada aplicatiu. Aquest fitxer defineix les proves que s’executaran en una release concreta i segueix una estructura específica que permet orquestrar les proves de manera adequada.
En el següent codi, s’observa el template del fitxer “release.yml” Test Funcionals release.yml template, que s’ha creat per al orquestador del MAT.
release-file:
version: 1.0.0
parameters:
global:
env_to_test: Preproduccio
jira_project_key: ''
jira_issue_key: ''
functional:
url_app: <myurlapp>
regression:
url_app: <myurlapp>
api:
app_name: <myappname>
elements:
- name: Infra
version: 1.0.0
repository: https://github.com/ctti-dev/<repository_name>
- name: Frontend
version: 1.0.0
repository: https://github.com/ctti-dev/<repository_name>
- name: Backend
version: 1.0.0
repository: https://github.com/ctti-dev/<repository_name>
tests:
- name: FunctionalTests
type: functional
url: https://github.com/ctti-dev/<app_code>.<comp_code>-<acronim>-functional-tests
branch: master
# - name: RegressionTests
# type: regression
# url: https://github.com/ctti-dev/<app_code>.<comp_code>-<acronim>-regression-tests
# branch: master
# - name: PerformanceTests
# type: performance
# url: https://github.com/ctti-dev/<app_code>.<comp_code>-<acronim>-performance-tests
# branch: master
# - name: ApiTests
# type: api
# url: https://github.com/ctti-dev/<app_code>.<comp_code>-<acronim>-api-tests
# branch: master
Aquest fitxer conté els següents blocs principals, que es detallaran en l’esquema de validació més endavant:
release-file
: El bloc principal que engloba tota la configuració del orquestador.version
: La versió del la release de l’aplicatiu.parameters
: Un bloc que defineix els paràmetres globals i específics per a les proves funcionals, de regressió i de API.global
: Paràmetres globals com l’entorn a provar i les claus de Jira.functional
: Paràmetres específics per a les proves funcionals, com la URL de l’aplicació.regression
: Paràmetres específics per a les proves de regressió, com la URL de l’aplicació.api
: Paràmetres específics per a les proves de API, com el nom de l’aplicació.
elements
: Un bloc que defineix els components de la release de l’aplicatiu en una llista.name
: El nom del component.version
: La versió del component en format semàntic.repository
: La URL del repositori del component.
tests
: Un bloc que defineix els tests que s’executaran en la release en una llista.name
: El nom del test.type
: El tipus de test (functional, regression, performance, api).url
: La URL del repositori on es troben els tests.branch
: La branca del repositori de tests on es defineixen els tests a executar.
A continuació, es mostra un exemple d’un fitxer “release.yml” que podria usar-se per a un aplicatiu concret, com l’exemple d’un aplicatiu amb codi d’aplicació 9999, codi de component 99 i acrònim “myapp”:
release-file:
version: 1.0.0
parameters:
global:
env_to_test: Preproduccio
jira_project_key: ''
jira_issue_key: ''
functional:
url_app: https://preproduccio.myapp.intranet.gencat.cat/
regression:
url_app: https://preproduccio.myapp.intranet.gencat.cat/
# api:
# app_name: myapp
elements:
- name: Infra
version: 1.0.32
repository: https://github.com/ctti-dev/9999.99-myapp-infra
- name: Frontend
version: 2.2.15
repository: https://github.com/ctti-dev/9999.99-myapp-example-frontend
- name: Backend
version: 1.10.0
repository: https://github.com/ctti-dev/9999.99-myapp-example-backend
tests:
- name: FunctionalTests
type: functional
url: https://github.com/ctti-dev/9999.99-myapp-functional-tests
branch: master
- name: RegressionTests
type: regression
url: https://github.com/ctti-dev/9999.99-myapp-regression-tests
branch: master
# - name: PerformanceTests
# type: performance
# url: https://github.com/ctti-dev/9999.99-myapp-performance-tests
# branch: master
# - name: ApiTests
# type: api
# url: https://github.com/ctti-dev/9999.99-myapp-api-tests
# branch: master
En el cas que algun test o element estigui comentat, o no vingui informat, s’ometrà l’execució d’aquesta mena de proves o no es comprovarà el desplegament d’aquest component a l’entorn de preproducció. Això permet una gran flexibilitat en la configuració de les proves a executar, adaptant-se a les necessitats específiques de cada release.
Integració amb el MAT en els workflows de CD
S’han afegit diversos steps als workflows de CD de contenidors, funcions, contingut estatico i infra per a poder executar les proves del MAT:
- Obtain test repository names: construeix els noms dels repositoris de proves.
- Checkout auxiliary repository: clona el repositori de tests funcionals per a obtenir l’arxiu
release.yml
. - MAT Orquestrator Proccessing: crida al action del orquestrador.
- MAT Functional Tests - Selenium: crida al action del MAT pasandole els parametros necessaris per als tests funcionals construïts en el action del orquestrador.
- MAT Regression Tests - Selenium: crida al action del MAT pasandole els parametros necessaris per als tests de regressió construïts en el action del orquestrador.
- MAT API Tests - Postman: crida al action del MAT pasandole els parametros necessaris per als tests de api construïts en el action del orquestrador.
- MAT Performance Tests - JMeter: crida al action del MAT pasandole els parametros necessaris per als tests de performance construïts en el action del orquestrador.
Esquema de validació
{
"type": "object",
"properties": {
"release-file": {
"type": "object",
"properties": {
"version": {
"type": "string",
"pattern": "^\\d+\\.\\d+\\.\\d+$"
},
"parameters": {
"type": "object",
"properties": {
"global": {
"type": "object",
"properties": {
"env_to_test": {
"type": "string",
"enum": ["Desenvolupament", "Preproduccio", "Produccio"]
},
"jira_project_key": {"type": "string"},
"jira_issue_key": {"type": "string"}
},
"required": ["env_to_test"]
},
"functional": {
"type": "object",
"properties": {
"url_app": {"type": "string", "format": "uri"}
},
"required": ["url_app"]
},
"regression": {
"type": "object",
"properties": {
"url_app": {"type": "string", "format": "uri"}
},
"required": ["url_app"]
},
"api": {
"type": "object",
"properties": {
"app_name": {"type": "string"}
},
"required": ["app_name"]
}
},
"required": ["global", "functional"]
},
"elements": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {"type": "string"},
"version": {
"type": "string",
"pattern": "^\\d+\\.\\d+\\.\\d+$"
},
"repository": {"type": "string", "format": "uri"}
},
"required": ["name", "version", "repository"]
},
"minItems": 1
},
"tests": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {"type": "string"},
"type": {
"type": "string",
"enum": ["functional", "regression", "performance", "api"]
},
"url": {"type": "string", "format": "uri"},
"branch": {"type": "string"}
},
"required": ["name", "type", "url"]
},
"minItems": 1,
"contains": {
"type": "object",
"properties": {
"type": {"const": "functional"}
},
"required": ["type"]
}
}
},
"required": ["version", "parameters", "elements", "tests"]
}
},
"required": ["release-file"]
}
Estructura del schema.json
-
Objecte arrel:
- Propietat principal: “release-file” (tipus object), que engloba tota la configuració.
-
Dins de release-file:
-
version: Tipus: string Patró: SemVer (^\d+\.\d+\.\d+$)
-
parameters: Tipus: object Propietats:
- global:
Tipus: object
Propietats:
- env_to_test: string, valors permesos(s’especifiquen amb la propietat enum): Desenvolupament, Preproduccio, Produccio
- jira_project_key: string
- jira_issue_key: string
Requerit: env_to_test
- functional, regression, api: Cadascun és un objecte amb els seus propis paràmetres requerits (per exemple, url_app per a functional i regression, app_name per a api)
- global:
Tipus: object
Propietats:
Requerit: global, functional
-
elements: Tipus: array Cada element:
- name: string
- version: string (SemVer)
- repository: string (format URI)
Mínim 1 element
-
tests: Tipus: array Cada test:
- name: string
- type: string, valors permesos(s’especifiquen amb la propietat enum): functional, regression, performance, api
- url: string (format URI)
- branch: string
Ha de contenir almenys un test de tipus functional
-
Requerit en release-file:
- version, parameters, elements, tests
Requerit en arrel:
- release-file
Processament del fitxer d’orquestració (“release.yml”)
El action processa l’arxiu release.yml
per a obtenir els parametros necessaris de cada test. Es realitza una validació per a comprovar que tots els components definits en el bloc elements han estat desplegats prèviament.
Es valida l’existència de tags en els repositoris dels components definits en el bloc elements del release.yml. Aquests tags signifiquen que els components han estat desplegats correctament en els entorns corresponents en cada procés de CD del component. Si algun tag requerit no existeix, cosa que significa que el component en concret no ha estat desplegat en PREPRODUCCIÓ, i no està sent desplegat en el workflow en curs, es deshabilita la integració amb el MAT per al workflow, per la qual cosa s’ometen tots els passos relacionats amb el MAT encara que estiguin definits en el orquestrador.
També es defineixen els parametros necessaris per a cada test com a variables d’entorn en format JSON, recol·lectant la informació dels tests definits en el fitxer del orquestrador en conjunció als paràmetres específics de cada test, amb noms com FUNCTIONAL_TESTS_PARAMS, REGRESSION_TESTS_PARAMS, etc., perquè puguin ser usats en els següents steps del workflow. Neteja Copia el text