我正在使用JUnit中的Selenium为Web应用程序设计UI测试。我有一个类似这样的基础测试类,我继承了我的测试:
public class BaseTest {
protected TestSteps test;
protected Assertions assertion;
// set everything up...
}
然后测试看起来像这样:
public class TestX extends BaseTest {
@Test
public testFeature1() {
test.clickSomething().enterSomething(); // method chaining
assertion.assertSomething();
//...
}
}
我遇到的问题:Web应用程序中有不同的模块,只适用于一个模块的Assertions/TestSteps
方法使其他模块的Assertions/TestSteps
类接口混乱。
因此我尝试将Assertions / TestSteps拆分起来。
问题是,方法链接返回TestSteps的实例。当然,当我Module1TestSteps
使用方法doSomethingSpecific()
时,我希望test.clickSomething().doSomethingSpecific()
能够正常工作,但事实并非如此,因为clickSomething()
会返回TestSteps
个实例,而不是Module1TestSteps
实例。
我通过创建AbstractTestSteps<T extends AbstractTestSteps<T>
类(包含所有基础TestSteps方法)protected abstract T getThis();
来“解决”这个问题。
然后我像这样扩展这个类:
public class BaseTestSteps extends AbstractTestSteps<BaseTestSteps> {
// Constructors
protected BaseTestSteps getThis() {
return this;
}
// that's it, the "base methods" are all inherited from AbstractTestSteps...
}
用于基础TestSteps和
public class Module1TestSteps extends AbstractTestSteps<Module1TestSteps> {
// same constructors...
protected Module1TestSteps getThis() {
return this;
}
public Module1TestSteps doSomeThingSpecific() {
// do something
return getThis();
}
}
我的专业TestSteps
。它现在有效,但由于以下原因我不喜欢它:
AbstractTestSteps
类中,但它们是通过BaseTestSteps
Module1
的子模块怎么办?我无法从Module1TestSteps
继承,只能从AbstractTestSteps继承。TestSteps
课程时,了解这些课程的关系并非易事。如何做得更好?
答案 0 :(得分:1)
使用Page Object pattern。也就是说,为每个页面创建一个API,以便您的测试描述以描述用户体验的方式导航和与页面交互。
它有一些好处可以解决您的问题: