CapabilityFilterを使用して実行環境を制限する
CapabilityFilter概要
CapabilityFilterとは
CapabilityFilterはテストクラスやテストメソッド、アノテーションに対して使用できるアノテーションです。
Pitaliumはcapabilities.jsonファイルに記述したブラウザやデバイスの全てに対してテストの実行を試みますが、テストケースによっては「PCのブラウザでのみ実行したい」「モバイルのブラウザでのみ実行したい」「最新のブラウザでのみ実行したい」ものがあります。テストで使用するcapabilities.jsonファイルを変更し、テスト実行対象のクラスを明確に指定することで先の希望を実現することもできますが、面倒です。
CapabilityFilterはcapabilities.jsonファイルに記述したプロパティの値を基にして、テストケースのブラウザ、デバイスでの実行を静的に制限します。
CapabilityFilterの対象プロパティ
CapabilityFilterでは以下の5つのプロパティを使用してテスト実行を制限します。
種別 | プロパティ名 | 複数 | 正規表現 | その他 |
---|---|---|---|---|
ブラウザ名 | browserName | ○ | ||
プラットフォーム | platform | ○ | Platform列挙値を指定します。 ファミリーで指定すると、ファミリーに含まれる全てのプラットフォームが対象になります。 例) WINDOWSを指定するとXPやVISTA、WIN_10等で実行されます。 | |
バージョン | version | ○ | ○ | |
デバイス名 | deviceName | ○ | ○ | |
グループ | filterGroup | ○ | CapabilityFilter専用のプロパティです。 |
フィルタの適用条件
CapabilityFilterはプロパティに設定したフィルタ値に一致するブラウザ、デバイスでのみテストが実行されます。
フィルタ値に一致しないブラウザ、デバイスでのテストは@Ignoreの様にスキップされた扱いとなります。
CapabilityFilterは複数のプロパティに複数のフィルタ値を同時に指定することができます。
複数同時に指定する場合以下の通り扱われます。
- 1つのプロパティに複数フィルタ値を設定した場合、プロパティ内のフィルタ値同士はOR条件
- 複数のプロパティにフィルタ値を設定した場合、プロパティ同士はAND条件
- 複数のCapabilityFilterを指定した場合、CapabilityFilter同士はOR条件
プラットフォームに WINDOWS 、ブラウザ名に internet explorer と chrome を指定したフィルタは WINDOWS上のInternetExplorer、またはWINDOWS上のChrome でのみ実行されます。
CapabilityFilterを使用する
使用の準備
CapabilityFilterでの実行制限はAssumeCapabilityルールに実装されています。
以下のコードの通りにAssumeCapabilityを使用してください。
@Rule
public AssumeCapability assumeCapability = new AssumeCapability();
@Parameterized.Parameter
public PtlCapabilities capabilities;
protected PtlWebDriver driver;
/**
* テスト実行時のセットアップを行います。
*/
@Before
public void setUp() {
assumeCapability.assumeCapability(capabilities);
driver = assertionView.createDriver(capabilities);
}
}
- AssumeCapabilityはJUnitのRuleとして実装されています。
@Ruleを付加したAssumeCapabilityのpublicフィールドを定義します。 - @Beforeを付加したpublicメソッドを作成し、その中でassumeCapabilityメソッドを呼び出します。
- PtlTestBaseには上のコードの様にAssumeCapabilityが既に定義されています。
テストケースにCapabilityFilterを設定する
テストケース(テストメソッド)に対してCapabilityFilterを設定するには、テストメソッドに@CapabilityFilterを付加します。
import com.htmlhifive.pitalium.core.PtlTestBase;
import com.htmlhifive.pitalium.core.annotation.CapabilityFilter;
import org.junit.Test;
import org.openqa.selenium.Platform;
import org.openqa.selenium.remote.BrowserType;
public class CapabilityFilterSample extends PtlTestBase {
@Test
@CapabilityFilter(
platform = Platform.WINDOWS,
browserName = BrowserType.CHROME
)
public void test1() throws Exception {
// WINDOWS上のChromeでのみ実行されます。
}
@Test
@CapabilityFilter(
filterGroup = "mobile",
version = {"latest", "support"}
)
public void test2() throws Exception {
// filterGroupにmobileを設定したもので、
// バージョンにlatestまたはsupportと記述されているものでのみ実行されます。
}
}
テストケースに複数のCapabilityFilterを設定する
テストケース(テストメソッド)に対して複数のCapabilityFilterを設定するには、テストメソッドに@CapabilityFiltersを付加します。@CapabilityFiltersに設定されたフィルター同士はOR条件として扱われます。
import com.htmlhifive.pitalium.core.PtlTestBase;
import com.htmlhifive.pitalium.core.annotation.CapabilityFilter;
import com.htmlhifive.pitalium.core.annotation.CapabilityFilters;
import org.junit.Test;
import org.openqa.selenium.Platform;
import org.openqa.selenium.remote.BrowserType;
public class CapabilityFilterSample extends PtlTestBase {
@Test
@CapabilityFilters({
@CapabilityFilter(
platform = Platform.WINDOWS,
browserName = {BrowserType.IE, BrowserType.FIREFOX, BrowserType.CHROME}
),
@CapabilityFilter(
platform = Platform.MAC,
browserName = BrowserType.SAFARI
)
})
public void test1() throws Exception {
// WINDOWS上のIE、Firefox、Chrome、
// またはMAC上のSafariで実行されます。
}
}
テストクラスにCapabilityFilterを設定する
テストクラスにCapabilityFilterを設定するには、テストクラスに@CapabilityFilterを付加します。
テストクラスに設定されたフィルターが適用された後にテストケース(テストメソッド)に設定されたフィルターが適用されます。
import com.htmlhifive.pitalium.core.PtlTestBase;
import com.htmlhifive.pitalium.core.annotation.CapabilityFilter;
import org.junit.Test;
import org.openqa.selenium.Platform;
import org.openqa.selenium.remote.BrowserType;
@CapabilityFilter(platform = Platform.WINDOWS)
public class CapabilityFilterSample extends PtlTestBase {
@Test
public void test1() throws Exception {
// WINDOWS上のブラウザ全てで実行されます。
}
@Test
@CapabilityFilter(browserName = BrowserType.CHROME)
public void test2() throws Exception {
// WINDOWS上のChromeで実行されます。
}
@Test
@CapabilityFilter(platform = Platform.MAC)
public void test3() throws Exception {
// フィルタに一致する条件は存在しないため、実行されません
}
}
独自のフィルターアノテーションを定義する
@CapabilityFilterと@CapabilityFiltersはそれぞれアノテーションに対しても付加することができます。
@CapabilityFilterや@CapabilityFiltersを付加したアノテーションを作成することでフィルター適用時のメンテナンス性や可読性が大幅に向上することが期待されます。
アノテーションを定義する
モバイル環境でのみテストを実行する@Mobileというアノテーションを作成します。
@TargetにTYPEとMETHODを指定することで、テストクラスとテストケース(テストメソッド)を指定することが可能になります。
import com.htmlhifive.pitalium.core.annotation.CapabilityFilter;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@CapabilityFilter(filterGroup = "mobile")
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface Mobile {
}
アノテーションを使用する
作成したアノテーションをテストケース(テストメソッド)に設定します。
@Mobileに付加した@CapabilityFilterが読み込まれ、フィルターグループにmobileが設定してあるデバイスでのみテストが実行されます。
import com.htmlhifive.pitalium.core.PtlTestBase;
import org.junit.Test;
public class CapabilityFilterSample extends PtlTestBase {
@Test
@Mobile
public void test1() throws Exception {
// フィルターグループにmobileが設定してあるデバイスで実行されます。
}
}