Como configurar e executar alguns tipos de testes para Magento 2
Tags: php, braziliandevs, testing, magento2
Published: 2022-11-14 14:43:16

## PHP Code Sniffer (PHPCS)

O *PHP Code Sniffer* (em uma tradução livre, pode ser algo como: Analisador de Código) é uma ferramenta para detectar violações nos padrões de código. Os padrões de código são formados por uma coleção de regras definidas pelos desenvolvedores, o padrão inicial do PHPCS é o PEAR. O PHPCS pode apontar para as recomendações padrões do PHP (PSRs). É necessário ter o PHPCS e o *Magento Coding Standard* como dependência de desenvolvimento no arquivo `composer.json`.

```json
{
    ...
    "require-dev": {
        ...
        "squizlabs/php_codesniffer": "{version}",
        "magento/magento-coding-standard": "{version}",
        ...
    },
    ...
}
```

Para configurar a primeira vez o *Magento Coding Standard* no PHPCS deve ser executado o seguinte comando:

```bash
vendor/bin/phpcs --config-set installed_paths ../../magento/magento-coding-standard/
```

Para executar os testes deve-se chamar o comando `phpcs` que estará dentro de `./vendor/bin` e referenciar a pasta de destino.

```bash
./vendor/bin/phpcs app/code/{Vendor}/{Module}
./vendor/bin/phpcs vendor/{vendor}/module-{module-name}
```

### ruleset.xml

Caso seja necessário personalizar a execução de testes é possível criar um arquivo `ruleset.xml` (a recomendação é chamá-lo de `phpcs-ruleset.xml` para não entrar em conflito com os outros arquivos `ruleset.xml`) no próprio módulo e configurar para que os testes sejam executados de acordo com a configuração deste arquivo.

A documentação necessária explicando tudo sobre o arquivo `ruleset.xml` está no link [PHP_CodeSniffer Ruleset](https://github.com/squizlabs/PHP_CodeSniffer/wiki/Annotated-Ruleset).

```bash
./vendor/bin/phpcs app/code/{Vendor}/{Module}
./vendor/bin/phpcs vendor/{vendor}/{module}
```

- [PHP CodeSniffer PEAR](https://pear.php.net/package/PHP_CodeSniffer)
- [PHP CodeSniffer Wiki](https://github.com/squizlabs/PHP_CodeSniffer/wiki)

---

## PHP Mess Detector (PHPMD)

O *PHP Mess Detector* (em uma tradução livre, pode ser algo como: Detector de Desordem) é uma ferramenta que analisa o código de uma aplicação em PHP e detecta problemas potenciais e a qualidade. Algumas das inúmeras análises possíveis de serem executadas com o PHP Mess Detector são:

- Localização de possíveis erros;
- Localização de métodos, atributos e argumentos não utilizados;
- Violação de convenções de nomenclatura;
- Problemas potenciais relacionados ao tamanho do código;
- Verifica a complexidade do código.

É necessário ter o PHPMD como dependência de desenvolvimento no arquivo `composer.json`.

```json
{
    ...
    "require-dev": {
        ...
        "phpmd/phpmd": "{version}",
        ...
    },
    ...
}
```

Para executar os testes com o PHPMD, deve-se chamar o comando `phpmd` que estará dentro de `./vendor/bin`, referenciar o arquivo `ruleset.xml` (a recomendação é chamá-lo de `phpmd-ruleset.xml` para não entrar em conflito com os outros arquivos `ruleset.xml`) e a pasta de destino.

```bash
./vendor/bin/phpmd app/code/{Vendor}/{Module} text app/code/{Vendor}/{Module}/phpmd-ruleset.xml
./vendor/bin/phpmd vendor/{vendor}/{module} text vendor/{vendor}/{module}/phpmd-ruleset.xml
```

O PHP Mess Detector possui alguns parâmetros que permitem adicionar filtros ao processo de análise e definir o formato de saída do resultado do teste.

- [PHPMD](https://phpmd.org/)
- [Github PHPMD](https://github.com/phpmd/phpmd)

### ruleset.xml

Caso seja necessário personalizar a execução de testes é possível criar um arquivo ruleset.xml (a recomendação é chamá-lo de phpmd-ruleset.xml para não entrar em conflito com os outros arquivos ruleset.xml) no próprio módulo e configurar para que os testes sejam executados de acordo com a configuração deste arquivo. 

A documentação necessária explicando tudo sobre o arquivo ruleset.xml está no link [PHPMD doc](https://phpmd.org/rules/index.html).

---

## PHP Copy/Paste Detector (PHPCPD)

O *PHP Copy/Paste Detector* (em uma tradução livre, pode ser algo como: Detector de Copia e Cola) é uma ferramenta para checagem de código duplicado nos arquivos em PHP do módulo. É necessário ter o PHPCPD como dependência de desenvolvimento no arquivo `composer.json`.

```json
{
    ...
    "require-dev": {
        ...
        "sebastian/phpcpd": "{version}",
        ...
    },
    ...
}
```

Para executar os testes com o PHPCPD, deve-se chamar o comando `phpcpd` que estará dentro do diretório `./vendor/bin`.

```bash
./vendor/bin/phpcpd ./app/code/{Vendor}/{Module} --exclude=./vendor/e3/$1/Test/ --fuzzy --progress --min-lines=0
./vendor/bin/phpcpd ./vendor/{vendor}/{module} --exclude=./vendor/e3/$1/Test/ --fuzzy --progress --min-lines=0
```

A documentação necessária explicando tudo sobre as opções para a execução do PHPCPD está no link [PHPCPD Manual](https://manpages.ubuntu.com/manpages/xenial/man1/phpcpd.1.html).

---

## PHP Static Analysis (PHPStan)

O *PHP Static Analysis* (em uma tradução livre, pode ser algo como: Análise Estática) é uma ferramenta focada em encontrar erros no código sem executá-las de fato e sem que sejam feitos testes para as classes, a exatidão de cada linha do código pode ser verificada antes de executar a linha real, ou seja, a PHPStan tem a proposta de adaptar a funcionalidade de um compilador para análise estática do código. Algumas das verificações que o PHPStan realiza são:

- Verifica a utilização das chamadas de classes, verificando se o código está realmente sendo utilizado;
- Verifica a acessibilidade dos métodos e funções e a coesão entre os argumentos das chamadas com sua assinatura;
- Verifica a tipagem do retorno dos métodos e funções;
- Verifica a acessibilidade dos atributos e sua tipagem;
- Verifica a existência de variáveis (respeitando o escopo e laços de repetição);
- Verifica comparações estritas e tipagem de variáveis inúteis.

Para utilizar o PHPStan no Magento 2 é necessário uma extensão que permita a análise do código, é recomendável o módulo [PHPStan Inviqa](https://github.com/inviqa/phpstan-magento2). Basta instalar esse módulo através do composer, é necessário ter o PHPStan como dependência de desenvolvimento no arquivo `composer.json`.

```json
{
    ...
    "require-dev": {
        ...
        "phpstan/phpstan": "{version}",
        "inviqa/phpstan-magento2": "{version}",
        ...
    },
    ...
}
```

Para executar os testes com o PHPStan, deve-se chamar o comando `analyse` que estará dentro de `./vendor/bin/phpstan`, referenciar o caminho do arquivo `phpstan.neon` que será utilizado para configuração e a pasta de destino. 

```bash
./vendor/bin/phpstan analyse ./app/code/{Vendor}/{Module} --configuration=phpstan.neon
./vendor/bin/phpstan analyse ./vendor/{vendor}/{module} --configuration=phpstan.neon
```

### phpstan.neon

O PHPStan utiliza o formato de configuração chamado `neon`, que é muito semelhante ao `yml`.

```neon
parameters:
    bootstrap: ../../../../vendor/inviqa/phpstan-magento2/phpstan-bootstrap.php
    level: 5
    paths:
        - ./
    fileExtensions:
        - php
    excludes_analyse:
        - ./etc/*
        - ./Test/*
        - ./test-reports/*
        - ./view/*
    ignoreErrors:
        - '#Call to an undefined method [a-zA-Z0-9\\_]+::(get|set|uns|has)[A-Z]#'
```

Caso seja necessário a customização do arquivo `phpstan.neon` basta consultar a documentação abaixo:

- [PHP Static Analysis Doc](https://phpstan.org/)
- [PHP Static Analysis Github](https://github.com/phpstan/phpstan)