在不同项目中重用 Java 类 的最佳方式?

Best way of reusing Java classes across different projects?

我目前正在为各种网站编写 Selenium WebDriver 测试,每个网站都使用相同的专有框架。

因此,有许多测试用例在不同的网站上可能非常相似。因此,我使我的测试 classes 尽可能通用,并使每个用于定位元素的 XPath/CSS Selector/ID 都在 Constants [=46= 中定义],每个项目都是独一无二的。

但是,在某些情况下,同一测试的代码在不同的网站上可能是相同的,因为我写的是通用的。 此外,每个测试都是 BasicTest class 的 direct/indirect 扩展,其中包含可能被不同测试重用的代码(例如:WebDriver 实例声明等)

我考虑设置测试结构的方式如下:

这样我就不会在我的每个测试项目中都有这些通用测试的副本。

问题是我真的不知道如何设置它。 GenericProject 将包含需要来自 Constant 的变量的测试,但是使用通用 Constants 是没有意义的。另外,我能否在我的网站项目特定 TestSuites 中调用这些测试?如果我在每个特定项目中重新定义 Constants,这些常量是否会用于 GenericProject 中定义的通用测试? 我怎样才能设置它以便我可以在项目 B、C、D 等中重用项目 A 的 classes?

一般来说,为了在项目中重用代码,您将创建一个包含可重用代码的库。为此,您需要为图书馆考虑一个合适的 API。

这包含关于以下内容的决定:

  • 如何从相关代码调用功能
  • 依赖代码将如何提供所需数据。

如果您使用常量,例如CSS 个不同但语义相同的选择器,例如

  • 根框架
  • 侧面板
  • 主要区域
  • ...

您可能想要定义一个接口,供依赖代码提供。这可能看起来像:

interface CssSelectors {
    String rootFrame();
    String sidePanel();
    //...
}

如果您正在为测试构建它,您可能还想使用测试框架的功能(例如 JUnit 中的 Rules)。

在测试中重用代码时,您还应该考虑另一个方面:

如果s.o。阅读用您的库编写的测试,她是否能够充分理解库边界后面发生的事情以了解测试的全部内容?在处理测试代码时,这比处理生产代码更重要,因为测试覆盖率和测试的有效性与生产代码相比,如何完成设置或验证通常更重要。

  • 将常量提取到属性文件中,该文件作为 src/test/resources/common.properties.
  • 存在于每个模块中
  • 使用org.apache.commons:commons-configuration2 PropertiesConfiguration阅读此文件。它将很好地处理嵌套属性。
  • 可以根据您的 GenericModule 共享公共代码。执行此操作的两种模型(将常见测试提取到新模块或使用测试罐)的官方说明是 here