![Page 1: Calidad de código en Chamilo: Behat, Travis-CI y Scrutinizer-CI](https://reader031.vdocuments.pub/reader031/viewer/2022021816/58a0ca5b1a28ab6d018b5d23/html5/thumbnails/1.jpg)
Behat, Travis & Scrutinizer
Calidad en PHPcon el proyecto Chamilo
Yannick Warnier@ywarnier
![Page 2: Calidad de código en Chamilo: Behat, Travis-CI y Scrutinizer-CI](https://reader031.vdocuments.pub/reader031/viewer/2022021816/58a0ca5b1a28ab6d018b5d23/html5/thumbnails/2.jpg)
Caso Chamilo
● Sistema de gestión del aprendizaje (LMS)
● Claroline→Dokeos→Chamilo / Moodle / Canvas
● Código abierto
● https://github.com/chamilo
● https://github.com/chamilo/chamilo-lms/
![Page 3: Calidad de código en Chamilo: Behat, Travis-CI y Scrutinizer-CI](https://reader031.vdocuments.pub/reader031/viewer/2022021816/58a0ca5b1a28ab6d018b5d23/html5/thumbnails/3.jpg)
Herramientas
Dispositivos móviles
![Page 4: Calidad de código en Chamilo: Behat, Travis-CI y Scrutinizer-CI](https://reader031.vdocuments.pub/reader031/viewer/2022021816/58a0ca5b1a28ab6d018b5d23/html5/thumbnails/4.jpg)
Gestión de competencias, insignias, evaluaciones de desempeño, ...
![Page 5: Calidad de código en Chamilo: Behat, Travis-CI y Scrutinizer-CI](https://reader031.vdocuments.pub/reader031/viewer/2022021816/58a0ca5b1a28ab6d018b5d23/html5/thumbnails/5.jpg)
![Page 6: Calidad de código en Chamilo: Behat, Travis-CI y Scrutinizer-CI](https://reader031.vdocuments.pub/reader031/viewer/2022021816/58a0ca5b1a28ab6d018b5d23/html5/thumbnails/6.jpg)
Para mejorar la calidad de Chamilo, necesitamos…
- pruebas- sistema de build automático- sistema de análisis de código
![Page 7: Calidad de código en Chamilo: Behat, Travis-CI y Scrutinizer-CI](https://reader031.vdocuments.pub/reader031/viewer/2022021816/58a0ca5b1a28ab6d018b5d23/html5/thumbnails/7.jpg)
Behat
● Sistema de pruebas
● Behaviour Driven Development
● Formulación en lenguaje “común”
● Software libre
● https://github.com/Behat/Behat
● http://docs.behat.org/en/latest/
![Page 8: Calidad de código en Chamilo: Behat, Travis-CI y Scrutinizer-CI](https://reader031.vdocuments.pub/reader031/viewer/2022021816/58a0ca5b1a28ab6d018b5d23/html5/thumbnails/8.jpg)
Travis-CI
● Portal de servicios de integración continua
● Travis/Jenkins←Hudson
● Código abierto (parcialmente)
● https://github.com/travis-ci
● https://docs.travis-ci.com/user/for-beginners
![Page 9: Calidad de código en Chamilo: Behat, Travis-CI y Scrutinizer-CI](https://reader031.vdocuments.pub/reader031/viewer/2022021816/58a0ca5b1a28ab6d018b5d23/html5/thumbnails/9.jpg)
Scrutinizer-CI
● Portal de análisis de código
● Clover/phploc/phpmd/… → Scrutinizer
● Código abierto (parcialmente)
● https://github.com/scrutinizer-ci
● https://scrutinizer-ci.com/docs/
![Page 10: Calidad de código en Chamilo: Behat, Travis-CI y Scrutinizer-CI](https://reader031.vdocuments.pub/reader031/viewer/2022021816/58a0ca5b1a28ab6d018b5d23/html5/thumbnails/10.jpg)
Behat vs PHPUnit
public function testLs(){ mkdir('/tmp/test'); touch('/tmp/test/foo'); $ls = @exec('ls /tmp/test'); $this assertContains($ls, 'foo');→}
![Page 11: Calidad de código en Chamilo: Behat, Travis-CI y Scrutinizer-CI](https://reader031.vdocuments.pub/reader031/viewer/2022021816/58a0ca5b1a28ab6d018b5d23/html5/thumbnails/11.jpg)
Behat vs PHPUnit
![Page 12: Calidad de código en Chamilo: Behat, Travis-CI y Scrutinizer-CI](https://reader031.vdocuments.pub/reader031/viewer/2022021816/58a0ca5b1a28ab6d018b5d23/html5/thumbnails/12.jpg)
Mink (compañero web)
![Page 13: Calidad de código en Chamilo: Behat, Travis-CI y Scrutinizer-CI](https://reader031.vdocuments.pub/reader031/viewer/2022021816/58a0ca5b1a28ab6d018b5d23/html5/thumbnails/13.jpg)
Behat.yml
default: extensions: Behat\MinkExtension\Extension: base_url: http://my.chamilo110.net goutte: ~ selenium2: ~
paths: features: features bootstrap: %behat.paths.features\ %/bootstrap
![Page 14: Calidad de código en Chamilo: Behat, Travis-CI y Scrutinizer-CI](https://reader031.vdocuments.pub/reader031/viewer/2022021816/58a0ca5b1a28ab6d018b5d23/html5/thumbnails/14.jpg)
Estructura Behat
![Page 15: Calidad de código en Chamilo: Behat, Travis-CI y Scrutinizer-CI](https://reader031.vdocuments.pub/reader031/viewer/2022021816/58a0ca5b1a28ab6d018b5d23/html5/thumbnails/15.jpg)
Archivo de prueba# features/login.feature
@common
Feature: User login
In order to log in
As any registered user
I need to be able to enter my details in the form and get in
Scenario: Login as admin user successfully
Given I am a platform administrator
Then I should not see an ".alertdanger" element
Scenario: Login as student user successfully
![Page 16: Calidad de código en Chamilo: Behat, Travis-CI y Scrutinizer-CI](https://reader031.vdocuments.pub/reader031/viewer/2022021816/58a0ca5b1a28ab6d018b5d23/html5/thumbnails/16.jpg)
FeatureContext.php<?php
use Behat\Behat\Context\ClosuredContextInterface,
Behat\Behat\Context\TranslatedContextInterface,
Behat\Behat\Context\BehatContext,
Behat\Behat\Context\Step,
Behat\Behat\Context\Step\Given,
Behat\Behat\Exception\PendingException,
Behat\Behat\Event\SuiteEvent;
use Behat\Gherkin\Node\PyStringNode,
Behat\Gherkin\Node\TableNode;
use Behat\MinkExtension\Context\MinkContext;
![Page 17: Calidad de código en Chamilo: Behat, Travis-CI y Scrutinizer-CI](https://reader031.vdocuments.pub/reader031/viewer/2022021816/58a0ca5b1a28ab6d018b5d23/html5/thumbnails/17.jpg)
FeatureContext.phpclass FeatureContext extends MinkContext
{
public function __construct(array $parameters) { //… }
/**
* @Given /^I am a platform administrator$/
*/
public function iAmAPlatformAdministrator()
{
return array(
new Given('I am on "/index.php?logout=logout"'),
new Given('I am on homepage'),
new Given('I fill in "login" with "admin"'),
new Given('I fill in "password" with "admin"'),
new Given('I press "submitAuth"')
);
}
![Page 18: Calidad de código en Chamilo: Behat, Travis-CI y Scrutinizer-CI](https://reader031.vdocuments.pub/reader031/viewer/2022021816/58a0ca5b1a28ab6d018b5d23/html5/thumbnails/18.jpg)
Resultados
![Page 19: Calidad de código en Chamilo: Behat, Travis-CI y Scrutinizer-CI](https://reader031.vdocuments.pub/reader031/viewer/2022021816/58a0ca5b1a28ab6d018b5d23/html5/thumbnails/19.jpg)
Resultados
![Page 20: Calidad de código en Chamilo: Behat, Travis-CI y Scrutinizer-CI](https://reader031.vdocuments.pub/reader031/viewer/2022021816/58a0ca5b1a28ab6d018b5d23/html5/thumbnails/20.jpg)
Travis-CI
● ¿Tienes tu proyecto en Github?
● Usa tu cuenta Github para abrir cuenta travis-ci.org
● Carga tus repos
● Define un .travis.yml en tu proyecto
![Page 21: Calidad de código en Chamilo: Behat, Travis-CI y Scrutinizer-CI](https://reader031.vdocuments.pub/reader031/viewer/2022021816/58a0ca5b1a28ab6d018b5d23/html5/thumbnails/21.jpg)
.travis.yml (1/3)language: php
php:
5.5
5.6
7.0
before_install:
sudo aptget update qq
sudo aptget install qq mysqlserver
sudo aptget install qq apache2 libapache2modfastcgi
sudo cp ~/.phpenv/versions/$(phpenv versionname)/etc/phpfpm.conf.default ~/.phpenv/versions/$(phpenv versionname)/etc/phpfpm.conf
sudo a2enmod rewrite actions fastcgi alias
echo "cgi.fix_pathinfo = 1" >> ~/.phpenv/versions/$(phpenv versionname)/etc/php.ini
echo "memory_limit = 2G" >> ~/.phpenv/versions/$(phpenv versionname)/etc/php.ini
echo "phar.readonly = 0" >> ~/.phpenv/versions/$(phpenv versionname)/etc/php.ini
echo "date.timezone = Europe/Paris" >> ~/.phpenv/versions/$(phpenv versionname)/etc/php.ini
...
![Page 22: Calidad de código en Chamilo: Behat, Travis-CI y Scrutinizer-CI](https://reader031.vdocuments.pub/reader031/viewer/2022021816/58a0ca5b1a28ab6d018b5d23/html5/thumbnails/22.jpg)
.travis.yml (2/3)
before_script:
composer update
phpenv configadd tests/travisphpconfig.ini
php v
cd /home/travis/build/chamilo/chamilolms
...comando de instalación…
![Page 23: Calidad de código en Chamilo: Behat, Travis-CI y Scrutinizer-CI](https://reader031.vdocuments.pub/reader031/viewer/2022021816/58a0ca5b1a28ab6d018b5d23/html5/thumbnails/23.jpg)
.travis.yml (3/3)script:
cd tests && ../vendor/behat/behat/bin/behat v
notifications:
irc: "irc.freenode.org#chamilodev"
![Page 24: Calidad de código en Chamilo: Behat, Travis-CI y Scrutinizer-CI](https://reader031.vdocuments.pub/reader031/viewer/2022021816/58a0ca5b1a28ab6d018b5d23/html5/thumbnails/24.jpg)
Travis-CI● PHP-CLI = 5.3 por defecto
● Doctrine depende de >=5.4!
– Para evitarlo, agregar, en “before_install”:– sudo cp ~/.phpenv/versions/$(phpenv versionname)/etc/phpfpm.conf.default
~/.phpenv/versions/$(phpenv versionname)/etc/phpfpm.conf
![Page 25: Calidad de código en Chamilo: Behat, Travis-CI y Scrutinizer-CI](https://reader031.vdocuments.pub/reader031/viewer/2022021816/58a0ca5b1a28ab6d018b5d23/html5/thumbnails/25.jpg)
Travis-CI: Resultados
![Page 26: Calidad de código en Chamilo: Behat, Travis-CI y Scrutinizer-CI](https://reader031.vdocuments.pub/reader031/viewer/2022021816/58a0ca5b1a28ab6d018b5d23/html5/thumbnails/26.jpg)
Travis-CI: Resultados
![Page 27: Calidad de código en Chamilo: Behat, Travis-CI y Scrutinizer-CI](https://reader031.vdocuments.pub/reader031/viewer/2022021816/58a0ca5b1a28ab6d018b5d23/html5/thumbnails/27.jpg)
Scrutinizer-CI
● ¿Tienes tu proyecto en Github?
● Usa tu cuenta Github en scrutinizer-ci.org
● Carga tus repos
● Define un .scrutinizer.yml en tu proyecto
![Page 28: Calidad de código en Chamilo: Behat, Travis-CI y Scrutinizer-CI](https://reader031.vdocuments.pub/reader031/viewer/2022021816/58a0ca5b1a28ab6d018b5d23/html5/thumbnails/28.jpg)
.scrutinizer.yml (1/2)build:
environment:
mysql: 5.5
php:
version: 5.6.0
ini:
'date.timezone': 'US/Pacific'
'phar.readonly': false
hosts:
my.chamilo110.net: '127.0.0.1'
dependencies:
override:
true
before:
php d memory_limit=2G /usr/bin/composer.phar v update
![Page 29: Calidad de código en Chamilo: Behat, Travis-CI y Scrutinizer-CI](https://reader031.vdocuments.pub/reader031/viewer/2022021816/58a0ca5b1a28ab6d018b5d23/html5/thumbnails/29.jpg)
.scrutinizer.yml (2/2)filter:
excluded_paths:
tests/*
app/cache/*
app/logs/*
web/*
vendor/*
checks:
php:
code_rating: true
duplication: true
![Page 30: Calidad de código en Chamilo: Behat, Travis-CI y Scrutinizer-CI](https://reader031.vdocuments.pub/reader031/viewer/2022021816/58a0ca5b1a28ab6d018b5d23/html5/thumbnails/30.jpg)
Scrutinizer: método● “Mejores prácticas”
● ISO-25010?
– International Standard for Software Product Quality
● No siempre corresponde a PSR
● Score: solo cuenta la parte “Code”, y no “Issues”
● Chamilo
– 6.3M líneas totales
– 4.9M es código (78%)
![Page 31: Calidad de código en Chamilo: Behat, Travis-CI y Scrutinizer-CI](https://reader031.vdocuments.pub/reader031/viewer/2022021816/58a0ca5b1a28ab6d018b5d23/html5/thumbnails/31.jpg)
Scrutinizer: resultados
Nota para la sección “Code”
![Page 32: Calidad de código en Chamilo: Behat, Travis-CI y Scrutinizer-CI](https://reader031.vdocuments.pub/reader031/viewer/2022021816/58a0ca5b1a28ab6d018b5d23/html5/thumbnails/32.jpg)
Scrutinizer: resultados
Evolución de la calidad del código(tendencia en baja por inclusión de más código de baja calidad)
Cantidad de “Issues” en baja de 4200 a 2200 durante el mismo periodo (calidad y issues son dos indicadores distintos)
![Page 33: Calidad de código en Chamilo: Behat, Travis-CI y Scrutinizer-CI](https://reader031.vdocuments.pub/reader031/viewer/2022021816/58a0ca5b1a28ab6d018b5d23/html5/thumbnails/33.jpg)
Scrutinizer: resultadosSe muestran los cambios de “issues” a cada commit (o PR) en Github
![Page 34: Calidad de código en Chamilo: Behat, Travis-CI y Scrutinizer-CI](https://reader031.vdocuments.pub/reader031/viewer/2022021816/58a0ca5b1a28ab6d018b5d23/html5/thumbnails/34.jpg)
Scrutinizer: resultados
Basada en estándares de calidad, esta clasificación es laque establece el score global (inicia con los peores scripts)
![Page 35: Calidad de código en Chamilo: Behat, Travis-CI y Scrutinizer-CI](https://reader031.vdocuments.pub/reader031/viewer/2022021816/58a0ca5b1a28ab6d018b5d23/html5/thumbnails/35.jpg)
Scrutinizer: resultadosLos “issues” se agrupan por categoría y gravedad.Un “bug” en este caso puede ser el envío de un parámetro enteroA una función que define (en PHPDoc) que tiene que ser de otro tipo
![Page 36: Calidad de código en Chamilo: Behat, Travis-CI y Scrutinizer-CI](https://reader031.vdocuments.pub/reader031/viewer/2022021816/58a0ca5b1a28ab6d018b5d23/html5/thumbnails/36.jpg)
Scrutinizer: resultados