Upload
yannick-warnier
View
306
Download
0
Embed Size (px)
Citation preview
Behat, Travis & Scrutinizer
Calidad en PHPcon el proyecto Chamilo
Yannick Warnier@ywarnier
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/
Herramientas
Dispositivos móviles
Gestión de competencias, insignias, evaluaciones de desempeño, ...
Para mejorar la calidad de Chamilo, necesitamos…
- pruebas- sistema de build automático- sistema de análisis de código
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/
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
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/
Behat vs PHPUnit
public function testLs(){ mkdir('/tmp/test'); touch('/tmp/test/foo'); $ls = @exec('ls /tmp/test'); $this assertContains($ls, 'foo');→}
Behat vs PHPUnit
Mink (compañero web)
Behat.yml
default: extensions: Behat\MinkExtension\Extension: base_url: http://my.chamilo110.net goutte: ~ selenium2: ~
paths: features: features bootstrap: %behat.paths.features\ %/bootstrap
Estructura Behat
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
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;
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"')
);
}
Resultados
Resultados
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
.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
...
.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…
.travis.yml (3/3)script:
cd tests && ../vendor/behat/behat/bin/behat v
notifications:
irc: "irc.freenode.org#chamilodev"
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
Travis-CI: Resultados
Travis-CI: Resultados
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
.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
.scrutinizer.yml (2/2)filter:
excluded_paths:
tests/*
app/cache/*
app/logs/*
web/*
vendor/*
checks:
php:
code_rating: true
duplication: true
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%)
Scrutinizer: resultados
Nota para la sección “Code”
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)
Scrutinizer: resultadosSe muestran los cambios de “issues” a cada commit (o PR) en Github
Scrutinizer: resultados
Basada en estándares de calidad, esta clasificación es laque establece el score global (inicia con los peores scripts)
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
Scrutinizer: resultados