返回

如何在 Github 项目中实现 Salesforce scratch org 自动化测试?

javascript

如何在现有 Github 项目中实现 Salesforce scratch org 自动化测试?

你是否正面临这样的挑战:在已有的 Salesforce 项目中,你希望将 UI 自动化测试流程整合到 CircleCI 中,实现代码提交后自动运行单元测试和 UI 测试? 如何在现有的 Github 项目结构中实现 scratch org 的自动化创建、代码推送和登录,成为了你迈向自动化的第一步。

本文将详细介绍如何在现有 Github 项目中,利用 Selenium/JS 和 CircleCI 搭建 Salesforce scratch org 自动化测试流程,并提供清晰的项目结构示例和关键代码片段,助你轻松克服自动化测试的初始障碍。

清晰的项目结构:自动化测试的基石

在现有项目中集成自动化测试,清晰的项目结构至关重要。合理的目录结构可以提高代码可读性和可维护性,方便团队协作开发。我们可以参考以下示例项目结构,根据实际情况进行调整:

├── src  //存放 Salesforce 项目源代码
│   └── ... 
├── test //存放测试相关代码
│   ├── ui  //存放 UI 自动化测试代码
│   │   ├── pageObjects //存放页面对象模型文件
│   │   │   └── ...
│   │   ├── specs  //存放测试用例文件
│   │   │   └── ...
│   │   └── utils  //存放测试工具类文件
│   │       └── ...
│   └── unit  //存放单元测试代码
│       └── ...
├── .circleci  //存放 CircleCI 配置文件
│   └── config.yml
├── package.json  //项目依赖管理文件
└── sfdx-project.json  //Salesforce DX 项目配置文件
  • src 目录用于存放 Salesforce 项目的源代码。
  • test 目录则用于存放所有测试相关代码。
  • ui 目录专门存放 UI 自动化测试代码,其中包含页面对象模型文件、测试用例文件和测试工具类文件,使代码结构更加清晰。
  • unit 目录则用于存放单元测试代码。
  • .circleci 目录用于存放 CircleCI 配置文件,集中管理 CI/CD 流程。

配置自动化流程:打通 CI/CD 的任督二脉

完成项目结构搭建后,我们需要配置自动化流程,将各个环节串联起来。这个流程主要包含以下步骤:

  1. 授权 Dev Hub : 使用 SFDX CLI 工具,通过 OAuth 2.0 流程授权你的 Dev Hub 组织,为后续操作做好准备。
  2. 创建 Scratch Org : 使用 SFDX CLI 工具和项目中的 sfdx-project.json 文件,创建一个全新的 Scratch Org 用于测试,确保测试环境的独立性和一致性。
  3. 推送代码到 Scratch Org : 使用 SFDX CLI 工具将 src 目录下的源代码推送至新创建的 Scratch Org 中,将最新的代码部署到测试环境。
  4. 登录 Scratch Org : 使用 Selenium/JS 启动浏览器,并以测试用户的身份自动登录到 Scratch Org,为 UI 自动化测试做好准备。

以下是关键代码示例:

1. 授权 Dev Hub

const { exec } = require('child_process');

exec('sfdx force:auth:web:login -r https://test.salesforce.com -d MyDevHub', (error, stdout, stderr) => {
  if (error) {
    console.error(`授权 Dev Hub 失败: ${error}`);
    return;
  }
  console.log(`授权 Dev Hub 成功: ${stdout}`);
});

这段代码使用 sfdx force:auth:web:login 命令,通过 Web 登录的方式授权 Dev Hub。-r 参数指定登录地址,-d 参数指定 Dev Hub 的名称。

2. 创建 Scratch Org

exec('sfdx force:org:create -s -f config/project-scratch-def.json -a MyScratchOrg -d 30', (error, stdout, stderr) => {
  if (error) {
    console.error(`创建 Scratch Org 失败: ${error}`);
    return;
  }
  console.log(`创建 Scratch Org 成功: ${stdout}`);
});

这段代码使用 sfdx force:org:create 命令创建一个新的 Scratch Org。-s 参数表示创建一个非默认的 Scratch Org,-f 参数指定 Scratch Org 的配置文件路径,-a 参数指定 Scratch Org 的别名,-d 参数指定 Scratch Org 的有效天数。

3. 推送代码到 Scratch Org

exec('sfdx force:source:push -u MyScratchOrg', (error, stdout, stderr) => {
  if (error) {
    console.error(`代码推送失败: ${error}`);
    return;
  }
  console.log(`代码推送成功: ${stdout}`);
});

这段代码使用 sfdx force:source:push 命令将源代码推送到 Scratch Org。-u 参数指定目标 Scratch Org 的用户名或别名。

4. 登录 Scratch Org

const { Builder, By, Key, until } = require('selenium-webdriver');

async function loginToScratchOrg() {
  let driver = await new Builder().forBrowser('chrome').build();
  try {
    // 获取 Scratch Org 登录 URL
    let scratchOrgUrl = await exec('sfdx force:org:display -u MyScratchOrg --json').then(result => {
      let output = JSON.parse(result.stdout);
      return output.result.instanceUrl;
    });
    // 打开 Scratch Org 登录页面
    await driver.get(scratchOrgUrl + '/secur/frontdoor.jsp?sid=' + process.env.SFDX_USERNAME);
    // 输入用户名和密码
    await driver.findElement(By.id('username')).sendKeys(process.env.SFDX_USERNAME);
    await driver.findElement(By.id('password')).sendKeys(process.env.SFDX_PASSWORD);
    // 点击登录按钮
    await driver.findElement(By.id('Login')).click();
  } finally {
    await driver.quit();
  }
}

loginToScratchOrg();

这段代码使用 Selenium/JS 模拟用户登录 Scratch Org 的操作。首先,通过 sfdx force:org:display 命令获取 Scratch Org 的登录 URL。然后,使用 Selenium/JS 控制浏览器打开登录页面,并自动输入用户名和密码进行登录。

CircleCI 配置:将自动化进行到底

.circleci/config.yml 文件中配置 CircleCI 任务,可以让自动化测试更便捷。我们可以配置在每次代码提交后自动运行单元测试和 UI 自动化测试。

version: 2.1
jobs:
  build-and-test:
    docker:
      - image: circleci/node:14
    steps:
      - checkout
      - run: npm install
      - run: npm run test:unit
      - run: npm run test:ui

workflows:
  version: 2
  build-and-test:
    jobs:
      - build-and-test

这段代码定义了一个名为 build-and-test 的任务,该任务使用 circleci/node:14 镜像,执行以下步骤:

  1. checkout:检出代码库。
  2. npm install:安装项目依赖。
  3. npm run test:unit:运行单元测试。
  4. npm run test:ui:运行 UI 自动化测试。

常见问题解答

1. 如何在 CircleCI 中配置环境变量?

在 CircleCI 项目设置页面的 "Environment Variables" 部分,可以添加环境变量。例如,可以添加 SFDX_USERNAMESFDX_PASSWORD 环境变量,用于存储 Scratch Org 的登录凭据。

2. 如何处理 Selenium/JS 测试中的异步操作?

可以使用 async/await 语法处理 Selenium/JS 测试中的异步操作。例如,在登录 Scratch Org 的代码中,使用 await 等待页面加载完成,以及等待元素出现。

3. 如何提高 UI 自动化测试的稳定性?

可以使用页面对象模型 (Page Object Model) 模式,将页面元素和操作封装成独立的对象,提高代码的可读性和可维护性,进而提高测试的稳定性。

4. 如何在 CircleCI 中运行多个测试任务?

可以在 .circleci/config.yml 文件中定义多个任务,并在 workflows 部分配置任务的执行顺序。例如,可以定义一个运行单元测试的任务,一个运行 UI 自动化测试的任务,并将它们配置为顺序执行。

5. 如何查看 CircleCI 任务的运行日志?

在 CircleCI 项目页面的 "Jobs" 部分,可以查看所有任务的运行日志。可以根据日志信息排查问题,并优化测试流程。

通过以上步骤,你可以在现有 Github 项目中成功搭建 Salesforce scratch org 自动化测试流程。这将帮助你提高开发效率,保证代码质量,并将 Salesforce 测试流程与 CI/CD 流程无缝衔接。