在不同项目中重用 Java 类 的最佳方式?
Best way of reusing Java classes across different projects?
我目前正在为各种网站编写 Selenium WebDriver 测试,每个网站都使用相同的专有框架。
因此,有许多测试用例在不同的网站上可能非常相似。因此,我使我的测试 classes 尽可能通用,并使每个用于定位元素的 XPath/CSS Selector/ID 都在 Constants
[=46= 中定义],每个项目都是独一无二的。
但是,在某些情况下,同一测试的代码在不同的网站上可能是相同的,因为我写的是通用的。
此外,每个测试都是 BasicTest
class 的 direct/indirect 扩展,其中包含可能被不同测试重用的代码(例如:WebDriver 实例声明等)
我考虑设置测试结构的方式如下:
- 每个后续项目 "reused" 一个通用项目;
- 每个网站一个项目,有自己的
Constants
class 定义和 TestSuite
class 可用于 运行 两个通用测试和特定于自身的测试。
这样我就不会在我的每个测试项目中都有这些通用测试的副本。
问题是我真的不知道如何设置它。 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
我目前正在为各种网站编写 Selenium WebDriver 测试,每个网站都使用相同的专有框架。
因此,有许多测试用例在不同的网站上可能非常相似。因此,我使我的测试 classes 尽可能通用,并使每个用于定位元素的 XPath/CSS Selector/ID 都在 Constants
[=46= 中定义],每个项目都是独一无二的。
但是,在某些情况下,同一测试的代码在不同的网站上可能是相同的,因为我写的是通用的。
此外,每个测试都是 BasicTest
class 的 direct/indirect 扩展,其中包含可能被不同测试重用的代码(例如:WebDriver 实例声明等)
我考虑设置测试结构的方式如下:
- 每个后续项目 "reused" 一个通用项目;
- 每个网站一个项目,有自己的
Constants
class 定义和TestSuite
class 可用于 运行 两个通用测试和特定于自身的测试。
这样我就不会在我的每个测试项目中都有这些通用测试的副本。
问题是我真的不知道如何设置它。 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