sam152/mink-page-objects

该包的最新版本(0.0.3)没有可用的许可证信息。

phpunit的通用页面对象。

0.0.3 2019-05-16 08:09 UTC

This package is not auto-updated.

Last update: 2024-09-28 07:49:33 UTC


README

CircleCI

这是一个使用Mink API实现的页面对象实现。这个库是在现有的Mink API之上的一个薄层,但封装成了页面对象。一个页面对象可能包含一组选择器、表单字段和执行常见测试相关操作的函数。

这个库旨在轻量级,尽可能减少在现有Mink API之上引入的新API界面。选择器和表单字段列表受到了nightwatch.js的启发。

通过实现页面对象

  • 您可以创建更容易阅读和维护的测试。
  • 您减少了测试用例和标记之间的耦合。
  • 通过简化整个过程,您鼓励进行彻底的测试。

有关页面对象优势的进一步阅读,请参阅Martin Fowler关于此主题的博客文章

以下是一个使用此库为登录页面定义的页面对象示例

<?php

/**
 * The login page object.
 */
class LoginPage extends MinkPageObjects\PageObjectBase {

  /**
   * {@inheritdoc}
   */
  public function getUrl() {
    return '/user/login';
  }

  /**
   * {@inheritdoc}
   */
  protected function getElements() {
    return [
      'messages' => '.messages',
    ];
  }

  /**
   * {@inheritdoc}
   */
  protected function getNamedFieldElements() {
    return [
      'name' => 'edit-name',
      'password' => 'edit-password',
      'submit' => 'edit-submit',
    ];
  }

  /**
   * Login as a given user.
   *
   * @param string $username
   *   The username.
   * @param string $password
   *   The password.
   */
  public function loginAs($username, $password) {
    $this->find('@name')->setValue($username);
    $this->find('@password')->setValue($password);
    $this->find('@submit')->click();
    return $this;
  }

  /**
   * Assert the user was logged in successfully.
   */
  public function assertLoginSuccess() {
    $this->elementContains('@messages', 'You were logged in successfully.');
    return $this;
  }
  
  /**
   * Assert the user was logged in successfully.
   */
  public function assertLoginFail() {
    $this->elementContains('@messages', 'You failed to login.');
    return $this;
  }

}

在测试中使用页面对象可能看起来像这样

<?php

/**
 * The login page test case.
 */
class LoginPageTest extends PHPUnit\Framework\TestCase {

  /**
   * Test the login page.
   */
  public function testLoginPage() {
    $login = new LoginPage($this->session, $this->assert);
    $login->visit()
        ->loginAs('test-user', 'test-password')
        ->assertLoginSuccess();
  }

}

在用户在两个不同页面对象表示的不同界面之间导航时,页面对象上的方法可能会返回其他页面对象

<?php

/**
 * The article list page object.
 */
class ArticleListPage extends MinkPageObjects\PageObjectBase {

  /**
   * {@inheritdoc}
   */
  public function getUrl() {
    return '/articles';
  }

  /**
   * {@inheritdoc}
   */
  protected function getElements() {
    return [
      'articles' => '.articles article',
      'first-article-link' => '.articles article:first-child h2 a',
    ];
  }

  /**
   * Login as a given user.
   *
   * @param string $username
   *   The username.
   * @param string $password
   *   The password.
   */
  public function visitFirstArticle() {
    $this->find('@first-article-link')->click();
    return new ArticlePage($this->getSession(), $this->assertSession());
  }
  
  public function assertArticleCount($total) {
    $this->elementsCount('@articles', $total);
    return $this;
  }

}

然后,测试方法可以在多个不同页面对象的方法之间无缝转换

<?php
$article_list
    ->assertArticleCount(5)
    ->visitFirstArticle()
    ->assertAuthor('Sam');