我正在使用 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 的实例。当然,当我有Module1TestStepswith 方法时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类时,了解这些类的关系并非易事。
怎样才能做得更好?