如何在 Github 项目中实现 Salesforce scratch org 自动化测试?
2024-07-16 13:00:25
如何在现有 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 的任督二脉
完成项目结构搭建后,我们需要配置自动化流程,将各个环节串联起来。这个流程主要包含以下步骤:
- 授权 Dev Hub : 使用 SFDX CLI 工具,通过 OAuth 2.0 流程授权你的 Dev Hub 组织,为后续操作做好准备。
- 创建 Scratch Org : 使用 SFDX CLI 工具和项目中的
sfdx-project.json
文件,创建一个全新的 Scratch Org 用于测试,确保测试环境的独立性和一致性。 - 推送代码到 Scratch Org : 使用 SFDX CLI 工具将
src
目录下的源代码推送至新创建的 Scratch Org 中,将最新的代码部署到测试环境。 - 登录 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
镜像,执行以下步骤:
checkout
:检出代码库。npm install
:安装项目依赖。npm run test:unit
:运行单元测试。npm run test:ui
:运行 UI 自动化测试。
常见问题解答
1. 如何在 CircleCI 中配置环境变量?
在 CircleCI 项目设置页面的 "Environment Variables" 部分,可以添加环境变量。例如,可以添加 SFDX_USERNAME
和 SFDX_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 流程无缝衔接。