簡體   English   中英

如何使用NetBeans IDE組織PHPUnit測試和自動加載

[英]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的經驗)。

項目屬性

  • 項目文件夾 :C:\\ xampp \\ htdocs \\ myapps \\ PhpProject1
  • 源文件夾 :C:\\ xampp \\ htdocs \\ myapps \\ PhpProject1
  • 測試文件夾 :C:\\ xampp \\ htdocs \\ myapps \\ PhpProject1 \\ tests

有第一個問題。 NetBeans從一開始就阻止鏡像src / tests結構。 源文件夾沒有“ 瀏覽”按鈕。 Test文件夾必須與Source文件夾不同。

我使用位於項目外部的PHAR文件中的PHPUnit和skelgen。 工具 - >選項 - > PHP / PHPUnit

  • PHPUnit腳本 :C:\\ xampp \\ phar \\ phpunit.phar
  • Skeleton Generator腳本 :C:\\ xampp \\ phar \\ phpunit-skelgen-1.2.1.phar

我在項目目錄中有以下文件結構

index.php
src/
    Client.php
    srcAutoload.php
    MyPack/
        Foo/
            Bar.php
        Quu/
            Baz.php

其中src不是命名空間

  • file src/MyPack/Foo/Bar.php包含MyPack\\Foo\\Bar
  • 文件src/MyPack/Quu/Baz.php包含類MyPack\\Qoo\\Baz
  • file 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;

測試生成和自動加載問題

我使用了工具/創建測試 (來自上下文菜單)為BarBaz類,我最終得到了以下結構

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風格

沒有在NetBeans中提示PHPUnit

在編寫BazTest和BarTest代碼時,NetBeans IDE不會提示PHPUnit方法,盡管這兩個類都擴展了\\PHPUnit_Framework_TestCase

namespace MyPack\Foo;

class BarTest extends \PHPUnit_Framework_TestCase { /* ... */ }

是因為我使用PHAR的PHPUnit嗎?

我希望引用這個例子讓我的問題更清楚。 感謝您閱讀,我尋求好的建議

伙計,這是個大問題。 :)好的,我們來解決一些問題。

  1. PHPUnit Skelgen在錯誤的路徑上測試

    這絕對不是鏡像對稱的

    真正。 skelgen是一個奇怪的(我認為尚未解決的)路徑問題。

    只需將生成的* Test文件移動到正確的文件夾中即可。

    同樣的問題在這里: PHPUnit,Netbeans和Symfony2以及錯誤的測試位置

  2. 項目的文件夾結構

    是的,這是要使用的文件夾結構:

     src/ … my code tests/ … my tests vendor/ … third-party code 
  3. 自動加載問題:

    (沒有Composer):你的自動加載器住在src某個地方。 在您的應用程序引導期間,您需要它,然后為src文件夾設置自動加載。 src文件夾中的所有類從現在開始自動加載。

    現在進行測試:在測試引導期間,你包括來自src的自動加載器並添加srctest 這使得srctests所有類都tests自動加載。

    (使用Composer):如果您使用Composer,則整個問題都不會出現問題。 Composer有require和require-dev部分來定義供應商依賴關系。 自動生成自動加載,您只需包含Composer自動加載文件並完成(在src bootstrap期間包含一個包含,在測試boostrap期間包含一個包含)。 如果項目安裝了開發依賴項,那么這些將成為自動加載的一部分,如果沒有,它們將不會出現。

  4. 沒有在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"
    }
}

腳步

1.設置工具

告訴NetBeans包含PHPUnit的位置。 我使用從https://phar.phpunit.de/下載的PHAR文件

  1. 選擇菜單選項工具 - >選項
  2. 選擇PHP ,然后選擇PHPUnit選項卡
  3. 設置腳本:
    • PHPUnit腳本:MY_PATH \\ phpunit-4.7.7.phar
    • Skeleton Generator腳本:MY_PATH \\ phpunit-skelgen-1.2.1.phar

2.設置測試目錄

  1. 右鍵單擊項目名稱,從上下文菜單中選擇“ 屬性”
  2. 分類:來源
    • 測試文件夾最初為空
    • 瀏覽按鈕
    • 在項目目錄中創建tests目錄,並將其用作測試文件夾

3.設置測試提供者

  1. 右鍵單擊項目名稱,從上下文菜單中選擇“ 屬性”
  2. 分類:測試
    • 測試提供商:檢查PHPUnit

4.生成測試類

  1. 右鍵單擊類文件(例如Bar.php),從上下文菜單中選擇“ 工具” - >“創建測試

5.安裝依賴項

  1. 右鍵單擊項目名稱,從上下文菜單中選擇Composer - > Install(dev)

這實現了兩個目標: - 生成自動加載器,允許測試類使用src類 - 將PHPUnit庫添加到項目中以用於提示目的

6.設置引導程序文件

Bootstrap文件在測試之前執行。 對於這個項目vendor / autoload.php就足夠了。

  1. 右鍵單擊項目名稱,從上下文菜單中選擇“ 屬性”
  2. 分類:測試/ PHPUnit
    • 選中使用Bootstrap
    • Bootstrap:PROJECT_MAIN_DIR \\ vendor \\ autoload.php

項目結構

測試類放在錯誤的路徑上

在此輸入圖像描述

我可以手動移動它們

在此輸入圖像描述

測試以任何一種方式運行。

故障

PHPUnit 4.8不起作用

版本4.8.0和4.8.6的PHPUnit不起作用。 我收到消息unrecognized option --run

所以我必須使用PHPUnit 4.7.7

PHPUnit Skeleton Generator 2.0.1不能正常工作

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM