¿Cómo verificar la duplicación de código en la extensión magento 2?

15

He creado un módulo en Magento 2 y ahora estoy tratando de enviarlo en Magento Marketplace. Mi extensión ha pasado de la revisión comercial y la revisión técnica, pero tengo problemas con la revisión de control de calidad.

Recibí un correo del mercado de Magento que decía que tenía duplicación de código en mi extensión. A continuación se muestra la muestra del correo.

Problemas de calidad del código: CPD: esta extensión contiene código duplicado.

Cuando fui a mi producto en la cuenta de Marketplace y revisé el informe técnico, lo encontré a continuación.

Duplicados de código detectados

Esta extensión contiene código que se copia directamente de la base de código de Magento. Esto constituye una violación directa de las Secciones 3.1 y 9.1b del Acuerdo de desarrollador de Magento.

File: vendor/module/vendor-module-1.0.0.0/Block/Adminhtml/Module/Edit/Tab/Stores.php
Line: 58
File: magento/module-checkout-agreements/magento-module-checkout-agreements-100.0.6.0/Block/Adminhtml/Agreement/Edit/Form.php
Line: 122

File: magento/module-cms/magento-module-cms-100.0.7.0/Block/Adminhtml/Block/Edit/Form.php
Line: 100
File: vendor/module/vendor-module-1.0.0.0/Block/Adminhtml/Module/Renderer/Files.php
Line: 49

File: magento/framework/magento-framework-100.0.16.0/Data/Form/Element/Image.php
Line: 86
File: vendor/module/vendor-module-1.0.0.0/Model/ResourceModel/AbstractCollection.php
Line: 2
File: magento/module-cms/magento-module-cms-100.0.7.0/Model/ResourceModel/AbstractCollection.php
Line: 6

¿Hay alguna forma de verificar la duplicación de código en mi configuración para evitar este problema en mis otras extensiones?

Sagar Dobariya
fuente

Respuestas:

6

Carpeta de instalación de Magento 2

Paso-1 para verificación con extensión de código

/dev/tests/static/testsuite/Magento/Test/Php/_files/phpcpd/blacklist
rename common.txt--

Paso-2 ejecutar debajo del comando

php bin/magento dev:tests:run static

Paso -3 ver código de duplicación

dev/tests/static/report
phpcpd_report.xml

Revisa ahora phpcpd_report.xml

Nikhil Vaghela
fuente
1
Hola nikhil, ¿podrías explicarme en detalle
Sagar Dobariya
6

Aquí hay una descripción del comando Magento 2 utilizado para verificar la duplicación de código.

El comando para verificar la duplicación de código / copiar y pegar está debajo.

php bin/magento dev:tests:run static

Este comando primero irá a la dev/tests/staticcarpeta. Aquí puede ver el archivo de declaración phpunit.xml.dist para este conjunto de pruebas.

<testsuites>
    <testsuite name="Less Static Code Analysis">
        <file>testsuite/Magento/Test/Less/LiveCodeTest.php</file>
    </testsuite>
    <testsuite name="Javascript Static Code Analysis">
        <file>testsuite/Magento/Test/Js/LiveCodeTest.php</file>
    </testsuite>
    <testsuite name="PHP Coding Standard Verification">
        <file>testsuite/Magento/Test/Php/LiveCodeTest.php</file>
    </testsuite>
    <testsuite name="Code Integrity Tests">
        <directory>testsuite/Magento/Test/Integrity</directory>
    </testsuite>
    <testsuite name="Xss Unsafe Output Test">
        <file>testsuite/Magento/Test/Php/XssPhtmlTemplateTest.php</file>
    </testsuite>
</testsuites>

En este archivo, encontrará el código anterior que definirá qué archivo ejecutar para diferentes pruebas de código.

Para reducir, puede ver PHP Coding Standard Verification testsuiteEsto ejecutará el archivo testsuite / Magento / Test / Php / LiveCodeTest.php

Cuando abra este archivo, encontrará diferentes funciones para verificar los diferentes tipos de problemas de código. La función que se ejecutará estestCopyPaste

public function testCopyPaste()
{
    $reportFile = self::$reportDir . '/phpcpd_report.xml';
    $copyPasteDetector = new CopyPasteDetector($reportFile);

    if (!$copyPasteDetector->canRun()) {
        $this->markTestSkipped('PHP Copy/Paste Detector is not available.');
    }

    $blackList = [];
    foreach (glob(__DIR__ . '/_files/phpcpd/blacklist/*.txt') as $list) {
        $blackList = array_merge($blackList, file($list, FILE_IGNORE_NEW_LINES));
    }

    $copyPasteDetector->setBlackList($blackList);

    $result = $copyPasteDetector->run([BP]);

    $output = "";
    if (file_exists($reportFile)) {
        $output = file_get_contents($reportFile);
    }

    $this->assertTrue(
        $result,
        "PHP Copy/Paste Detector has found error(s):" . PHP_EOL . $output
    );
}

Aquí, encontrará un código que se utilizará para poner en la lista negra cualquier archivo / carpeta de esta verificación de código.

foreach (glob(__DIR__ . '/_files/phpcpd/blacklist/*.txt') as $list) {
    $blackList = array_merge($blackList, file($list, FILE_IGNORE_NEW_LINES));
}

Esta foreachfunción verificará cualquier .txtarchivo agregado en dev / tests / static / testsuite / Magento / Test / Php / _files / phpcpd / blacklist location. Leerá el archivo e ignorará todas las carpetas para excluirlas del proceso de detección de código de copiar y pegar.

Después de agregar todos los archivos / carpetas de la lista negra al código, se ejecutará debajo del código.

$result = $copyPasteDetector->run([BP]);

Este código ejecutará la runfunción del archivo dev / tests / static / framework / Magento / TestFramework / CodingStandard / Tool / CopyPasteDetector.php .

public function run(array $whiteList)
{
    $blackListStr = ' ';
    foreach ($this->blacklist as $file) {
        $file = escapeshellarg(trim($file));
        if (!$file) {
            continue;
        }
        $blackListStr .= '--exclude ' . $file . ' ';
    }

    $vendorDir = require BP . '/app/etc/vendor_path.php';
    $command = 'php ' . BP . '/' . $vendorDir . '/bin/phpcpd' . ' --log-pmd ' . escapeshellarg(
            $this->reportFile
        ) . ' --names-exclude "*Test.php" --min-lines 13' . $blackListStr . ' ' . implode(' ', $whiteList);

    exec($command, $output, $exitCode);

    return !(bool)$exitCode;
}

Aquí, el código agrega todas las blacklistedcarpetas / archivos en la --excludelista.

Después de eso se ejecutará el vendor/bin/phpcpdcomando.

Aquí en el comando en sí Magento tiene

excluyó todos los Testarchivos por código

--names-exclude "*Test.php" 

También se ha omitido todos los duplicados de código que tienen menos de 13 líneas por código

--min-lines 13

La salida para la ejecución de este comando se agregará al archivo definido en la testCopyPastefunción. El nombre de archivo para la detección de copiar y pegar es phpcpd_report.xml ubicado en la ubicación dev / tests / static / report .

Después de la ejecución exitosa del comando, la salida se agregará a los archivos de informes.

Jaimin Sutariya
fuente
¿Puede sugerir alguna solución a esta pregunta de duplicación de código? Magento.stackexchange.com/q/191829/20064
Piyush
Hola @nikhil, ¿puedes decirme qué línea indica el error como "Esta extensión contiene código duplicado"? en phpcpd_report.xml
Emipro Technologies Pvt. Ltd.