PHPアプリケーションを開発するときは、さまざまなオペレーティングシステムプラットフォームでのコードの互換性を考慮する必要があることがよくあります。コードがさまざまなプラットフォームでスムーズに実行できるかどうかをテストするために、 PHP_UNAME()関数は、オペレーティングシステム名、バージョン、マシンアーキテクチャなどの有用なシステム情報を提供できますが、特に自動テスト環境では、すべてのプラットフォームで常に直接テストできるとは限りません。幸いなことに、手法を使用してphp_uname()の返品値をシミュレートして、異なるオペレーティングシステムでコードの動作を簡単に確認できるようにすることができます。
この記事では、PHPアプリケーションがさまざまなシステムと互換性があることを確認するために、 Mock Php_uname()関数を介してさまざまなプラットフォームでのコードの互換性をテストする方法を紹介します。
PHP_UNAME()は、現在のオペレーティングシステムに関する情報を取得するPHPの組み込み関数です。オペレーティングシステム名、バージョン番号、マシンアーキテクチャ、オペレーティングシステムバージョンなどの情報を含む文字列を返します。通常、返品値形式は次のとおりです。
string(31) "Linux myhost 4.15.0-20-generic #21-Ubuntu SMP"
コードが異なるオペレーティングシステムプラットフォームで適切に機能するようにするために、異なるプラットフォームを使用して直接テストすることが常に実行可能であるとは限りません。特に、継続的な統合(CI)ツールを使用する場合、すべてのプラットフォームで直接コードを実行することはできません。ただし、mockingテクノロジーを使用して、 php_uname()によって返されたオペレーティングシステム情報をシミュレートして、異なるプラットフォームで互換性をテストできます。
モッキングは、外部環境に実際に依存せずにテストするときに特定の機能または方法の動作をシミュレートできる一般的なテスト手法です。
PHP自体には、PHP_UNAME()などの内部関数を直接モックする組み込みの方法がありません。ただし、 PHPunitやMockeryなどの一部のサードパーティライブラリを使用してこれを達成できます。
プロジェクトのテストフレームワークとしてphpunitを使用する場合、カスタムテストダブルを作成することにより、 php_uname()関数の動作をシミュレートできます。 PhPunitは、 CreateMock()メソッドを提供します。これは、クラスのメソッド動作をシミュレートするために使用できますが、組み込み関数のシミュレーションでは、通常、 Runkit拡張機能またはその他の手法を組み合わせる必要があります。
// サンプルコード
class MyTest extends PHPUnit\Framework\TestCase
{
public function testSystemInfo()
{
// シミュレーション php_uname() 返品値
$this->setMockFunction('php_uname', 'Linux test-host 5.4.0-40-generic #44-Ubuntu SMP');
// テストする必要があるコードを呼び出す
$result = php_uname();
// 断言返品値符合预期
$this->assertEquals('Linux test-host 5.4.0-40-generic #44-Ubuntu SMP', $result);
}
private function setMockFunction($functionName, $mockedValue)
{
runkit_function_redefine($functionName, '', 'return "' . $mockedValue . '";');
}
}
Mockeryは、モック関数にシンプルなインターフェイスを提供するもう1つの人気のあるPHPモッキングライブラリです。 mockeryを使用してphp_uname()関数をシミュレートする例は次のとおりです。
use Mockery as m;
class MyTest extends PHPUnit\Framework\TestCase
{
public function tearDown(): void
{
m::close();
}
public function testSystemInfo()
{
// 使用 Mockery シミュレーション php_uname 関数
$mock = m::mock('alias:php');
$mock->shouldReceive('php_uname')->andReturn('Windows NT test-host 10.0');
// テストする必要があるコードを呼び出す
$result = php_uname();
// 断言返品値符合预期
$this->assertEquals('Windows NT test-host 10.0', $result);
}
}
モッキングテクノロジーを通じて、 php_uname()によって返されるさまざまなオペレーティングシステム情報を簡単にシミュレートし、さまざまなプラットフォームでのコードの互換性を確認できます。たとえば、Linux、Windows、およびMacOS環境をシミュレートして、これらのプラットフォームで実行されているコードの結果をテストします。
// シミュレーション Linux プラットフォーム
$this->setMockFunction('php_uname', 'Linux myhost 4.15.0-20-generic #21-Ubuntu SMP');
// シミュレーション Windows プラットフォーム
$this->setMockFunction('php_uname', 'Windows NT myhost 10.0');
// シミュレーション macOS プラットフォーム
$this->setMockFunction('php_uname', 'Darwin myhost 19.5.0 Darwin Kernel Version 19.5.0');
シミュレーション後、Phpunitのアサーション機能を使用して、異なるオペレーティングシステムでコードが予想どおりに動作するように動作することを確認できます。
モッキングテクノロジーを使用することにより、 php_uname()関数の返品値を簡単にシミュレートし、異なるオペレーティングシステムプラットフォームでコードの互換性をテストできます。このアプローチは、複数のオペレーティングシステムで手動テストを実行する時間を節約するだけでなく、アプリケーションのクロスプラットフォーム機能を検証する信頼できる方法も提供します。
さまざまなオペレーティングシステム情報をシミュレートすることにより、PHPアプリケーションがさまざまなプラットフォームでスムーズに実行できるようにし、リリース後にプラットフォームの互換性の問題を回避できます。