使用 PHPUnit 運行測試時,如果看到 "No tests executed" 的消息,這通常代表 PHPUnit 沒有找到或執行任何測試。
錯誤原因
運行 PHPUnit 時出現 No tests executed 錯誤訊息,例如下圖。
以下是一些可能的原因。
確認測試文件命名
PHPUnit 通常要求測試檔案的命名符合一定的規範。通常,測試檔案的名稱應該以 Test.php 結尾。例如:ExampleTest.php
。
確認測試目錄結構
確保你的測試位於正確的目錄,並且 PHPUnit 的配置文件(phpunit.xml)指向了包含測試的正確目錄。
檢查 PHPUnit 設定
檢查 phpunit.xml 設定文件,確保它包含了正確的測試目錄。有時,如果設定不正確,PHPUnit 可能無法找到測試的檔案。
確認測試方法的命名
測試方法通常應以 test 開頭,例如 testExampleFunction()
。此外,你也可以使用 @test 註解來標記方法為測試,不過這個方法盡量少用,它有可能在未來的 PHPUnit 版本被棄用。
確認是否有過濾條件
如果使用 --filter
選項來運行特定的測試,確保過濾條件是正確的。
檢查代碼錯誤
確保測試代碼沒有語法錯誤或其他問題,這可能會導致 PHPUnit 無法正常執行測試。
確認 PHPUnit 版本
如果你的測試是針對特定版本的 PHPUnit 編寫的,請確保你正在使用與測試相容的 PHPUnit 版本。
運行 PHPUnit 與詳細的輸出
使用 --verbose
選項運行 PHPUnit,以獲得更多關於它正在做什麼的訊息。例如:
phpunit --verbose。
檢查 autoload 配置
如果你使用的是 composer 來管理依賴,確保正確設定了自動載入的程式語法,並且在運行測試之前執行 composer dump-autoload
將自動載入對應的規格更新。
解決 No tests executed 實例
檢查文件檔名
請先確認執行單元測試的目錄下的 php 檔案是否為 Test 結尾,排除目錄及檔案名稱的問題,例如
HomeControllerTest.php
檢查 PHPUnit 版本
如果還是發生 No tests executed,最可能的原因不在於你把 PHPUnit 裝在那裡,而是執行的 PHPUnit 版本,所要 extends 的 Class 不同。
舉個例子,以下是程式碼片段
namespace Tests\Controllers;
use Slim\App;
use Slim\Http\Request;
use Slim\Http\Response;
use Slim\Http\Environment;
/**
* This is an example class that shows how you could set up a method that
* runs the application. Note that it doesn't cover all use-cases and is
* tuned to the specifics of this skeleton app, so if your needs are
* different, you'll need to change it.
*/
class BaseTestCase extends \PHPUnit_Framework_TestCase
{
/**
* Use middleware when running application?
*
* @var bool
*/
protected $withMiddleware = true;
把
class BaseTestCase extends \PHPUnit_Framework_TestCase
替換成
class BaseTestCase extends \PHPUnit\Framework\TestCase
No tests executed 即消失。程式碼也可以順利運行。
解決方法
主要的原在在於 PHP Unit 在版本 6.x 以後,使用的 Class 為 \PHPUnit\Framework\TestCase
而不是 PHPUnit_Framework_TestCase
。如果你也有這個問題,解決之道為升級版本,或者在要單元測試的 Code 修改相對應的 Class。
總結
這篇文章列出了執行 PHPUnit 出現 No tests executed 的原因和解決方法,檢查這些項目,並逐一排除可能的問題。應該可以順利解決這個問題。
留言