[英]How to organize PHPUnit tests and autoloading with NetBeans IDE
有自動加載規則( http://www.php-fig.org/psr/psr-0/ )和PHPunit測試( https://phpunit.de/manual/current/en/organizing-tests.html )。 它們很容易實現,但結合它們並不容易。
我還閱讀了一個PHPUnit組織測試的最佳實踐主題,但應用答案對我來說並不明顯。 編寫我自己的項目我遇到了幾個可能在代碼組織中起源相同的問題。 我希望我能得到一個真實簡單例子的食譜。 所以我的問題很大。
我使用NetBeans IDE 7.4,因為它支持PHPUnit,SVN和Doxygen(但我缺乏使用該IDE的經驗)。
項目屬性是
有第一個問題。 NetBeans從一開始就阻止鏡像src / tests結構。 源文件夾沒有“ 瀏覽”按鈕。 Test文件夾必須與Source文件夾不同。
我使用位於項目外部的PHAR文件中的PHPUnit和skelgen。 ( 工具 - >選項 - > PHP / PHPUnit )
我在項目目錄中有以下文件結構
index.php
src/
Client.php
srcAutoload.php
MyPack/
Foo/
Bar.php
Quu/
Baz.php
其中src
不是命名空間
src/MyPack/Foo/Bar.php
包含MyPack\\Foo\\Bar
src/MyPack/Quu/Baz.php
包含類MyPack\\Qoo\\Baz
src/Client.php
包含類Client
srcAutoload.php
包含來自https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md的修改后的PSR-0自動加載實現。 不同之處在於,在執行require()
之前,PSR-0文件名以src/
為前綴
$fileName = 'src' . DIRECTORY_SEPARATOR . $fileName;
我使用了工具/創建測試 (來自上下文菜單)為Bar
和Baz
類,我最終得到了以下結構
index.php
src/
Client.php
srcAutoload.php
MyPack/
Foo/
Bar.php
Quu/
Baz.php
tests/
src/
BarTest.php
BazTest.php
MyPack/
Foo/
Quu/
這絕對不是鏡像對稱的。 而且,生成的測試不知道如何加載他們正在測試的類。
Fatal error: Class 'MyPack\Foo\Bar' not found in C:\xampp\htdocs\myapps\PhpProject1\tests\src\BarTest.php on line 20
如前所述,測試運行器具有與項目不同的工作目錄。 因此,用於測試的自動加載器應該創建不同的完整文件名。 我有重復的PSR-0自動加載器,將其保存為tests/srcAutoloadFromTests.php
並添加了另一個前綴
/// after PSR-0 implementation code
/// I have PSR-0 $fileName
/* Escaping from tests subfolder by "../" prefix*/
$fromTests = '..' . DIRECTORY_SEPARATOR;
/* Prefixing full filename with "src/" */
$fileName = $fromTests . 'src' . DIRECTORY_SEPARATOR . $fileName;
if (is_file($fileName)) {
require $fileName;
}
之后,我添加了Use Bootstrap (Project Properties-> Testing / PHPUnit )。 文件tests/bootstrap.php
包含:
require_once 'srcAutoloadFromTests.php';
這個解決方案讓PHPUnit執行測試但看起來很難看。
src/
in tests/
沒有幫助自動加載? 我通過創建正確的文件夾和移動文件手動創建了鏡像結構:
index.php
src/
Client.php
srcAutoload.php
MyPack/
Foo/
Bar.php
Quu/
Baz.php
tests/
bootstrap.php
srcAutoloadFromTests.php
MyPack/
Foo/
BarTest.php
Quu/
BazTest.php
根據https://phpunit.de/manual/current/en/organizing-tests.html,PHPUnit 可以通過遞歸遍歷測試目錄自動發現並運行測試 。 它對我不起作用。 如果沒有我的srcAutoloadFromTests.php
我會得到與之前的非鏡像結構相同的錯誤。
Fatal error: Class 'MyPack\Foo\Bar' not found in C:\xampp\htdocs\myapps\PhpProject1_1\tests\MyPack\Foo\BarTest.php on line 20
由於NetBeans不允許將源文件夾用作測試文件夾,因此我必須為同一個類使用兩個自動加載器。 我不確定這是不是一個好習慣。
自動加載不應該打擾其他程序員工作相同的項目。 我尋找更通用的東西。
除了將來我還可以使用第三方代碼。 他們的自動裝載機是否也需要復制?
src/
和tests/
文件夾應該是頂級的vendor/
我不久前一直在學習自動加載規則。 現在我發現PSR-0被標記為已棄用根據PSR-4 src/
而tests/
應該放在路徑中間的某個位置。
但是有一種做法是將第三方代碼放在頂級vendor/
文件夾中。 不應該將src/
和tests/
文件夾放在同一級別上。
src/
… my code
tests/
… my tests
vendor/
… third-party code
這使整個結構更加PSR-0風格 。
在編寫BazTest和BarTest代碼時,NetBeans IDE不會提示PHPUnit方法,盡管這兩個類都擴展了\\PHPUnit_Framework_TestCase
namespace MyPack\Foo;
class BarTest extends \PHPUnit_Framework_TestCase { /* ... */ }
是因為我使用PHAR的PHPUnit嗎?
我希望引用這個例子讓我的問題更清楚。 感謝您閱讀,我尋求好的建議
伙計,這是個大問題。 :)好的,我們來解決一些問題。
PHPUnit Skelgen在錯誤的路徑上測試
這絕對不是鏡像對稱的
真正。 skelgen是一個奇怪的(我認為尚未解決的)路徑問題。
只需將生成的* Test文件移動到正確的文件夾中即可。
同樣的問題在這里: PHPUnit,Netbeans和Symfony2以及錯誤的測試位置
項目的文件夾結構
是的,這是要使用的文件夾結構:
src/ … my code tests/ … my tests vendor/ … third-party code
自動加載問題:
(沒有Composer):你的自動加載器住在src
某個地方。 在您的應用程序引導期間,您需要它,然后為src
文件夾設置自動加載。 src
文件夾中的所有類從現在開始自動加載。
現在進行測試:在測試引導期間,你包括來自src
的自動加載器並添加src
和test
。 這使得src
和tests
所有類都tests
自動加載。
(使用Composer):如果您使用Composer,則整個問題都不會出現問題。 Composer有require和require-dev部分來定義供應商依賴關系。 自動生成自動加載,您只需包含Composer自動加載文件並完成(在src bootstrap期間包含一個包含,在測試boostrap期間包含一個包含)。 如果項目安裝了開發依賴項,那么這些將成為自動加載的一部分,如果沒有,它們將不會出現。
沒有在NetBeans中提示PHPUnit
是的,PHAR沒有被內省或提取,因此Netbeans不會知道PHPUnit的類名。
解決方案1:提取PHAR。
解決方案2:添加帶有類名作為別名的PHP來指導Netbeans。 我不知道是否有人。 但這是一個非常普遍的問題,有人創造它的可能性很高。
解決方案3:讓我再次建議Composer:只需將phpunit作為require-dev依賴項添加到您的項目中。 Netbeans掃描供應商路徑,類名將解析。
Jens A. Koch的答案非常有幫助。 但我想寫下它對我有用的方式。
使用NetBeans IDE 7.4編寫和運行PHP項目的PHPUnit測試。
項目的結構
composer.json
index.php
src/
Client.php
MyPack/
Foo/
Bar.php
哪里
src/Client.php
包含在全局命名空間中定義的類 src/MyPack/Foo/Bar.php
包含MyPack\\Foo
命名空間中定義的類 composer.json
聲明了需求,即PHPUnit,PHPUnit Skeleton Generator和src/
和tests/
目錄中定義的類的自動裝配器 composer.json
{
"name": "vendor/php-project-with-tests",
"autoload": {
"psr-4": {
"": ["src/", "tests/"]
}
},
"require": {},
"require-dev": {
"phpunit/phpunit": "4.7.7",
"phpunit/phpunit-skeleton-generator": "2.0.1"
}
}
告訴NetBeans包含PHPUnit的位置。 我使用從https://phar.phpunit.de/下載的PHAR文件
tests
目錄,並將其用作測試文件夾 這實現了兩個目標: - 生成自動加載器,允許測試類使用src類 - 將PHPUnit庫添加到項目中以用於提示目的
Bootstrap文件在測試之前執行。 對於這個項目vendor / autoload.php就足夠了。
測試類放在錯誤的路徑上
我可以手動移動它們
測試以任何一種方式運行。
版本4.8.0和4.8.6的PHPUnit不起作用。 我收到消息unrecognized option --run
所以我必須使用PHPUnit 4.7.7
PHPUnit Skeleton Generator 2.0.1無法生成測試。 我收到消息[InvalidArgumentException] Commans“MyPack \\ Foo \\ Bar”未定義
所以我必須使用PHPUnit Skeleton Generator 1.2.1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.