如何使用 Github Actions 自动化 UI 测试

725 阅读4分钟

原文链接:storybook.js.org/blog/how-to…

开发人员每周花费4-8 小时来修复错误。如果错误潜入生产环境,情况只会变得更糟。修复它需要5-10 倍的时间。UI 测试是提供高质量体验不可或缺的一部分,但可能会耗费大量时间。每次更改后手动运行所有测试工作量太大。

Twilio、Target 和 Adobe 的领先 UI 工程团队自动化 UI 测试。当开发人员推送代码时触发测试。它们在后台执行并在完成时报告结果。这允许您自动检测回归。

本文向您展示如何使用 Github Actions 自动化您的测试管道。您将学习如何使用拉取请求检查报告测试的状态。在此过程中,我会指出要避免的常见错误。

持续的 UI 测试

审查代码是成为开发人员的重要组成部分。它有助于及早发现错误并保持高代码质量。

为了确保拉取请求 (PR) 不会中断生产,您通常会拉取代码并在本地运行测试套件。这会扰乱您的工作流程并花费大量时间。通过持续集成 (CI),您无需任何人工干预即可获得测试的所有好处。

您可以调整 UI、构建新功能或更新依赖项。当您打开拉取请求时,CI 服务器将自动运行全面的 UI 测试——视觉、组合、可访问性、交互和用户流。

您将通过 PR 徽章获得测试结果,其中提供了所有检查的摘要。

img

一目了然,您可以判断拉取请求是否通过了您的 UI 质量检查。如果是,请继续查看实际代码。如果没有,请深入查看日志以找出问题所在。

教程

一篇博文中,我介绍了 Taskbox 应用程序并演示了如何测试此 UI的各个方面。在此基础上,我们将使用 GitHub Actions 设置持续集成。抓住代码并跟随。

img

设置 CI

.github/workflows/ui-tests.yml在您的存储库中创建一个文件以开始使用。一个工作流程是一组的工作是要实现自动化。它由诸如推送提交或创建拉取请求之类的事件触发。

当代码被推送到我们存储库的任何分支时,我们的工作流将运行,它将有三个工作:

  • 使用 Jest 运行交互测试和可访问性审核
  • 使用 Chromatic 运行视觉和合成测试
  • 使用 Cypress 运行用户流测试
# .github/workflows/ui-tests.yml
name: 'UI Tests'

on: push

jobs:
  # Run interaction and accessibility tests with Axe
  interaction-and-accessibility:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Install dependencies
        run: yarn
      - name: Run test
        run: yarn test
  # Run visual and composition tests with Chromatic
  visual-and-composition:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 0 # Required to retrieve git history
      - name: Install dependencies
        run: yarn
      - name: Publish to Chromatic
        uses: chromaui/action@v1
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
          # Grab this from the Chromatic manage page
          projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }}
  # Run user flow tests with Cypress
  user-flow:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Install dependencies
        run: yarn
      - name: Cypress run
        uses: cypress-io/github-action@v2
        with:
          start: npm start

请注意,要运行 Chromatic,您需要CHROMATIC_PROJECT_TOKEN. 您可以从 Chromatic 管理页面获取它并将其添加到您的存储库机密中。虽然GITHUB_TOKEN默认情况下可用。

img

img

最后,创建一个新提交,将您的更改推送到 GitHub,您应该会看到您的工作流程在运行!

img

缓存依赖

每个作业独立运行,这意味着 CI 服务器必须在所有三个作业中安装依赖项。这会减慢测试运行速度。我们可以缓存依赖项,并且只有yarn install在锁定文件发生更改时才运行以避免这种情况。让我们更新工作流以包含install-cache作业。

name: 'UI Tests'

on: push

jobs:
  # Install and cache npm dependencies
  install-cache:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Commit
        uses: actions/checkout@v2
      - name: Cache yarn dependencies and cypress
        uses: actions/cache@v2
        id: yarn-cache
        with:
          path: |
            ~/.cache/Cypress
            node_modules
          key: ${{ runner.os }}-yarn-v1-${{ hashFiles('**/yarn.lock') }}
          restore-keys: |
            ${{ runner.os }}-yarn-v1
      - name: Install dependencies if cache invalid
        if: steps.yarn-cache.outputs.cache-hit != 'true'
        run: yarn
  # Run interaction and accessibility tests with Axe
  interaction-and-accessibility:
    runs-on: ubuntu-latest
    needs: install-cache
    steps:
      - uses: actions/checkout@v2
      - name: Restore yarn dependencies
        uses: actions/cache@v2
        id: yarn-cache
        with:
          path: |
            ~/.cache/Cypress
            node_modules
          key: ${{ runner.os }}-yarn-v1-${{ hashFiles('**/yarn.lock') }}
          restore-keys: |
            ${{ runner.os }}-yarn-v1
      - name: Run test
        run: yarn test
  # Run visual and composition tests with Chromatic
  visual-and-composition:
    runs-on: ubuntu-latest
    needs: install-cache
    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 0 # Required to retrieve git history
      - name: Restore yarn dependencies
        uses: actions/cache@v2
        id: yarn-cache
        with:
          path: |
            ~/.cache/Cypress
            node_modules
          key: ${{ runner.os }}-yarn-v1-${{ hashFiles('**/yarn.lock') }}
          restore-keys: |
            ${{ runner.os }}-yarn-v1
      - name: Publish to Chromatic
        uses: chromaui/action@v1
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
          # Grab this from the Chromatic manage page
          projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }}
  # Run user flow tests with Cypress
  user-flow:
    runs-on: ubuntu-latest
    needs: install-cache
    steps:
      - uses: actions/checkout@v2
      - name: Restore yarn dependencies
        uses: actions/cache@v2
        id: yarn-cache
        with:
          path: |
            ~/.cache/Cypress
            node_modules
          key: ${{ runner.os }}-yarn-v1-${{ hashFiles('**/yarn.lock') }}
          restore-keys: |
            ${{ runner.os }}-yarn-v1
      - name: Cypress run
        uses: cypress-io/github-action@v2
        with:
          start: npm start

我们还调整了其他三个作业以等待install-cache作业完成。这样他们就可以使用缓存的依赖项。推送另一个提交以重新运行工作流。

成功!您已经实现了测试工作流程的自动化。当您打开 PR 时,它会并行运行 Jest、Chromatic 和 Cypress,并在 PR 页面本身上显示结果。

img

充满信心地合并

您运行测试的频率越高,您遇到的错误就越少。Microsoft 研究支持的研究表明,通过自动化测试,您可以看到缺陷减少20.9%

UI 测试充当应用外观和感觉的健康检查。他们验证视觉外观,确认底层逻辑,甚至检测集成问题。持续集成可帮助您测试每个提交以减少错误,而无需您付出额外的努力。

当您的测试通过时,您将确信您的 UI 没有错误。