動作が異なる複数の環境で単体テストを行うにはどうすればよいですか?
これが私の問題です。単体テストを作成したいPHPクラスがあります。このクラスは、フォルダーを操作するためのショートカットを提供します。Linuxでは、問題なくフォルダーのアクセス許可を設定できます。Windowsでは、まったくできません。
これを知って、このクラスの単体テストを作成するためのベストプラクティスは何ですか?テストスイートはWindowsまたはLinuxのいずれかで実行できますが、Windowsでフォルダー設定をテストすると、テストは失敗します。失敗したテストに耐えるだけですか、OSを条件としてテストするか、テストを完全に省略しますか、それとも他の何かですか?
この場合、OSを条件として、テストの名前でLinuxでの実行のみを目的としていることを明確にします。
私はPHPの単体テストフレームワークに精通していませんが、Pythonでこれを行っている場合、unittest
は「このテストをスキップ」の条件をサポートしているため、Windowsで実行するときにテストをスキップするように設定します。 「マークアップ。
特定のアクセス許可でフォルダーを設定し、スクリプトがどのように反応するかを確認する必要がある場合は、別の言語(PowerShell?Python?わからない)を使用して環境を最初に設定できるかどうかを確認します。次に、事前に作成されたフォルダーでPHPコードをテストできます。
それができない場合は、手動で実行する必要があるWindowsでインタラクティブなテスト「スクリプト」を設定します。ここでの「スクリプト」とは、PHPコードが期待どおりに機能することを確認するために、各テストで実行する手順を意味します。現時点では単体テストではありませんが、テストを行わないよりは間違いなく優れています。まったくテストします。
両方の単体テストを作成してください!あなたはそれが機能しているコードであることを知る必要があります!
PHPには、PHPUnitと呼ばれる優れた単体テストツールがあり、これを行ういくつかの方法を提供しています。私の推奨事項は、OS固有のテストをそのOS名でグループ化することです。
/**
* @group linux
*/
class LinuxTest extends PHPUnit_Framework_TestCase {
// all tests within this class will be in the group, linux
}
class MixedTests extends PHPUnit_Framework_TestCase
{
public function testSomeTestThatAlwaysRuns()
{
// this test is not in a group
}
/**
* @group windows
*/
public function testWindowsOnlyCase()
{
// this test is in the group, windows
}
}
次に、Linuxの場合、「windows」でのテストを除くすべてのテストを実行します。その逆も同様です。これにより、両方のプラットフォームで実行する必要のあるすべてのテストが実行され、特定のグループのテストのみが除外されます。
phpunit --exclude-group windows
phpunit --exclude-group linux
また、複数のグループを除外することもできます。
phpunit --exclude-group windows,mac
フォルダを作成するアルゴリズムを別のメソッドに移動し、このメソッドで定義を作成し、各OSで何をするか。
スクリプトはLinuxでのみ機能するはずですが(Linux固有のコードを使用)、このスクリプトはLinuxでのみテストする必要があります。 unuit-testでlinux-environmentを「シミュレート」できるとは思えません。
スクリプトがWindowsでも機能することになっている場合は、単体テストではなく、スクリプト内でコーディングする必要があります。