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