首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >页面对象模型抽象了多少?

页面对象模型抽象了多少?
EN

Stack Exchange QA用户
提问于 2020-02-09 01:22:31
回答 5查看 1.1K关注 0票数 9

在开发页面对象模型时,通常的目的是将页面抽象为保持代码可重用性和增加可读性的方法。

一些我经常被困在一个多高的层次上的东西,我会抽象化吗?例如,类似于登录表单(或者实际上是大多数表单)。

我通常会编写类似的代码(这是在Cypress fwiw中,但假装它在您选择的任何自动化框架中。下面的代码是JavaScript):

代码语言:javascript
复制
  setEmail(value) {
    const field = cy.get('.form-control[name="username"]');
    field.clear();
    field.type(value);

    return this;
  }

  setPassword(value) {
    const field = cy.get('.form-control[name="password"]');
    field.clear();
    field.type(value);

    return this;
  }

通常,在这一点上,我想知道"Hmmm是否应该继续,并将这个表单n输入封装到一个更大的方法中,比如“:

代码语言:javascript
复制
 login(email, password) {
    this.setEmail(email);
    this.setPassword(password);
    this.submit();
  }

在这一点上,我提出了一个问题:“为什么还要费心编写独立的输入方法”。

那么,如果我编写了一个更大的“公共”方法,我是否应该费心编写更小的私有方法,那么如何决定何时值得编写包含多个其他私有methods...and的大型方法?

我在PoM的某个地方读到,我们应该:

建模用户行为而不是用户界面

当我想到这句话的时候,特别是在形式上,我觉得这是一种“更大”的方法。我看到将它们分开的唯一真正优势是,万一我需要测试负的情况(例如,不是所有的输入都填好了)。从技术上讲,它可以有条件地添加到更大的表单中(但当有多个输入时也会很痛苦)。

这里的最佳做法是什么?

EN

回答 5

Stack Exchange QA用户

发布于 2020-02-09 08:28:05

我不认为PoM模式是为了对行为建模。而是一个用户界面。测试的目的是为行为建模。

如果您的对象不那么抽象,那么您可以更精确地断言结果。只有一个登录方法不会让您断言在登录中发生的事情。从技术上讲,我们可以这样做,但是在您的页面类中断言任何内容都是非常糟糕的做法。

因此,我会将行为解耦到一个单独的类。

票数 6
EN

Stack Exchange QA用户

发布于 2020-02-09 08:38:53

在编写或任何测试框架时,没有任何硬规则。关键是确定使其可重用、易于理解和减少维护工作量的方法。

我所遵循的一些程序是:

我应该费心写一个像登录这样的包装器函数吗?

  1. 如果在一个以上的测试case.More函数调用中没有使用登录函数,为什么要费心使用它呢?这实际上会减慢程序的速度,所以如果它不被重用,那么最好还是按原样使用它。
  2. 如果它在一个以上的地方使用,那么就使用一个包装函数来包装它,比如登录。这将减少代码行数,并提高代码的可重用性。

我应该有单独的方法吗?

  1. 这是一个棘手的部分,因为sendKeys()、click()、clear()已经是方法了,为什么需要再次包装它呢?在您的情况下,这是有意义的,因为您不仅仅是发送值,而是首先清除它,然后发送它。但是,如果它只是发送或单击,那么下面这样的内容是不可取的:setEmail(值){field.type(值);}
  2. 但是当您从可读性和可维护性的角度来看,遵循测试用例中的常见模式时,例如: page1.goto() page1。单击(‘loginButton’) page1.sendValue('passwordField','test')

看上去比

代码语言:javascript
复制
 let a= page1.goto();
 a.click(loginButton)
 a.sendkeys('test')
票数 3
EN

Stack Exchange QA用户

发布于 2020-02-10 11:08:31

我想更进一步,并且像用户一样对测试数据进行抽象。

代码语言:javascript
复制
 login(user) {
    this.setEmail(user.email);
    this.setPassword(user.password);
    this.submit();
 }

此userObject可以检查它是否存在,并自行设置。我不喜欢在测试中硬编码密码之类的东西。

当将较大的方法拆分为较小的方法时,请遵循清洁代码原则

票数 3
EN
页面原文内容由Stack Exchange QA提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://sqa.stackexchange.com/questions/42480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档