ZF2.4 занимает много времени для запуска phpunit с включенным покрытием кода

У меня проблемы со скоростью покрытия кода.

Я использую ZF2 2.4 с дюжиной модулей, установленных композитором.
Когда я запускаю тесты без покрытия кода, с результатами через 5 минут. В Дженкинсе полная сборка занимает 15 минут.

С включенным покрытием кода вся сборка заняла с 0:00 до 5:30 утра.

Проверяя результаты, я понял, что тесты классов Service / Repository / Controller занимают в среднем 2,10 минуты каждый. Что ужасно

Я чрезвычайно новичок в разработке tdd, могу достичь 100% покрытия кода, система состоит из трех модулей и 10 объектов.

Единственная проблема, которую я обнаружил, заключалась в том, что у меня было мастерство в создании макетов, а затем я не смог выполнить макет всех прикладных служб, например, репозиторий / служба / контроллер добавляет, считывает, обновляет и удаляет тестовую базу данных в режиме реального времени.

Поскольку у меня мало времени, мой главный вопрос заключается в том, действительно ли проблема заключается в неправильных проверках, потому что, если покрытие кода использует мета-информацию о том, какие папки читаются, это должно привести к шоку, когда вы начнете входить в папку Vendor, Doctrine. и т.п.

Так что это может быть главной проблемой? не сделали издевательства над связями из банка?

В моих нынешних технических знаниях это имело бы большое значение для насмешек, но здесь, где я работаю до сих пор, никто не использовал издевательства и пытается революционизировать.

В этом принципе уже применялись все методы, описанные в публикациях в Интернете и других вопросах, которые обсуждаются здесь в stackoverflow. Существует ли какая-либо новая технология для ускорения покрытия кода?

Существует руководство, посвященное полному объяснению того, как ускорить покрытие кода для PHP? полное объяснение?

Спасибо за внимание.

Редактировать:

Конфигурация модуля Codeception Suite:

namespace: ColumnNotNull
actor: Tester
paths:
tests: test
log: build/coverage
data: test/_data
helpers: test/_support
settings:
strict_xml: true
bootstrap: _bootstrap.php
colors: true
memory_limit: 1024M
coverage:
whitelist:
include:
- src/*
exclude:
- src/ColumnNotNull/Fixture/*
- src/ColumnNotNull/Module.php*
blacklist:
include:
- build/*
- data/*
- language/*
- public/*
- schema/*
- test/*
- view/*
- src/ColumnNotNull/Fixture/*

Модуль пакета Codeception Unit Config:

class_name: UnitTester
modules:
enabled: [Asserts, UnitHelper, Db]
config:
Db:
dsn: 'mysql:dbname=pibernews;host=localhost'
user: 'piber'
password: 'secret'
dump: data/column-not-null.mysql.sql
coverage:
enabled: true
remote_enable : false

Codeception Project Suite

include:
- module/Column
- module/ColumnImage
- module/ColumnNotNull
paths:
log: build
settings:
colors: true

С помощью Codeception я могу запустить несколько тестов из разных модулей с результатами слияния.

Это один проект, с тремя модулями. С приемочными и функциональными тестами. Принятие + функционал занимает 15 минут, блок с покрытием кода занимает пять часов.

Без покрытия кода потребуется 10 минут для запуска всех модульных тестов. Это приемлемо Но я хочу сократить время покрытия кода, потому что пять часов не приемлемо.

Изменить 2:

<?php
// This is global bootstrap for autoloading
include 'unit/GearBaseTest/ZendServiceLocator.php';

$zendServiceLocator = new \GearBaseTest\ZendServiceLocator();

_bootstrap.php file

<?php
namespace GearBaseTest;

use Zend\Loader\AutoloaderFactory;
use Zend\Mvc\Service\ServiceManagerConfig;
use Zend\ServiceManager\ServiceManager;
use Zend\Test\PHPUnit\Controller\AbstractHttpControllerTestCase;

class ZendServiceLocator
{
public function __construct()
{
$this->chroot();

$zf2ModulePaths = array(
dirname(dirname(realpath(__DIR__ . '/../../')))
);

if (($path = $this->findParentPath('vendor'))) {
$zf2ModulePaths[] = $path;
}

if (($path = $this->findParentPath('module')) !== $zf2ModulePaths[0]) {
$zf2ModulePaths[] = $path;
}

$this->initAutoloader();

$env = getenv('APP_ENV') ?  : 'testing';


$applicationConfig = include \GearBase\Module::getProjectFolder().'/config/application.config.php';

$config = array(
'module_listener_options' => array(
'module_paths' => $zf2ModulePaths,
'config_glob_paths' => array(
sprintf('config/autoload/{,*.}{global,%s,local}.php', $env)
)
),
'modules' => $applicationConfig['modules']
);


$serviceLocator = new ServiceManager(new ServiceManagerConfig());
$serviceLocator->setService('ApplicationConfig', $config);
$serviceLocator->get('ModuleManager')->loadModules();
$this->serviceLocator = $serviceLocator;
}

public function getServiceManager()
{
return $this->getServiceLocator()->get('ServiceManager');
}

public function chroot()
{
$rootPath = dirname($this->findParentPath('module'));
chdir($rootPath);
}

protected function findParentPath($path)
{
$dir = __DIR__;
$previousDir = '.';
while (! is_dir($dir . '/' . $path)) {
$dir = dirname($dir);
if ($previousDir === $dir) {
return false;
}
$previousDir = $dir;
}
return $dir . '/' . $path;
}

public function getEntityManager()
{
if (!isset($this->entityManager)) {
$this->entityManager = $this->getServiceLocator()
->get('doctrine.entitymanager.orm_default');
}
return $this->entityManager;
}

public function getServiceLocator()
{
return $this->serviceLocator;
}

public function setServiceLocator(ServiceLocatorInterface $serviceLocator)
{
if (!isset($this->serviceLocator)) {
$this->serviceLocator = $serviceLocator;
}
return $this->serviceLocator;
}

protected function initAutoloader()
{
$vendorPath = $this->findParentPath('vendor');

$zf2Path = getenv('ZF2_PATH');

if (! $zf2Path) {
if (defined('ZF2_PATH')) {
$zf2Path = ZF2_PATH;
} elseif (is_dir($vendorPath . '/ZF2/library')) {
$zf2Path = $vendorPath . '/ZF2/library';
} elseif (is_dir($vendorPath . '/zendframework/zendframework/library')) {
$zf2Path = $vendorPath . '/zendframework/zendframework/library';
}
}

if (! $zf2Path) {
throw new RuntimeException(
'Unable to load ZF2. Run `php composer.phar install` or' . ' define a ZF2_PATH environment variable.'
);
}

if (file_exists($vendorPath . '/autoload.php')) {
include $vendorPath . '/autoload.php';
}
include $zf2Path . '/Zend/Loader/AutoloaderFactory.php';

AutoloaderFactory::factory(array(
'Zend\Loader\StandardAutoloader' => array(
'autoregister_zf' => true,
'namespaces' => array(
__NAMESPACE__ => __DIR__ . '/' . __NAMESPACE__
)
)
));
}
}

ZendServiceLocator.php grabber.

0

Решение

Вам просто нужно внести белый список в папку модулей.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector