软件技术学习笔记

个人博客,记录软件技术与程序员的点点滴滴。

体验Cypress E2E测试

相比Puppeteer,Cypress支持更多的浏览器(Chrome家族、Edge、Firefox),在编写测试用例时不需要使用代码去拉起浏览器。Cypress Test Runner是开源软件且免费的,在本地运行、不使用Dashboard Web服务时,不需要付费。

Cypress可以用在端到端测试、集成测试、单元测试,但是作为一款一站式重型框架,比较合适用在端到端测试。单元测试,在NodeJS中使用jsdom模拟浏览器就足够了。

以下内容的操作均针对一个npm项目。

1. Cypress 安装

yarn add cypress -D

或者在package.json添加如下内容,再执行yarn:

{
  "scripts": {
    "test": "cypress run"
  },
  "devDependencies": {
    "cypress": "^4.9.0"
  }
}

2. 添加Cypress配置

在项目根目录添加cypress.json,内容如下:

{
  "baseUrl": "https://example.cypress.io"
}

baseUrl是给测试用例中开始浏览使用的。

3. 添加E2E测试用例

在项目的cypress/integration/目录中添加sample_real_spec.js,内容如下:

// sample_real_spec.js
/// <reference types="cypress" />

describe('My First Real Test', function() {
  it('Gets, types and asserts', function() {
    // https://example.cypress.io
    cy.visit('/')

    cy.contains('type').click()

    // 应该存在一个包含'/commands/actions'的新URL
    cy.url().should('include', '/commands/actions')

    // 获取一个输入, 输入进去并且验证文本值已经更新了
    cy.get('.action-email')
      .type('fake@email.com')
      .should('have.value', 'fake@email.com')
  })
})

普通的单元测试用例也可以添加,如下:

// sample_spec.js
/// <reference types="cypress" />

describe('My First Test', function () {
  it('Does not do much!', function () {
    expect(true).to.equal(true)
  })
})

4. 跑测试用例

可以选择下面的一种命令开始:

# Electron headless
yarn run cypress run

# Electron
yarn run cypress run --headed

# Chrome
yarn run cypress run --browser chrome

5. 查看结果

执行 yarn test,控制台输出如下:

PS D:\Dev\Web\Testing\cypress-1> yarn test
yarn run v1.22.4
$ cypress run


====================================================================================================

  (Run Starting)

  ┌────────────────────────────────────────────────────────────────────────────────────────────────┐
  │ Cypress:    4.9.0                                                                              │
  │ Browser:    Electron 80 (headless)                                                             │
  │ Specs:      2 found (sample_real_spec.js, sample_spec.js)                                      │
  └────────────────────────────────────────────────────────────────────────────────────────────────┘


────────────────────────────────────────────────────────────────────────────────────────────────────

  Running:  sample_real_spec.js                                                             (1 of 2)


  My First Real Test
    √ Gets, types and asserts (8166ms)


  1 passing (8s)


  (Results)

  ┌────────────────────────────────────────────────────────────────────────────────────────────────┐
  │ Tests:        1                                                                                │
  │ Passing:      1                                                                                │
  │ Failing:      0                                                                                │
  │ Pending:      0                                                                                │
  │ Skipped:      0                                                                                │
  │ Screenshots:  0                                                                                │
  │ Video:        true                                                                             │
  │ Duration:     8 seconds                                                                        │
  │ Spec Ran:     sample_real_spec.js                                                              │
  └────────────────────────────────────────────────────────────────────────────────────────────────┘


  (Video)

  -  Started processing:  Compressing to 32 CRF
  -  Finished processing: D:\Dev\Web\Testing\cypress-1\cypress\videos\sample_real_spe     (1 second)
                          c.js.mp4


────────────────────────────────────────────────────────────────────────────────────────────────────

  Running:  sample_spec.js                                                                  (2 of 2)


  My First Test
    √ Does not do much! (141ms)


  1 passing (165ms)


  (Results)

  ┌────────────────────────────────────────────────────────────────────────────────────────────────┐
  │ Tests:        1                                                                                │
  │ Passing:      1                                                                                │
  │ Failing:      0                                                                                │
  │ Pending:      0                                                                                │
  │ Skipped:      0                                                                                │
  │ Screenshots:  0                                                                                │
  │ Video:        true                                                                             │
  │ Duration:     0 seconds                                                                        │
  │ Spec Ran:     sample_spec.js                                                                   │
  └────────────────────────────────────────────────────────────────────────────────────────────────┘


  (Video)

  -  Started processing:  Compressing to 32 CRF
  -  Finished processing: D:\Dev\Web\Testing\cypress-1\cypress\videos\sample_spec.js.    (0 seconds)
                          mp4


====================================================================================================

  (Run Finished)


       Spec                                              Tests  Passing  Failing  Pending  Skipped
  ┌────────────────────────────────────────────────────────────────────────────────────────────────┐
  │ √  sample_real_spec.js                      00:08        1        1        -        -        - │
  ├────────────────────────────────────────────────────────────────────────────────────────────────┤
  │ √  sample_spec.js                           161ms        1        1        -        -        - │
  └────────────────────────────────────────────────────────────────────────────────────────────────┘
    √  All specs passed!                        00:08        2        2        -        -        -

Done in 29.98s.

可以看到输出两个视频文件,其中录制整个测试过程的页面情况:

PS D:\Dev\Web\Testing\cypress-1> dir .\cypress\videos\

    目录: D:\Dev\Web\Testing\cypress-1\cypress\videos


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----         2020/7/2     11:15         138567 sample_real_spec.js.mp4
-a----         2020/7/2     11:15          19090 sample_spec.js.mp4

视频内容如下:

Cypress测试视频