Protractor - 物件



本章詳細討論了 Protractor 中的物件。

什麼是頁面物件?

頁面物件是一種設計模式,它在編寫端到端測試中變得流行起來,目的是增強測試維護並減少程式碼重複。它可以定義為一個面向物件的類,作為被測應用 (AUT) 頁面介面。但是,在深入研究頁面物件之前,我們必須瞭解自動化 UI 測試的挑戰以及處理這些挑戰的方法。

自動化 UI 測試的挑戰

以下是自動化 UI 測試的一些常見挑戰:

UI 更改

使用 UI 測試時非常常見的問題是 UI 中發生的更改。例如,按鈕或文字框等經常發生更改,併為 UI 測試帶來問題。

缺乏 DSL(領域特定語言)支援

UI 測試的另一個問題是缺乏 DSL 支援。由於這個問題,很難理解正在測試的內容。

大量重複/程式碼重複

UI 測試中的下一個常見問題是存在大量重複或程式碼重複。可以透過以下幾行程式碼來理解:

element(by.model(‘event.name’)).sendKeys(‘An Event’);
element(by.model(‘event.name’)).sendKeys(‘Module 3’);
element(by.model(‘event.name’));

維護困難

由於上述挑戰,維護變得很頭疼。這是因為我們必須找到所有例項,替換為新名稱、選擇器和其他程式碼。我們還需要花費大量時間來使測試與重構保持一致。

測試失敗

UI 測試中的另一個挑戰是測試中發生大量失敗。

處理挑戰的方法

我們已經看到了一些 UI 測試的常見挑戰。處理此類挑戰的一些方法如下:

手動更新引用

處理上述挑戰的第一個選擇是手動更新引用。此選項的問題在於我們必須手動更改程式碼以及測試。當您只有一個或兩個測試檔案時,可以這樣做,但是如果專案中有數百個測試檔案怎麼辦?

使用頁面物件

處理上述挑戰的另一個選擇是使用頁面物件。頁面物件基本上是一個簡單的 JavaScript,它封裝了 Angular 模板的屬性。例如,以下規範檔案是在沒有頁面物件和有頁面物件的情況下編寫的,以便理解其區別:

無頁面物件

describe('angularjs homepage', function() {
   it('should greet the named user', function() {
      browser.get('http://www.angularjs.org');
      element(by.model('yourName')).sendKeys('Julie');
      var greeting = element(by.binding('yourName'));
      expect(greeting.getText()).toEqual('Hello Julie!');
   });
});

有頁面物件

要使用頁面物件編寫程式碼,首先需要建立一個頁面物件。因此,上面示例的頁面物件可能如下所示:

var AngularHomepage = function() {
   var nameInput = element(by.model('yourName'));
   var greeting = element(by.binding('yourName'));

   this.get = function() {
      browser.get('http://www.angularjs.org');
   };

   this.setName = function(name) {
      nameInput.sendKeys(name);
   };
   
   this.getGreetingText = function() {
      return greeting.getText();
   };
};
module.exports = new AngularHomepage();

使用頁面物件組織測試

我們在上面的示例中已經看到了頁面物件的使用來處理 UI 測試的挑戰。接下來,我們將討論如何使用它們來組織測試。為此,我們需要修改測試指令碼,而無需修改測試指令碼的功能。

示例

為了理解這個概念,我們採用上面帶有頁面物件的配置檔案。我們需要修改測試指令碼如下:

var angularHomepage = require('./AngularHomepage');
describe('angularjs homepage', function() {
   it('should greet the named user', function() {
      angularHomepage.get();

      angularHomepage.setName('Julie');
   
      expect(angularHomepage.getGreetingText()).toEqual
      ('Hello Julie!');
   });
});

請注意,頁面物件的路徑相對於您的規範。

同樣,我們還可以將測試套件分成多個測試套件。然後可以更改配置檔案如下:

exports.config = {
   // The address of a running selenium server.
   seleniumAddress: 'https://:4444/wd/hub',

   // Capabilities to be passed to the webdriver instance.
   capabilities: {
      'browserName': 'chrome'
   },
   // Spec patterns are relative to the location of the spec file. They may
   // include glob patterns.
   suites: {
      homepage: 'tests/e2e/homepage/**/*Spec.js',
      search: ['tests/e2e/contact_search/**/*Spec.js',
         'tests/e2e/venue_search/**/*Spec.js']
   },

   // Options to be passed to Jasmine-node.
   jasmineNodeOpts: {
      showColors: true, // Use colors in the command line report.
   }
};

現在,我們可以輕鬆地在執行一個或另一個測試套件之間切換。以下命令將僅執行測試的主頁部分:

protractor protractor.conf.js --suite homepage

同樣,我們可以使用以下命令執行特定的測試套件:

protractor protractor.conf.js --suite homepage,search
廣告
© . All rights reserved.