2010-01-19 52 views
37

我開始編寫PHPUnit測試,我希望測試可以從開發人員計算機以及從我們的服務器運行。開發人員機器的設置與服務器不同,甚至彼此不同。將參數傳遞給PHPUnit

要運行在這些不同的地方,它似乎是運行測試的人將不得不指示它正在運行的位置。測試可以查找正在運行的機器的正確配置。

我想象的是這樣的:

phpunit.bat -X johns_laptop UnitTest.php中

或α服務器上:

PHPUnit的-X阿爾法單元測試。 php

在測試中,我將能夠如果是'X'(或其它參數)參數並知道該值,例如,該機器的應用程序根目錄路徑是什麼。

它看起來不像命令行允許的 - 或者我錯過了什麼?

回答

30

一種方法是你檢查$ argv和$ argc。喜歡的東西:

<?php 

require_once 'PHPUnit/Framework/TestCase.php'; 

class EnvironmentTest extends PHPUnit_Framework_TestCase { 
    public function testHasParam() { 
      global $argv, $argc; 
      $this->assertGreaterThan(2, $argc, 'No environment name passed'); 
      $environment = $argv[2]; 
    } 
} 

然後,你可以打電話給你phpunittest這樣的:

phpunit EnvironmentTest.php my-computer 
+0

這聽起來很有希望,我會試試 – 2010-01-19 18:38:17

+0

爲我工作。謝謝。 – 2010-01-19 19:28:16

+0

phpunit也使用參數,這樣你根本不能使用它們 – jasir 2014-07-31 15:17:38

0

如果您想在遠程機器上運行測試,請使用ssh然後運行它。在本地機器上,你只需要cd到你的根目錄,然後運行phpunit。

[email protected]:/path/to/your/project$ phpunit 
[email protected]:/var/www/project$ phpunit 

編輯:你是在談論一個依賴於機器的配置。 (什麼樣的conf btw?)我的解決方案是把這些配置放在相同的,不受版本控制的地方,然後讀取/解析它的運行時間,例如需要的設置方法。

+0

我知道如何運行PHPUnit的內。我的問題是如何將配置信息傳遞給它,以便它可以知道該機器的配置? – 2010-01-19 16:27:54

+0

@dl:看我的編輯。 – erenon 2010-01-19 16:32:02

+0

我想我明白你的建議。問題是我想配置版本控制。他們可能會隨着時間而改變,我想跟蹤他們。 – 2010-01-19 18:39:04

36

您可以使用PHPUnit的--bootstrap開關這一點。

--bootstrap <file>  A "bootstrap" PHP file that is run before the tests. 

然後,做一個引導。包含變量PHP文件:

$port = 4445; 

在你的測試,你可以抓住這些值:

global $port; 
$this->setPort($port); 

然後運行:

phpunit --bootstrap boot.php MyTest.php 
+3

我認爲這個解決方案比Paulo更好地回答了原來的問題。這是引導文件的確切目的。 – 2011-02-01 18:37:50

+3

@WallyLawless有時值不能被硬編碼,需要作爲CL參數動態發送 – tipu 2012-02-16 18:39:33

+0

@MarkTheunissen你先生,救了我的一天!謝謝。 – mvw 2014-07-24 09:18:15

13

一種優雅的方式來傳遞變量既引導文件以及測試文件是通過使用環境變量:

export MY_ENV_VAR="some value" 

phpunit all 

然後,在你的PHP文件,你可以這樣訪問:

getenv('MY_ENV_VAR') 

來源:http://blog.lysender.com/2010/10/phpunit-passing-environment-variable-to-your-application/

+1

我需要使用'export MY_ENV_VAR =「some value」'來完成這項工作。 – Frug 2014-07-28 19:07:43

+0

@Frug漂亮的漁獲;更新的答案。 – scribu 2014-07-29 08:23:57

+1

或者您可以使用:'VAR ='something'phpunit ...,'' – jasir 2014-07-31 15:16:18

1

我這個確切的問題掙扎,並以一種哈克至今沒有方便的來到了解決辦法:我寫參數到磁盤上的文件和檢索他們在setUp()方法:

public function setUp() { 
    $this->setBrowser('firefox'); 
    $this->base_url = file_get_contents("selenium_host"); 
    $this->setBrowserUrl($this->base_url); 
} 

而不是直接調用phpunitparatest,我有一個shell腳本啓動測試。這一個調用paratest,並讓我指定進程的數量以及我希望測試運行的主機。

run_all_tests.sh

if [ $1 ] 
then 
    threads=$1 
else 
    threads=5 
fi 
if [ $2 ] 
then 
    echo $2 > selenium_host 
else 
    echo 'http://defaulthost.com' > selenium_host 
fi 

vendor/bin/paratest -p$threads -f --colors TestSuite.php 

然後,反對http://adifferenthost.com 7個線程中運行:

./run_all_tests.sh 7 'http://adifferenthost.com'

3

我不認爲以上的回答解決了我同樣的問題。

接受的答案並不完美。這樣,自定義選項應始終放在參數列表的末尾,並且沒有指示器表明它們是自定義選項。如果我需要的自定義選項的數量不是固定的,我應該編寫很多代碼來用正則表達式或類似的東西來解析自定義選項。

環境變量解決方案是好的,但並不自然。看起來很奇怪。

VAR1=aaa VAR2=bbb VAR3=ccc ./phpunit-custom-option CustomOptionTest.php 

shell腳本加上setUp()解決方案與接受的方法共享同樣的弱點。可能你應該編碼很多來解析文件並處理不可預知數量的自定義選項。

我不認爲引導腳本是正確的解決方案。它可以用來自動處理骯髒的作品,每次做同樣的事情,但沒有處理好更換零件。

我不喜歡以上所有答案。

我自己也沒有好主意。但也許我所做的可以給你靈感。我在GitHub上分叉了phpunit項目,並修改了一些代碼,並使其支持自定義選項功能。

enter image description here

修改PHPUnit的版本,可以接受這樣的自定義選項:

./phpuint-custom-option --custom var1=value1 --custom var2=value2 CustomOptionTest.php 

而且在測試中,您可以通過訪問訪問自定義選項超級全局變量$ _ SERVER

<?php 

class CustomOptionTest extends PHPUnit_Framework_TestCase { 

    public function testCustomOption() { 
     $this->assertEquals('value1', $_SERVER['var1']); 
     $this->assertEquals('value2', $_SERVER['var2']); 
    } 
} 

並且您可以找到我的代碼here,並下載修改後的版本here(由c點擊頁面上的「查看完整文件」鏈接)。

僅供參考。 this article是類似的解決方案。

2

這裏的所有解決方案對這個問題都是有效的,但是對於某些情況還有另一種方法可能更簡單。 Phing將因此使用採取的形式-Dargument=value

傳遞的參數 phing -Dtest=MyTest.class.php

然後可以使用phing條件語句來處理這些參數:在命令行中才有意義,如果在

<if> 
    <isset property="test" /> 
    <then> 
     <property name="testFile" value="${test}" /> 
    </then> 
    <else> 
     <property name="testFile" value="AllTests.php" /> 
    </else> 
</if> 
<exec command="phpunit --bootstrap myTestFile/bootstrap.php- myTestFolder/${testFile}" 
     passthru="true" returnproperty="phpunitreturn" /> 
1

參數傳遞您想要改變每次測試運行的測試參數。在不同的機器上運行主機特定的測試並不是此解決方案的最佳理由。

對此,PHPUnit configuration file可能證明是更合適的。它可以控制主機甚至特定於請求的變量,包括操作設置以及定義常量,全局變量,$_ENV,$_SERVER,甚至$_GET,$_POST等。這些操作全部在配置文件的<php>節點下完成,請參閱Setting PHP INI settings, Constants and Global Variables

Symfony2使用此方法並在單元測試中提供phpunit.xml.dist(默認配置)和phpunit.xml。後者是gitignored,允許您爲每臺機器定製它,而不會影響回購。然後你將運行你的測試:

phpunit -c /path/to/phpunit.xml 
1

正如Jasir已經提到的,單線解決方案是在phpunit調用之前設置環境變量。

在Linux上:

X=alpha phpunit unittest.php 

在Windows上可能:

set X=johns_laptop && phpunit.bat unittest.php 

而且你的腳本中使用

getenv('X') 

讀取值