Añadir una github action para ejecutar los tests unitarios
Para añadir un GitHub Action que ejecute los tests unitarios en el repositorio de un plugin de FacturaScripts, sigue estos pasos:
✅ 1. Asegúrate de tener tests en el plugin
Comprueba que tengas archivos de tests en la carpeta Test de tu plugin. Si no tienes aún los tests preparados, puedes crear uno rápidamente con fsmaker:
fsmaker test
📝 2. Crea el workflow de GitHub Action
Dentro del repositorio, crea este archivo:
.github/workflows/tests.yml
Con el siguiente contenido básico adaptado para tu plugin. Reemplaza el nombre del plugin Informes
por el de tu plugin.
name: Tests del Plugin FacturaScripts
on:
push:
branches: [ master, main ]
pull_request:
branches: [ master, main ]
jobs:
tests:
name: Tests en ${{ matrix.database }} con PHP ${{ matrix.php-version }}
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
php-version: ['8.0', '8.1']
database: ['mysql', 'postgresql']
env:
NOMBRE_PLUGIN: "Informes"
services:
mysql:
image: mariadb:11
ports:
- 3306:3306
env:
MARIADB_ROOT_PASSWORD: toor
MARIADB_DATABASE: facturascripts_tests
options: >-
--health-cmd="mariadb-admin ping"
--health-interval=10s
--health-timeout=5s
--health-retries=3
postgres:
image: postgres:13
ports:
- 5432:5432
env:
POSTGRES_PASSWORD: toor
POSTGRES_DB: facturascripts_tests
options: >-
--health-cmd=pg_isready
--health-interval=10s
--health-timeout=5s
--health-retries=5
steps:
- name: Instalar PHP y extensiones
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php-version }}
extensions: json, fileinfo, simplexml, zip, dom, pdo, pdo_mysql, mysql, mysqli, pgsql, pdo_pgsql, bcmath, gd, curl, soap
tools: composer
coverage: none
- name: Clonar FacturaScripts
uses: actions/checkout@v4
with:
fetch-depth: 0
repository: 'NeoRazorX/facturascripts'
- name: Clonar Plugin ${{ env.NOMBRE_PLUGIN }}
uses: actions/checkout@v4
with:
fetch-depth: 0
path: Plugins/${{ env.NOMBRE_PLUGIN }}
- name: Cache de dependencias de Composer
uses: actions/cache@v3
with:
path: ~/.composer/cache/files
key: composer-${{ runner.os }}-${{ matrix.php-version }}-${{ hashFiles('**/composer.lock') }}
restore-keys: |
composer-${{ runner.os }}-${{ matrix.php-version }}-
composer-${{ runner.os }}-
- name: Instalar dependencias de FacturaScripts
run: |
mkdir -p MyFiles
touch MyFiles/plugins.json
composer install --prefer-dist --no-interaction --no-progress --optimize-autoloader
- name: Crear archivo de configuración
run: |
cat > config.php << 'EOF'
<?php
define('FS_COOKIES_EXPIRE', 604800);
define('FS_LANG', 'es_ES');
define('FS_TIMEZONE', 'Europe/Madrid');
define('FS_ROUTE', '');
${{ matrix.database == 'mysql' && format('
define(''FS_DB_TYPE'', ''mysql'');
define(''FS_DB_HOST'', ''127.0.0.1'');
define(''FS_DB_PORT'', ''3306'');
define(''FS_DB_USER'', ''root'');
') || format('
define(''FS_DB_TYPE'', ''postgresql'');
define(''FS_DB_HOST'', ''localhost'');
define(''FS_DB_PORT'', ''5432'');
define(''FS_DB_USER'', ''postgres'');
') }}
define('FS_DB_NAME', 'facturascripts_tests');
define('FS_DB_PASS', 'toor');
define('FS_DB_FOREIGN_KEYS', true);
define('FS_DB_TYPE_CHECK', true);
define('FS_MYSQL_CHARSET', 'utf8');
define('FS_MYSQL_COLLATE', 'utf8_bin');
define('FS_HIDDEN_PLUGINS', '');
define('FS_DEBUG', false);
define('FS_DISABLE_ADD_PLUGINS', false);
define('FS_DISABLE_RM_PLUGINS', false);
define('FS_NF0', 2);
EOF
- name: Copiar archivos de tests del Plugin
run: |
if [ -d "Plugins/${{ env.NOMBRE_PLUGIN }}/Test/main" ]; then
cp -r Plugins/${{ env.NOMBRE_PLUGIN }}/Test/main Test/Plugins
else
echo "No se encontraron tests para el plugin"
exit 1
fi
- name: Instalar dependencias del Plugin ${{ env.NOMBRE_PLUGIN }}
run: |
if [ -f "Plugins/${{ env.NOMBRE_PLUGIN }}/composer.json" ]; then
cd Plugins/${{ env.NOMBRE_PLUGIN }}
composer install --prefer-dist --no-interaction --no-progress --optimize-autoloader
else
echo "El plugin no tiene dependencias de Composer"
fi
- name: Instalar el Plugin ${{ env.NOMBRE_PLUGIN }}
run: php Test/install-plugins.php
- name: Ejecutar tests en ${{ matrix.database }}
run: vendor/bin/phpunit -c phpunit-plugins.xml --verbose
- name: Mostrar logs en caso de fallo
if: failure()
run: |
echo "=== Logs de la base de datos ==="
if [ "${{ matrix.database }}" = "mysql" ]; then
docker logs $(docker ps -q --filter ancestor=mariadb:11) || true
else
docker logs $(docker ps -q --filter ancestor=postgres:13) || true
fi
☑️ Revisa la pestaña actions
En la pestaña actions del repositorio en github podrás ver cómo se ejecutan los tests. Cada vez que añadas un commit o un pull-request al repositorio, se ejecutarán automáticamente los tests unitarios. Y si fallan, recibirás un email.