成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

利用 Rize 來(lái)進(jìn)行 UI 測(cè)試或 E2E 測(cè)試

yimo / 1191人閱讀

摘要:約定我們假定要被測(cè)試的頁(yè)面是這樣的標(biāo)題開(kāi)始編寫(xiě)測(cè)試首先是導(dǎo)入。我們推薦使用的語(yǔ)法當(dāng)然您也可以用方式第一件事是構(gòu)造一個(gè)實(shí)例然后要轉(zhuǎn)到要被測(cè)試的頁(yè)面。

之前我曾經(jīng)在《Rize - 一個(gè)可以讓你簡(jiǎn)單、優(yōu)雅地使用 puppeteer 的 Node.js 庫(kù)》一文簡(jiǎn)單介紹過(guò) Rize 這個(gè)庫(kù)。當(dāng)時(shí)僅僅是介紹這個(gè)庫(kù)本身,關(guān)于如何使用,我沒(méi)有給太多的指導(dǎo)。

這篇文章講的是如何使用 Rize 來(lái)做 UI 測(cè)試或 E2E 測(cè)試。

在正式開(kāi)始之前,先給可能沒(méi)了解過(guò) Rize 的同學(xué)做個(gè)簡(jiǎn)單的介紹:Rize 是一個(gè)提供了相對(duì)頂層并且可鏈?zhǔn)秸{(diào)用的 API 的庫(kù),可與 puppeteer 一起使用。目前開(kāi)源在 GitHub,地址是 https://github.com/g-plane/rize,歡迎大家前往 GitHub 給個(gè) star。

安裝

首先是安裝 Rize 和 puppeteer。

如果您使用 Yarn:

$ yarn add --dev rize puppeteer

如果您使用 npm:

$ npm install --save-dev rize puppeteer

考慮到國(guó)內(nèi)的網(wǎng)絡(luò)原因,您可能需要使用國(guó)內(nèi)的 Chromium 鏡像:

對(duì)于 Linux 或 macOS 用戶:

PUPPETEER_DOWNLOAD_HOST=https://storage.googleapis.com.cnpmjs.org yarn add --dev puppeteer rize

Windows 用戶:

SET PUPPETEER_DOWNLOAD_HOST=https://storage.googleapis.com.cnpmjs.org yarn add --dev puppeteer rize

(npm 用戶同理)

由于安裝 puppeteer 的時(shí)候會(huì)下載 Chromium,所以整個(gè)過(guò)程可能比較費(fèi)時(shí),需要耐心等待。

約定

我們假定要被測(cè)試的頁(yè)面是這樣的:


    
        標(biāo)題
    
    
        
Hello World!
Another Page
開(kāi)始編寫(xiě)測(cè)試

首先是導(dǎo)入。我們推薦使用 ES2015 的 import 語(yǔ)法:

import Rize from "rize"

當(dāng)然您也可以用 CommonJS 方式:

const Rize = require("rize")

第一件事是構(gòu)造一個(gè) Rize 實(shí)例:

describe("UI test", () => {
  it("example test", async () => {
    const rize = new Rize()
  })
})

然后要轉(zhuǎn)到要被測(cè)試的頁(yè)面。我們假定前面設(shè)定的頁(yè)面運(yùn)行在 http://localhost:8000/ 上,那么我們可以:

describe("UI test", () => {
  it("example test", async () => {
    const rize = new Rize()
    rize
      .goto("http://localhost:8000/")
   })
})
斷言 斷言頁(yè)面標(biāo)題

我們可以使用 assertTitle 方法來(lái)斷言當(dāng)前頁(yè)面的標(biāo)題:

describe("UI test", () => {
  it("example test", async () => {
    const rize = new Rize()
    rize
      .goto("http://localhost:8000/")
      .assertTitle("標(biāo)題")
   })
})
斷言文本內(nèi)容

可以使用 assertTitle 方法來(lái)斷言當(dāng)前頁(yè)面存在指定的文本:

describe("UI test", () => {
  it("example test", async () => {
    const rize = new Rize()
    rize
      .goto("http://localhost:8000/")
      .assertTitle("標(biāo)題")
      .assertSee("Hello World!")
   })
})

我們還可以明確在某個(gè)元素中存在指定文本,只需給出該元素的 CSS 選擇器即可:

describe("UI test", () => {
  it("example test", async () => {
    const rize = new Rize()
    rize
      .goto("http://localhost:8000/")
      .assertTitle("標(biāo)題")
      .assertSee("Hello World!")
      .assertSeeIn(".greeting", "Hello World!")
   })
})
斷言是否存在指定的類名

我們可以斷言某個(gè)元素存在指定的類名:

describe("UI test", () => {
  it("example test", async () => {
    const rize = new Rize()
    rize
      .goto("http://localhost:8000/")
      .assertTitle("標(biāo)題")
      .assertSee("Hello World!")
      .assertSeeIn(".greeting", "Hello World!")
      .assertClassHas("div", "greeting")
   })
})

還可以斷言不存在指定的類名:

describe("UI test", () => {
  it("example test", async () => {
    const rize = new Rize()
    rize
      .goto("http://localhost:8000/")
      .assertTitle("標(biāo)題")
      .assertSee("Hello World!")
      .assertSeeIn(".greeting", "Hello World!")
      .assertClassHas("div", "greeting")
      .assertClassMissing("div", "greet")
   })
})
斷言表單狀態(tài)

我們可以斷言一些表單控件的狀態(tài),例如復(fù)選框(checkbox)選中或未選中:

describe("UI test", () => {
  it("example test", async () => {
    const rize = new Rize()
    rize
      .goto("http://localhost:8000/")
      .assertTitle("標(biāo)題")
      .assertSee("Hello World!")
      .assertSeeIn(".greeting", "Hello World!")
      .assertClassHas("div", "greeting")
      .assertClassMissing("div", "greet")
      .assertChecked("[name="cb1"]")     // 斷言已選中
      .assertNotChecked("[name="cb2"]")  // 斷言未選中
   })
})
與頁(yè)面交互

在實(shí)際測(cè)試的過(guò)程中,我們不僅僅需要進(jìn)行一些斷言,還需要與頁(yè)面進(jìn)行交互。

例如,我們以上面的頁(yè)面為例,我們可以單擊那個(gè)按鈕:

describe("UI test", () => {
  it("example test", async () => {
    const rize = new Rize()
    rize
      .goto("http://localhost:8000/")
      .assertTitle("標(biāo)題")
      .assertSee("Hello World!")
      .assertSeeIn(".greeting", "Hello World!")
      .assertClassHas("div", "greeting")
      .assertClassMissing("div", "greet")
      .assertChecked("[name="cb1"]")     // 斷言已選中
      .assertNotChecked("[name="cb2"]")  // 斷言未選中
      .click("#btn")
   })
})

也可以單擊某個(gè)鏈接,我們只需要給出該鏈接上的文本:

describe("UI test", () => {
  it("example test", async () => {
    const rize = new Rize()
    rize
      .goto("http://localhost:8000/")
      .assertTitle("標(biāo)題")
      .assertSee("Hello World!")
      .assertSeeIn(".greeting", "Hello World!")
      .assertClassHas("div", "greeting")
      .assertClassMissing("div", "greet")
      .assertChecked("[name="cb1"]")     // 斷言已選中
      .assertNotChecked("[name="cb2"]")  // 斷言未選中
      .click("#btn")
      .clickLink("Another Page")
   })
})

當(dāng)然,我們還能與表單進(jìn)行交互。例如,勾選某個(gè)復(fù)選框:

describe("UI test", () => {
  it("example test", async () => {
    const rize = new Rize()
    rize
      .goto("http://localhost:8000/")
      .assertTitle("標(biāo)題")
      .assertSee("Hello World!")
      .assertSeeIn(".greeting", "Hello World!")
      .assertClassHas("div", "greeting")
      .assertClassMissing("div", "greet")
      .assertChecked("[name="cb1"]")     // 斷言已選中
      .assertNotChecked("[name="cb2"]")  // 斷言未選中
      .click("#btn")
      .clickLink("Another Page")
      .check("[name="cb2"]")
   })
})

或者取消勾選某個(gè)復(fù)選框:

describe("UI test", () => {
  it("example test", async () => {
    const rize = new Rize()
    rize
      .goto("http://localhost:8000/")
      .assertTitle("標(biāo)題")
      .assertSee("Hello World!")
      .assertSeeIn(".greeting", "Hello World!")
      .assertClassHas("div", "greeting")
      .assertClassMissing("div", "greet")
      .assertChecked("[name="cb1"]")     // 斷言已選中
      .assertNotChecked("[name="cb2"]")  // 斷言未選中
      .click("#btn")
      .clickLink("Another Page")
      .check("[name="cb2"]")
      .uncheck("[name="cb1"]")
   })
})
關(guān)閉瀏覽器

在完成所有工作之后,需要退出瀏覽器:

describe("UI test", () => {
  it("example test", async () => {
    const rize = new Rize()
    rize
      .goto("http://localhost:8000/")
      .assertTitle("標(biāo)題")
      .assertSee("Hello World!")
      .assertSeeIn(".greeting", "Hello World!")
      .assertClassHas("div", "greeting")
      .assertClassMissing("div", "greet")
      .assertChecked("[name="cb1"]")     // 斷言已選中
      .assertNotChecked("[name="cb2"]")  // 斷言未選中
      .click("#btn")
      .clickLink("Another Page")
      .check("[name="cb2"]")
      .uncheck("[name="cb1"]")
    await rize.end()
   })
})
更多

實(shí)際上 Rize 的功能遠(yuǎn)不只上面那些。想要獲取更多信息,可以前往以下頁(yè)面:

Rize 的 GitHub 倉(cāng)庫(kù):https://github.com/g-plane/rize (歡迎 star)

Rize 的文檔教程:https://rize.js.org/

Rize 所有的 API 參考:https://rize.js.org/api/classes/_index_.rize.html

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/52012.html

相關(guān)文章

  • 利用 Rize 來(lái)進(jìn)行 UI 測(cè)試 E2E 測(cè)試

    摘要:約定我們假定要被測(cè)試的頁(yè)面是這樣的標(biāo)題開(kāi)始編寫(xiě)測(cè)試首先是導(dǎo)入。我們推薦使用的語(yǔ)法當(dāng)然您也可以用方式第一件事是構(gòu)造一個(gè)實(shí)例然后要轉(zhuǎn)到要被測(cè)試的頁(yè)面。 之前我曾經(jīng)在《Rize - 一個(gè)可以讓你簡(jiǎn)單、優(yōu)雅地使用 puppeteer 的 Node.js 庫(kù)》一文簡(jiǎn)單介紹過(guò) Rize 這個(gè)庫(kù)。當(dāng)時(shí)僅僅是介紹這個(gè)庫(kù)本身,關(guān)于如何使用,我沒(méi)有給太多的指導(dǎo)。 這篇文章講的是如何使用 Rize 來(lái)做 U...

    Coding01 評(píng)論0 收藏0
  • 利用 Rize 來(lái)進(jìn)行 UI 測(cè)試 E2E 測(cè)試

    摘要:約定我們假定要被測(cè)試的頁(yè)面是這樣的標(biāo)題開(kāi)始編寫(xiě)測(cè)試首先是導(dǎo)入。我們推薦使用的語(yǔ)法當(dāng)然您也可以用方式第一件事是構(gòu)造一個(gè)實(shí)例然后要轉(zhuǎn)到要被測(cè)試的頁(yè)面。 之前我曾經(jīng)在《Rize - 一個(gè)可以讓你簡(jiǎn)單、優(yōu)雅地使用 puppeteer 的 Node.js 庫(kù)》一文簡(jiǎn)單介紹過(guò) Rize 這個(gè)庫(kù)。當(dāng)時(shí)僅僅是介紹這個(gè)庫(kù)本身,關(guān)于如何使用,我沒(méi)有給太多的指導(dǎo)。 這篇文章講的是如何使用 Rize 來(lái)做 U...

    Lin_R 評(píng)論0 收藏0
  • Rize - 一個(gè)可以讓你簡(jiǎn)單、優(yōu)雅的使用 puppeteer 的 Node.js 庫(kù)

    摘要:目前已經(jīng)成為了非常流行的的庫(kù),被廣泛用于爬蟲(chóng)或測(cè)試。然而,的幾乎所有的都是異步的,它返回的是一個(gè)。而提供了一系列的,使得測(cè)試變得簡(jiǎn)單方便,測(cè)試同樣沒(méi)有問(wèn)題。更多的可以參考的文檔鏈接在下方。 目前 puppeteer 已經(jīng)成為了非常流行的 Node.js 的庫(kù),被廣泛用于爬蟲(chóng)或 UI 測(cè)試。 我也很歡喜 puppeteer 這個(gè)庫(kù)。然而,puppeteer 的幾乎所有的 API 都是異步...

    JeOam 評(píng)論0 收藏0
  • Rize - 一個(gè)可以讓你簡(jiǎn)單、優(yōu)雅的使用 puppeteer 的 Node.js 庫(kù)

    摘要:目前已經(jīng)成為了非常流行的的庫(kù),被廣泛用于爬蟲(chóng)或測(cè)試。然而,的幾乎所有的都是異步的,它返回的是一個(gè)。而提供了一系列的,使得測(cè)試變得簡(jiǎn)單方便,測(cè)試同樣沒(méi)有問(wèn)題。更多的可以參考的文檔鏈接在下方。 目前 puppeteer 已經(jīng)成為了非常流行的 Node.js 的庫(kù),被廣泛用于爬蟲(chóng)或 UI 測(cè)試。 我也很歡喜 puppeteer 這個(gè)庫(kù)。然而,puppeteer 的幾乎所有的 API 都是異步...

    AZmake 評(píng)論0 收藏0
  • [緣起] 前端 E2E 測(cè)試的困境

    摘要:與其它自動(dòng)化測(cè)試不同,前端的測(cè)試一直是個(gè)老大難問(wèn)題,難點(diǎn)主要在于如何描述測(cè)試。自動(dòng)化測(cè)試的核心是檢查特定輸入能不能得到符合預(yù)期的結(jié)果。結(jié)構(gòu)不能反應(yīng)視圖的真實(shí)狀態(tài),很可能會(huì)出現(xiàn)雖然測(cè)試通過(guò),但實(shí)際上在用戶眼里仍然是錯(cuò)誤的表現(xiàn)。 與其它自動(dòng)化測(cè)試不同,前端的 E2E 測(cè)試一直是個(gè)老大難問(wèn)題,難點(diǎn)主要在于 如何描述測(cè)試。 自動(dòng)化測(cè)試的核心是檢查特定輸入能不能得到符合預(yù)期的結(jié)果。對(duì)于單元測(cè)試和...

    awokezhou 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<