龙目岛域对象:战斗经典

域对象俄语,“域对象” )-在脚本逻辑中直接使用测试数据的最流行方法之一。 目前,由于其简单性,可理解性和逻辑性 ,它是最受欢迎和广泛使用的方法之一

它适用于所有类型的功能测试自动化(端到端,API,集成),无论所测试的平台是Web,移动还是台式机。
重要说明 :不要将域对象与数据传输对象(DTO)混淆。 这些是在不同领域中应用的完全不同的方法。
它的本质是什么?

从方法的另一个名称“业务对象”可以清楚地看出,这是一种抽象,是对象的模型和描述,对于理解和运行应用程序业务逻辑很重要。 除了将字段及其值“转移”到一个特定的业务部门外,它不能执行任何其他功能。
图片



看起来像什么


例如,请使用提供用户帐户创建功能的任何应用程序。 成为我们域对象的用户。 在几乎所有情况下,用户都必须具有用户名和密码:

//    User public class User { // ,  User    Login private String login; // ,  User    Password private String password; } 

特别小心的人会注意到所有内部字段都是私有的。 直接从对象的字段设置和读取值被认为是不好的做法。 相反,习惯上使用众所周知的getter和setter:

 public class User { private String login; private String password; //      login public void setLogin(String login) { this.login = login; } //     login public String getLogin() { return this.login; } //    public void setPassword(String password) { this.password = password; } public String getPassword() { return this.password; } } 

现在,我们可以访问这些字段,并且可以设置和读取它们的值。 但是在此示例中,我们仅使用两个字段。 如果这些字段中有十五个会发生什么? 的确,由于吸气剂和吸气剂无休止的复制粘贴,User类扩展到了前所未有的大小。 我们将如何处理呢?



魔术龙目岛


这就是Project Lombok抢救的地方-一个流行的库,它使我们可以减少代码几次,避免复制/粘贴的麻烦,并显着减少编写数据对象类所需的时间。 一些有用的链接:


他在做什么? 通过为类分配相应的注释,自动为该类的所有字段创建getter和setter方法:

 import lombok.Getter; import lombok.Setter; //       User @Getter //       User @Setter public class User { private String login; private String password; } 

简单,快速,方便。 因此,我们的代码更具可读性,类更简洁,开发速度更快。



申请测试


好的测试是将测试数据,测试逻辑及其实现清晰地分开的测试。

让我们尝试登录我们的用户。 我们用测试数据创建一个类,并用一个新的用户“填充”它们:

 //  Test Data  public class TestDataUser { //  private-    private final static String DEFAULT_LOGIN = "vasiliy_pupkin"; private final static String DEFAULT_PASSWORD = "q1w2e3"; //        public static User getDefaultUser() { //  ""  User user = new User(); //      Login user.setLogin(DEFAULT_LOGIN); //      Password user.setPassword(DEFAULT_PASSWORD); //    User,     return user; } } 

我们描述“登录”页面的模型:

 public class LoginPage { //  public- ,    User public void loginUser(User user) { //          enterLogin() enterLogin(user.getLogin()); //    enterPassword(user.getPassword()); } private void enterLogin(String login) { this.loginInput.sendKeys(login); } private void enterPassword(String password) { this.passwordInput.sendKeys(password); } } 

它仅用于实现测试类:

 public class LoginTest { @Test public void loginAsDefaultUser() { //    credentials   User user = TestDataUser.getDefaultUser(); //  Login- LoginPage loginPage = new LoginPage(); // ,     loginPage.loginUser(user); } } 

做完了! 你真棒!


总结一下


最后,我们获得了一个简洁的项目体系结构,将逻辑,数据和实现清楚地分开了。 Lombok可帮助您摆脱代码重复,Domain Object与Page Object的理念完美契合,并且代码支持成为一种真正的乐趣。

应该有缺点吗?

  1. 免疫力。 或更确切地说,它的缺失。 在这种情况下,使用Lombok的这种方法就输给了主要竞争对手-Builder有关Habré的文章 )。 但是,我认为,与构建器中的无穷链和Object类中的方法堆相比,上述代码更“干净”,可理解且在美学上令人愉悦。
  2. 在不需要的地方增加复杂性。 没有那么小的提醒。 任何方法或模式都存在问题,应该解决某个问题。 您不应在仅检查2 + 2 = 4的单元测试中尝试使用数据对象。

非常感谢您的关注。 我将很高兴评论和批评。

PS在评论中告诉您您在工作中使用的方法。 读起来会很有趣。

Source: https://habr.com/ru/post/zh-CN442606/


All Articles