0

我正在使用 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类时,了解这些类的关系并非易事。

怎样才能做得更好?

4

1 回答 1

1

使用页面对象模式。也就是说,为每个页面创建一个 API,以便您的测试以描述用户体验的方式描述导航和与页面交互。

它有一些好处可以解决您的担忧:

  • 它使用组合,而不是继承
  • 维护测试的人很容易理解和解释,因为测试读起来就像是对使用应用程序的人的描述
于 2013-08-09T12:11:11.493 回答