# 自动化测试插件@extension
## 插件说明@description
本插件,用于在HBuilderX内运行uni-app自动化测试,支持H5、微信小程序、android、ios自动化测试。
主要功能有:
- 初始化测试环境(创建测试配置文件、以及安装测试所需的环境)
- 运行测试 (运行项目下所有测试用例、运行某一个测试用例)
- 新建测试用例 (uni-app pages页面,右键菜单【新建测试用例】)
- 查看历史测试报告 (HBuilderX顶部运行菜单)
## 测试注意事项@note
1. 本插件支持`uni-app普通项目`和`uniapp-cli项目`。uniapp-cli项目,运行自动化测试,需要在当前项目下安装自动化测试依赖。
2. Windows电脑不支持运行测试到`ios手机`。
3. MacOSX电脑,仅支持运行测试到`iOS模拟器`,不支持ios真机,测试iOS模拟器,需要电脑装安装XCode。
4. 运行测试到H5,仅支持`chrome`浏览器,不支持其它浏览器。
5. 运行测试到Android手机,如果HBuilderX仅检测到一个android设备,`直接`运行测试到当前已连接设备。`多个`设备时,会弹窗要求选择手机。
6. node: 当本机未安装node时,将使用HBuilderX`内置node`运行测试。反之,本机安装了node,则使用本机的node。
7. 运行测试到微信小程序,必须在manifest.json内,配置微信小程序 appid。如果微信开发者工具无法成功打开项目,首次请手动打开。
## 插件安装@test-install
[插件安装地址](https://ext.dcloud.net.cn/plugin?id=5708)
如下图所示,在插件市场,进入[插件详情页](https://ext.dcloud.net.cn/plugin?id=5708),点击【导入插件】,会自动拉起本地安装的HBuilderX。
> 特别注意:插件安装,依赖HBuilderX 终端插件。
## 测试环境安装@env
**插件依赖:**
- H5、微信、ios、android自动化测试依赖`puppeteer`、`adbkit`、`node-simctl`、`jest`、`playwright`,运行插件时,如果未安装此依赖,将会弹窗自动安装。
- `注意`:本插件0.0.3版本及以下,node: 当本机未安装node时,将使用HBuilderX内置的node运行测试。反之,本机安装了node,则使用本机的node。
- `注意`:本插件0.0.4+版本,新增配置项 支持自定义设置使用何种node版本进行uni-app编译
**特别注意:**
- uni-app普通项目,需要通过插件`hbuilderx-for-uniapp-test`来安装测试环境。
- uniapp-cli项目,只需在项目下安装相关测试依赖即可。[详情](#uniapp-cli项目)
### uni-app普通项目@uni-app
uni-app普通项目,`初始化测试环境`或`运行测试`时,如果未安装相关依赖,会自动安装。
如下图所示,项目管理器,选中项目,右键菜单【初始化测试环境】
注意:安装环境依赖时,如果检测到项目下不存在测试配置文件[env.js](/docs/file/env)和[jest.config.js](/docs/file/jest_config),则会自动创建测试配置文件。
### uniapp-cli项目@cli
uniapp-cli项目,自动化测试运行,将使用**项目下的依赖库**。
打开命令行,进入项目目录,输入如下命令进行安装:
```shell
npm install --save cross-env puppeteer adbkit node-simctl jest playwright @playwright/test
```
## 创建测试用例@create-testcase
uni-app项目,pages页面,右键菜单,创建测试用例
## 测试运行@test-run
创建测试用例之后,选中项目,右键菜单【运行uni-app自动化测试】,选择运行平台,即可开始运行测试。
**注意**:如果要运行指定的测试用例,请在项目管理器**选中**要运行的用例,右键菜单【运行当前测试用例】
### 测试平台说明@platform
- Windows电脑**不支持**运行测试到`ios手机`
- MacOSX电脑,仅支持运行测试到`ios模拟器`,**不支持**ios真机。
- 运行测试到H5,仅支持`chrome`浏览器,**不支持**其它浏览器。
- 运行测试到Android手机,如果HBuilderX仅检测到**一个android设备**,直接运行测试到当前已连接设备。多个设备时,会弹窗要求选择手机。
### 选择测试平台@select-platform
如下图所示,运行测试时,支持选择对应平台。
### 选择设备@select-devices
> 如果无法获取到设备信息,请[参考](https://ask.dcloud.net.cn/article/97)
## 插件配置@extension-config
点击菜单【设置】【插件配置】,找到hbuilderx-for-uniapp-test项,即可看到设置项。
**如上图**
- 支持自定义**`测试报告`**路径。
- 自动修改jest.config.js文件中的testMatch,默认为`true`。去掉勾选后,将不再自动修改testMatch。
- 插件0.0.4+版本,新增配置项 支持自定义设置使用何种node版本进行uni-app编译。即您可以选择使用HBuilderX`内置的Node`、还是使用`操作系统`安装的Node进行uni-app编译。
## 如何编写测试用例@howToWriteTestcase
> uni-app自动化测试,使用了业内常见的jest测试库。
- uni-app项目,pages目录下,右键菜单【创建测试用例】,选择模板。
- 测试用例文件名,必须为xxx.test.js
- 测试用例编写,请遵循jest规范。
### jest用例解析@jest-testcase
下面将使用一个最简单的示例,来讲解测试用例的组成。
- **describe** 表示一组用例, decribe会形成一个作用域
- **it** 测试函数
- **test** 测试函数,类似it
- **expect** 匹配器。 [使用文档](https://jestjs.io/zh-Hans/docs/expect)
```js
# 求和测试
function sum(a, b) {
return a + b;
};
describe("sum test", () => {
it('adds 1 + 2 to equal 3', () => {
expect(sum(1, 2)).toBe(3);
});
test('adds 1 + 1 to equal 3', () => {
expect(sum(1, 1)).toBe(3);
});
})
```
### uni-app页面用例示例@example
以uni-app【默认模板】index页面为例。
编写测试用例,检查`index.vue`页面,标题是否为`Hello`
```js
describe('test title', () => {
let page;
beforeAll(async () => {
page = await program.currentPage();
await page.waitFor(3000);
});
it('check page title', async () => {
const el = await page.$('.title');
const titleText = await el.text();
expect(titleText).toEqual('Hello');
});
});
```
扩展:如上测试代码中,使用了`beforeAll`函数,它用于在所有测试之前执行。[了解jest更多钩子函数](/docs/jest/SetupTeardown)
## Setup and Teardown
> 通常在编写测试时,您需要在测试运行之前进行一些设置工作,并且在测试运行之后需要进行一些完成工作。可以使用Jest的钩子函数来解决这个问题.
**jest中有4个钩子函数**
- beforeAll:所有测试之前执行
- afterAll:所有测试执行完之后
- beforeEach:每个测试实例之前执行
- afterEach:每个测试实例完成之后执行
文档扩展: [jest setup-teardown](https://jestjs.io/docs/setup-teardown)
### 钩子函数的执行顺序@sequence
用下列代码,我们来查看一下函数执行顺序
```js
describe('test Run Sequence', () => {
beforeAll(() => {
console.log('1 - beforeAll');
});
afterAll(() => {
console.log('1 - afterAll');
});
beforeEach(() => {
console.log('1 - beforeEach');
});
afterEach(() => {
console.log('1 - afterEach');
});
test('test', () => {
console.log('1 - test')
});
});
```
**运行结果**
```js
test Run Sequence
✓ test (4 ms)
console.log
1 - beforeAll
console.log
1 - beforeEach
console.log
1 - test
console.log
1 - afterEach
console.log
1 - afterAll
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 0.454 s
```
## 内置Jest代码块@snippets
> 为了更快速的编写测试用例,本插件内置了jest部分代码块
|prefix | 代码块 |
|-- |-- |
|describe |describe('', () => {}); |
|test |test('', () => {}); |
|ta |test('', async () => {await}); |
|beforeAll |beforeAll(() => {}); |
|afterEach |afterEach(() => {}); |
|afterAll |afterAll(() => {}); |
|beforeAll |beforeAll(() => {}); |