有没有比使用单个类更好的方法来提供测试Web应用程序的辅助方法?

时间:2013-08-09 12:03:17

标签: java unit-testing generics inheritance

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

如何做得更好?

1 个答案:

答案 0 :(得分:1)

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

它有一些好处可以解决您的问题:

  • 它使用组合,而不是继承
  • 对于维护测试的人来说很容易理解和解释,因为测试读起来像是使用应用程序的人的描述