bagaimana cara memeriksa duplikasi kode di Magento 2 Extension?

15

Saya telah membuat modul di Magento 2 dan sekarang saya mencoba mengirimkannya di Magento Marketplace. Ekstensi saya telah lulus dari ulasan bisnis dan ulasan teknis tetapi saya menghadapi masalah dengan ulasan QA.

Saya menerima email dari Magento marketplace yang menyatakan bahwa saya memiliki duplikasi kode dalam ekstensi saya. Di bawah ini adalah contoh surat.

Masalah kualitas kode: CPD: Ekstensi ini berisi kode duplikat.

Ketika saya pergi ke produk saya di akun Marketplace, dan memeriksa laporan teknis, saya temukan di bawah.

Duplikat Kode Terdeteksi

Ekstensi ini berisi kode yang disalin langsung dari basis kode Magento. Ini merupakan pelanggaran langsung terhadap Bagian 3.1 dan 9.1b dari Perjanjian Pengembang 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

Apakah ada cara saya dapat memeriksa duplikasi kode pada pengaturan saya untuk menghindari masalah ini untuk ekstensi saya yang lain?

Sagar Dobariya
sumber

Jawaban:

6

Folder pengaturan Magento 2

Langkah-1 untuk memeriksa dengan ekstensi kode

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

Langkah-2 jalankan perintah di bawah ini

php bin/magento dev:tests:run static

Langkah -3 lihat kode duplikasi

dev/tests/static/report
phpcpd_report.xml

Sekarang periksa phpcpd_report.xml

Nikhil Vaghela
sumber
1
Halo nikhil, bisa tolong jelaskan secara rinci
Sagar Dobariya
6

Berikut adalah beberapa deskripsi untuk perintah Magento 2 yang digunakan untuk memeriksa duplikasi kode.

Perintah untuk memeriksa duplikasi / copy-paste kode di bawah ini.

php bin/magento dev:tests:run static

Perintah ini pertama-tama akan masuk ke dev/tests/staticfolder. Di sini Anda dapat melihat file deklarasi phpunit.xml.dist untuk suite tes ini.

<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>

Dalam file ini, Anda akan menemukan kode di atas yang akan menentukan file mana yang akan dieksekusi untuk tes kode yang berbeda.

Untuk mempersempit Anda dapat melihat PHP Coding Standard Verification testsuiteIni akan menjalankan file testsuite / Magento / Test / Php / LiveCodeTest.php

Ketika Anda membuka file ini, Anda akan menemukan berbagai fungsi untuk memeriksa berbagai jenis masalah kode. Fungsi yang akan dieksekusi adalahtestCopyPaste

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
    );
}

Di sini, Anda akan menemukan kode yang akan digunakan untuk daftar hitam file / folder dari pemeriksaan kode ini.

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

foreachFungsi ini akan memeriksa semua .txtfile yang ditambahkan di dev / test / static / testuite / Magento / Test / Php / _files / phpcpd / lokasi daftar hitam . Ini akan membaca file dan akan mengabaikan semua folder untuk dikecualikan dari proses deteksi kode copy paste.

Setelah menambahkan semua file / folder daftar hitam ke kode, itu akan berjalan di bawah kode.

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

Kode ini akan menjalankan runfungsi dev / test / static / framework / Magento / TestFramework / CodingStandard / Tool / CopyPasteDetector.php file.

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;
}

Di sini, kode menambahkan semua blacklistedfolder / file dalam --excludedaftar.

Setelah itu akan menjalankan vendor/bin/phpcpdperintah.

Di sini, di perintah itu sendiri Magento miliki

mengecualikan semua Testfile dengan kode

--names-exclude "*Test.php" 

Itu juga melewatkan semua duplikat kode yang kurang dari 13 baris dengan kode

--min-lines 13

Output untuk eksekusi perintah ini akan ditambahkan ke file yang didefinisikan dalam testCopyPastefungsi. Nama file untuk deteksi salin-rekat adalah phpcpd_report.xml yang terletak di lokasi dev / tests / static / report .

Setelah eksekusi berhasil dari perintah, output akan ditambahkan ke file laporan.

Jaimin Sutariya
sumber
Bisakah Anda menyarankan solusi untuk masalah duplikasi kode ini - magento.stackexchange.com/q/191829/20064
Piyush
Halo @nikhil bisa tolong katakan padaku baris mana yang menunjukkan kesalahan seperti "Ekstensi ini mengandung kode duplikat." di phpcpd_report.xml
Emipro Technologies Pvt. Ltd.