PHPUnit ile yol sorunları ile başa çıkmak

3 Cevap php

Ben sadece phpunit kullanmaya başladım, ama ben bir gerginliği biraz çalıştırmak.

Benim kod benim apache server tek bir çalışan PHP çalışır, ama ben "phpunit Testleri" ile komut satırından phpunit çalıştırdığınızda DOCUMENT_ROOT ayarlı değil, bu yüzden bu içeren içerir için yolları hesaplamak için $ _SERVER ['DOCUMENT_ROOT'] kullanır işe yaramaz.

Ben PHPUnit yapılandırmasında bir şey eksik? Bu şekilde apache ile entegre edilmelidir?

3 Cevap

Geç cevap, üzgünüm.

Hayır, hiçbir şey eksik değil. PHP CLI (Command Line PHP) Apache / CGI modülü olarak PHP farklı bir canavar.

Ne yapabileceğini, ama $_SERVER bile CLI hala bir süper küresel olarak mevcut olduğundan ($_SERVER['DOCUMENT_ROOT'] ne gerek ayarlamak için setUp() dosyaların değişimdir bağlam), örneğin :

public function setUp() {
  $_SERVER['DOCUMENT_ROOT'] = dirname(__FILE__) . "/../application";
}

Sadece dikkatli olun, muhtemelen içine bu koymak istiyorum tearDown():

public function tearDown() {
  unset($_SERVER['DOCUMENT_ROOT']);
}

PHPUnit backs up your global state Eğer dolayısıyla neden bir test ile gerçekleştirildikten sonra herhangi önlemek için daha iyi, önemli ölçüde testleri yavaşlatabilir tüm global (ayrıca superglobal) verileri kullanıyorsanız.

En iyi yolu, $_SERVER kullanımı veya herhangi diğer küresel diziden kodunuzu ayrılabilmesi olacaktır. Örneğin do

class MyClass
{
    protected $_docroot;

    public function __construct($docroot)
    {
        $this->_docroot = $docroot;
    }

    public function getDocRoot() 
    {
        return $this->_docroot;
    }
}

yerine

class MyClass
{
    public function getDocRoot() 
    {
        return $_SERVER['DOCUMENT_ROOT'];
    }
}

Bu yapmanızı sağlar

// in your actual code
$instance = new MyClass($_SERVER['DOCUMENT_ROOT']);
$docroot = $instance->getDocRoot();

// in your test
$instance = new MyClass($variable_holding_the_correct_path);
$docroot = $instance->getDocRoot();

Bu ayırmasının sadece basit bir örnek olduğunu unutmayın. Bu çok daha karmaşık durumda da olabilir - ama genellikle you'r birim testleri çalışan, özellikle çaba değer.

$_SERVER['DOCUMENT_ROOT'] de Bootstrap dosyası ve aynı Bootstrap_test.php phpunit yapılandırma dosyasına bağlı phpunit.xml özellik adı ile bootstrap=Bootstrap_test.php ayarlanabilir

Ben Jenkins iş yapılandırması için $ _SERVER ['DOCUMENT_ROOT'] ayarlamak için gereksinimi elde etmeyi başardı. "Bootstrap_test.php" gibi görünüyor

<phpunit

   backupGlobals="false"

   backupStaticAttributes="false"

   strict="true"

   verbose="true"

   bootstrap="Bootstrap_test.php">

   <testsuites>

     <testsuite name="PHPUnit Test Suite">

     <file>PHPUnitTest.php</file>

     </testsuite>

   </testsuites>

   <logging>

     <log type="coverage-clover" target="logs/clover.xml"/>

   </logging>

</phpunit>

ve içeriği Bootstrap.php define() fonksiyonu kullanılarak ilan edilir:

define('BASE_PATH', realpath(dirname(__FILE__)));    
$_SERVER['DOCUMENT_ROOT'] = BASE_PATH;

BASE_PATH değişkeni genellikle Jenkins işi dizinin tam yolunu tutacaktır. Say, Jenkins iş adıdır Test_Job. Jenkins projesi kaynak kodu koyacaktır dizin /var/lib/jenkins/jobs/Test_Job/workspace (/var/lib/jenkins olarak jenkins çalışma dizininin varsayarak).

Bootstrap_test.php temel dizin yer ise, BASE_PATH /var/lib/jenkins/jobs/Test_Job/workspace tutun ve nihayet $_SERVER['DOCUMENT_ROOT'] olarak koyacaktır.