Protractor - Protractor 風格指南



本章,我們將詳細學習 Protractor 的風格指南。

簡介

該風格指南由兩位軟體工程師建立:ING 的前端工程師 **Carmen Popoviciu** 和 Google 的軟體工程師 **Andres Dominguez**。因此,此風格指南也稱為 Carmen Popoviciu 和 Google 的 Protractor 風格指南。

此風格指南可分為以下五個要點:

  • 通用規則
  • 專案結構
  • 定位策略
  • 頁面物件
  • 測試套件

通用規則

以下是使用 Protractor 進行測試時必須注意的一些通用規則:

不要對已經進行單元測試的內容進行端到端測試

這是 Carmen 和 Andres 給出的第一個通用規則。他們建議我們不要對已經進行單元測試的程式碼執行 e2e 測試。其主要原因是單元測試比 e2e 測試快得多。另一個原因是,為了節省時間,我們必須避免重複測試(不要同時進行單元測試和 e2e 測試)。

只使用一個配置檔案

另一個重要的建議是,我們必須只使用一個配置檔案。不要為每個測試環境建立配置檔案。您可以使用 **grunt-protractor-coverage** 來設定不同的環境。

避免在測試中使用邏輯

我們必須避免在測試用例中使用 IF 語句或 FOR 迴圈,因為如果這樣做,測試可能會在沒有進行任何測試的情況下透過,或者執行速度非常慢。

使測試在檔案級別獨立

啟用共享時,Protractor 可以並行執行測試。然後,這些檔案將在不同的瀏覽器中按可用情況執行。Carmen 和 Andres 建議至少在檔案級別使測試獨立,因為 Protractor 執行它們的順序是不確定的,而且單獨執行測試非常容易。

專案結構

關於 Protractor 風格指南的另一個重要要點是專案的結構。以下是關於專案結構的建議:

以合理的結構分組 e2e 測試

Carmen 和 Andres 建議我們必須以對專案結構有意義的結構來分組我們的 e2e 測試。此建議背後的原因是查詢檔案會變得容易,並且資料夾結構更易於閱讀。此步驟還將 e2e 測試與單元測試分開。他們建議應避免以下型別的結構:

|-- project-folder
   |-- app
      |-- css
      |-- img
      |-- partials
         home.html
         profile.html
         contacts.html
      |-- js
         |-- controllers
         |-- directives
         |-- services
         app.js
         ...
      index.html
   |-- test
      |-- unit
      |-- e2e
         home-page.js
         home-spec.js
         profile-page.js
         profile-spec.js
         contacts-page.js
         contacts-spec.js

另一方面,他們推薦以下型別的結構:

|-- project-folder
   |-- app
      |-- css
      |-- img
      |-- partials
         home.html
         profile.html
         contacts.html
      |-- js
         |-- controllers
         |-- directives
         |-- services
         app.js
         ...
      index.html
   |-- test
      |-- unit
      |-- e2e
         |-- page-objects
            home-page.js
            profile-page.js
            contacts-page.js
         home-spec.js
         profile-spec.js
         contacts-spec.js

定位策略

以下是使用 Protractor 進行測試時必須注意的一些定位策略:

永遠不要使用 XPATH

這是 Protractor 風格指南中推薦的第一個定位策略。其背後的原因是 XPath 需要大量的維護,因為標記很容易發生變化。此外,XPath 表示式速度最慢,並且很難除錯。

始終優先使用 Protractor 特定的定位器,例如 by.model 和 by.binding

Protractor 特定的定位器(例如 by.model 和 by.binding)簡短、具體且易於閱讀。藉助它們,編寫定位器也變得非常容易。

示例

檢視

<ul class = "red">
   <li>{{color.name}}</li>
   <li>{{color.shade}}</li>
   <li>{{color.code}}</li>
</ul>

<div class = "details">
   <div class = "personal">
      <input ng-model = "person.name">
   </div>
</div>

對於以上程式碼,建議避免以下內容:

var nameElement = element.all(by.css('.red li')).get(0);
var personName = element(by.css('.details .personal input'));

另一方面,建議使用以下內容:

var nameElement = element.all(by.css('.red li')).get(0);
var personName = element(by.css('.details .personal input'));
var nameElement = element(by.binding('color.name'));
var personName = element(by.model('person.name'));

當沒有可用的 Protractor 定位器時,建議優先使用 by.id 和 by.css。

始終避免對頻繁更改的文字使用文字定位器

我們必須避免使用基於文字的定位器,例如 by.linkText、by.buttonText 和 by.cssContainingText,因為按鈕、連結和標籤的文字會隨著時間的推移而頻繁更改。

頁面物件

如前所述,頁面物件封裝了關於應用程式頁面上元素的資訊,因此幫助我們編寫更簡潔的測試用例。頁面物件的一個非常有用的優點是它們可以在多個測試中重複使用,如果我們的應用程式模板發生了更改,我們只需要更新頁面物件即可。以下是使用 Protractor 進行測試時必須注意的一些頁面物件建議:

要與被測頁面互動,請使用頁面物件

建議使用頁面物件與被測頁面互動,因為它們可以封裝關於被測頁面上元素的資訊,並且也可以重複使用。

始終為每個檔案宣告一個頁面物件

我們應該在它自己的檔案中定義每個頁面物件,因為它可以保持程式碼簡潔,並且查詢內容變得容易。

在頁面物件檔案的末尾始終使用單個 module.exports

建議每個頁面物件都應該宣告一個類,以便我們只需要匯出一個類。例如,應避免以下物件檔案的用法:

var UserProfilePage = function() {};
var UserSettingsPage = function() {};
module.exports = UserPropertiesPage;
module.exports = UserSettingsPage;

但另一方面,建議使用以下內容:

/** @constructor */
var UserPropertiesPage = function() {};

module.exports = UserPropertiesPage;

在頂部宣告所有必需的模組

我們應該在頁面物件的頂部宣告所有必需的模組,因為它使模組依賴關係清晰易於查詢。

在測試套件的開頭例項化所有頁面物件

建議在測試套件的開頭例項化所有頁面物件,因為這將使依賴關係與測試程式碼分開,並使依賴關係可用於套件的所有規範。

不要在頁面物件中使用 expect()

我們不應該在頁面物件中使用 expect(),即我們不應該在頁面物件中進行任何斷言,因為所有斷言都必須在測試用例中完成。

另一個原因是,測試的閱讀者應該能夠僅透過閱讀測試用例來理解應用程式的行為。

廣告