Вот некоторое описание команды Magento 2, используемой для проверки дублирования кода.
Команда для проверки дублирования кода / копирования-вставки приведена ниже.
php bin/magento dev:tests:run static
Эта команда сначала перейдет в dev/tests/static
папку. Здесь вы можете увидеть файл объявления phpunit.xml.dist для этого набора тестов.
<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>
В этом файле вы найдете приведенный выше код, который определит, какой файл выполнять для различных тестов кода.
Чтобы сузить, вы можете увидеть PHP Coding Standard Verification
testsuite
Это будет выполнять файл testsuite / Magento / Test / Php / LiveCodeTest.php
Когда вы откроете этот файл, вы найдете разные функции для проверки на наличие различных типов проблем с кодом. Функция, которая будет выполненаtestCopyPaste
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
);
}
Здесь вы найдете код, который будет использоваться для внесения в черный список любых файлов / папок из этой проверки кода.
foreach (glob(__DIR__ . '/_files/phpcpd/blacklist/*.txt') as $list) {
$blackList = array_merge($blackList, file($list, FILE_IGNORE_NEW_LINES));
}
Эта foreach
функция будет проверять наличие любого .txt
файла, добавленного в папку dev / tests / static / testsuite / Magento / Test / Php / _files / phpcpd / blacklist . Он прочтет файл и проигнорирует все папки, которые будут исключены из процесса обнаружения кода копирования-вставки.
После добавления всех файлов / папок черного списка в код он будет запущен под кодом.
$result = $copyPasteDetector->run([BP]);
Этот код будет выполнять run
функцию файла 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;
}
Здесь код добавляет все blacklisted
папки / файлы в --exclude
список.
После этого он запустит vendor/bin/phpcpd
команду.
Вот в самой команде Magento есть
исключил все
Test
файлы по коду
--names-exclude "*Test.php"
Это также пропустило все дубликаты кода, которые меньше чем 13 строк кода
--min-lines 13
Выходные данные для выполнения этой команды будут добавлены в файл, определенный в testCopyPaste
функции. Имя файла для обнаружения копирования-вставки: phpcpd_report.xml, расположенный в папке dev / tests / static / report location.
После успешного выполнения команды выходные данные будут добавлены в файлы отчетов.