動作する可能性のある別のオプションは、JUnitパラメーター化をテストに適用することです。私の現在の理解では、実装のパラメーターは常に提供された順序で実行されます。
その概念を使用すると、JUnit実装にコンストラクター引数としてURLを受け入れさせ、提供されたパラメーターに基づいてテストを内部的にフォークすることができます。
同じWebDriver参照を使用していることを確認するには、おそらく静的な@ BeforeClass /@AfterClass宣言である必要があります。これにより、パラメータを相互に連鎖させて、「前のテストからXページにいます。ここでタスクYを実行します。このテストの最後にZページに移動します。または状態A"。
ユニットレベルのテストでは、このソリューションは悪い形になると思いますが、Seleniumのようなツールを統合すると、統合テストレベルで動作し始めます。私自身はこの概念にかなり慣れていませんが、統合テストレベルでは、条件が依存するため、モジュール性のルールは少し曖昧になっているようです。
気になったので試してみました。テストに関連してアプリケーションを静的リソースとして扱うことができると仮定すると、私が思っていたように動作します。
package demo.testing;
import java.util.List;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Lists;
@RunWith(Parameterized.class)
public class SequentialParams {
private static SystemState state;
@BeforeClass
public static void validateBeforeState() {
state = new SystemState();
Assert.assertFalse(state.one);
Assert.assertFalse(state.two);
Assert.assertFalse(state.three);
Assert.assertFalse(state.four);
}
@Parameters
public static Object buildParameters() {
Runnable reset = new Runnable() {
public void run() {
state.one = false;
state.two = false;
state.three = false;
state.four = false;
}
};
Runnable oneToTrue = new Runnable() {
public void run() {
state.one = true;
}
};
Runnable twoToTrue = new Runnable() {
public void run() {
state.two = true;
}
};
Runnable threeToTrue = new Runnable() {
public void run() {
state.three = true;
}
};
Runnable fourToTrue = new Runnable() {
public void run() {
state.four = true;
}
};
Predicate<SystemState> oneIsTrue = new Predicate<SequentialParams.SystemState>() {
public boolean apply(SystemState input) {
return input.one;
}
};
Predicate<SystemState> twoIsTrue = new Predicate<SequentialParams.SystemState>() {
public boolean apply(SystemState input) {
return input.two;
}
};
Predicate<SystemState> threeIsTrue = new Predicate<SequentialParams.SystemState>() {
public boolean apply(SystemState input) {
return input.three;
}
};
Predicate<SystemState> fourIsTrue = new Predicate<SequentialParams.SystemState>() {
public boolean apply(SystemState input) {
return input.four;
}
};
Predicate<SystemState> oneIsFalse = new Predicate<SequentialParams.SystemState>() {
public boolean apply(SystemState input) {
return !input.one;
}
};
Predicate<SystemState> twoIsFalse = new Predicate<SequentialParams.SystemState>() {
public boolean apply(SystemState input) {
return !input.two;
}
};
Predicate<SystemState> threeIsFalse = new Predicate<SequentialParams.SystemState>() {
public boolean apply(SystemState input) {
return !input.three;
}
};
Predicate<SystemState> fourIsFalse = new Predicate<SequentialParams.SystemState>() {
public boolean apply(SystemState input) {
return !input.four;
}
};
List<Object[]> params = Lists.newArrayList();
params.add(new Object[]{Predicates.and(oneIsFalse, twoIsFalse, threeIsFalse, fourIsFalse), oneToTrue, Predicates.and(oneIsTrue, twoIsFalse, threeIsFalse, fourIsFalse)});
params.add(new Object[]{Predicates.and(oneIsTrue, twoIsFalse, threeIsFalse, fourIsFalse), twoToTrue, Predicates.and(oneIsTrue, twoIsTrue, threeIsFalse, fourIsFalse)});
params.add(new Object[]{Predicates.and(oneIsTrue, twoIsTrue, threeIsFalse, fourIsFalse), threeToTrue, Predicates.and(oneIsTrue, twoIsTrue, threeIsTrue, fourIsFalse)});
params.add(new Object[]{Predicates.and(oneIsTrue, twoIsTrue, threeIsTrue, fourIsFalse), fourToTrue, Predicates.and(oneIsTrue, twoIsTrue, threeIsTrue, fourIsTrue)});
params.add(new Object[]{ Predicates.and(oneIsTrue, twoIsTrue, threeIsTrue, fourIsTrue), reset, Predicates.and(oneIsFalse, twoIsFalse, threeIsFalse, fourIsFalse)});
params.add(new Object[]{Predicates.and(oneIsFalse, twoIsFalse, threeIsFalse, fourIsFalse), threeToTrue, Predicates.and(oneIsFalse, twoIsFalse, threeIsTrue, fourIsFalse)});
params.add(new Object[]{Predicates.and(oneIsFalse, twoIsFalse, threeIsTrue, fourIsFalse), oneToTrue, Predicates.and(oneIsTrue, twoIsFalse, threeIsTrue, fourIsFalse)});
params.add(new Object[]{Predicates.and(oneIsTrue, twoIsFalse, threeIsTrue, fourIsFalse), fourToTrue, Predicates.and(oneIsTrue, twoIsFalse, threeIsTrue, fourIsTrue)});
params.add(new Object[]{Predicates.and(oneIsTrue, twoIsFalse, threeIsTrue, fourIsTrue), twoToTrue, Predicates.and(oneIsTrue, twoIsTrue, threeIsTrue, fourIsTrue)});
return params;
}
Predicate<SystemState> verifyStartState;
Runnable changeState;
Predicate<SystemState> verifyEndState;
public SequentialParams(Predicate<SystemState> pre, Runnable task, Predicate<SystemState> post) {
verifyStartState = pre;
changeState = task;
verifyEndState = post;
}
@Test
public void perform() {
Assert.assertTrue(verifyStartState.apply(state));
changeState.run();
Assert.assertTrue(verifyEndState.apply(state));
}
private static class SystemState {
public boolean one = false;
public boolean two = false;
public boolean three = false;
public boolean four = false;
}
}