【问题标题】:Test classes with common behavior测试具有共同行为的类
【发布时间】:2013-09-15 22:35:48
【问题描述】:

我必须在 Hybris Commerce Suite 中编写一些集成测试类,它们中的大多数具有共同的行为来设置系统(站点、商店、目录、国家...)或执行一些常见的操作,如创建一个客户。

我创建了一个抽象类,它使用 @Before 方法中的常量值和一些常用方法(如 createDefaultCustomer())执行所有初始化。

我所有的测试类都继承自这个类。

常量值被分隔在不同的常量类中,例如

abstract class AbstractTest {
  protected static final class USER_CONSTANTS {
  };
  protected static final class CATALOG_CONSTANTS {
  };
  protected UserModel createDefaultUser() {
  }
}

现在,为了测试,我可以在我的子类中做

createDefaultUser();
UserData userData = userFacade.getUserById(USER_CONSTANTS.ID);
assertEquals(USER_CONSTANTS.ID, userData.getId());

如果我不这样做,测试类中有很多重复。

我怀疑这是否可以接受,因为抽象类往往很长且方法丰富,或者我需要更改设计。 我会避免为每组常量创建单独的类。

【问题讨论】:

    标签: java testing class-constants hybris


    【解决方案1】:

    我认为为您的公共代码使用基本测试类然后在每个测试类中扩展它是完全可以的。事实上,测试策略应该与项目代码的设计一致。我相信您的项目模块也会有一些通用代码,您的通用测试部分基本上映射到项目代码的这些功能。

    我在几个项目中做过类似的设计,没有任何问题。

    因此,每当您的项目的通用功能发生变化时,都会影响通用测试类中的测试用例,而特定更改会随着特定测试类而发生。

    【讨论】:

    • 在项目代码中,所有数据值都保存在数据库中,模块可以调用服务(即UserService,ProductService...)来获取模型并执行一些逻辑。我正在尝试“模拟”这个数据库,因为如果我输入真实数据,那么测试会过于依赖数据且不够灵活
    【解决方案2】:

    如何将其创建为 BaseTest 抽象类(就像您的 AbstractTest 一样),其中包含您在所有测试中需要的所有必要功能。然后,您可以简单地扩展您的抽象类以继承其所有属性,并根据您的特定测试编写任何附加功能。 类似DefaultUserTest extends BaseTest { protected UserModel createDefaultUser() {} }

    【讨论】:

    • 如果您的意思是 realTest 扩展 DefaultUserTest 扩展 AbstractTest,当一个类需要两个独立的功能时,我可能会遇到问题。例如,对用户查看最多的产品的测试需要有一个 createDefaultUser() 和 createDefaultProduct()
    • 不,我的意思是你可以创建一个 baseTest,然后让你的 realTest 扩展它。当然,真正的测试会依次组合类,以便您可以在一个测试用例中测试 createDefaultUser() 和 createDefaultProfile()。
    • 嗯,好的。这就是我目前正在做的,所有测试类都继承自 AbstractTestClass。问题是 AbstractTestClass 往往非常长且异构。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-04
    • 2019-01-04
    相关资源
    最近更新 更多