在启用代码覆盖的情况下,ZF2.4需要很长时间才能运行phpunit

时间:2015-05-10 08:47:50

标签: php unit-testing jenkins zend-framework2 code-coverage

我在代码覆盖率方面遇到了麻烦。

我使用ZF2 2.4和作曲家安装的十几个模块。 当我运行没有代码覆盖的测试时,结果在5分钟内完成。在詹金斯,完整的构建需要15分钟。

启用代码覆盖后,整个构建时间为0:00到5:30 a.m ..

检查结果,我意识到服务/存储库/控制器类的测试每个平均需要2.10分钟。什么是可怕的。

我是tdd开发的新手,可以达到100%的代码覆盖率,系统有三个模块和一个10个实体。

我发现的唯一问题是我掌握了创建模拟,然后无法模拟所有应用程序服务,例如,存储库/服务/控制器实时添加,读取,更新和删除测试数据库。 / p>

由于我的时间很短,我的主要问题是问题是否真的是不正确的模拟,因为如果代码覆盖率使用了读取哪些文件夹的元信息,那么当您开始进入供应商时应该会感到震惊文件夹,学说等。

所以这可能是主要问题?没有嘲笑银行的连接?

根据我目前的技术知识,它会对模拟产生很大影响,但是在这里我工作到今天没有人使用过模拟并试图进行革命。

原则已经应用了互联网帖子中描述的所有技术以及stackoverflow中的其他问题,是否有任何新技术可以加速代码覆盖?

有一本手册专注于如何加快PHP的代码覆盖率的完整解释?一个完整的解释?

感谢收听。

编辑:

Codeception套件模块配置:

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 suite模块配置:

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,我可以使用合并结果从不同的模块运行多个测试。

是一个项目,有三个模块。通过验收和功能测试。 Acceptance + Functional需要15分钟才能运行,代码覆盖的单位需要5个小时。

没有代码覆盖需要10分钟来运行所有单元测试。这是可以接受的。但我希望将代码覆盖时间缩短,因为五小时是不可接受的。

编辑2:

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

$zendServiceLocator = new \GearBaseTest\ZendServiceLocator();

_bootstrap.php文件

<?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抓取器。

1 个答案:

答案 0 :(得分:1)

您只需要将模块文件夹列入白名单。