Skip to content

Commit 92c1c7d

Browse files
author
fanniehuang
committed
feat(e2e): 录制完生成json,执行用例时再动态转成jest脚本,方便后期维护,增加功能修复bug之类的不需要重新录制脚本
re #80
1 parent 418b62c commit 92c1c7d

File tree

12 files changed

+326
-141
lines changed

12 files changed

+326
-141
lines changed

packages/wxa-cli/scripts/buildLib.sh

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
# npx webpack "./lib/shim/promise.finally.js" --mode production --env.platform=node -o ./lib-dist/es/promise.finally.js
22

3-
rm -f ./dist/tester/wxa-e2eTest/e2eRecord2jsTpl.ejs
3+
rm -f ./dist/tester/wxa-e2eTest/e2eTestCaseTpl.ejs
44
rm -rf ./lib-dist/wxa-e2eTest
55
mkdir -p ./lib-dist/wxa-e2eTest
66
mkdir -p ./dist/tester/wxa-e2eTest
77
ln ./src/tester/wxa-e2eTest/e2eTestSuite.js ./lib-dist/wxa-e2eTest/e2eTestSuite.js
88
ln ./src/tester/wxa-e2eTest/e2eRecordBtn.wxa ./lib-dist/wxa-e2eTest/e2eRecordBtn.wxa
9-
ln ./src/tester/wxa-e2eTest/e2eRecord2jsTpl.ejs ./dist/tester/wxa-e2eTest/e2eRecord2jsTpl.ejs
10-
9+
ln ./src/tester/wxa-e2eTest/e2eTestCaseTpl.ejs ./dist/tester/wxa-e2eTest/e2eTestCaseTpl.ejs
1110
echo $MODE;
1211
if test "$MODE" = 'dev'
1312
then

packages/wxa-cli/src/tester/e2eTester.js

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import crypto from 'crypto';
1313
import debugPKG from 'debug';
1414
import path from 'path';
1515
import mkdirp from 'mkdirp';
16+
import runTestCase from './wxa-e2eTest/runTestcase.js'
1617

1718
const debug = debugPKG('WXA:E2ETester');
1819
const E2E_TEST_COMPONENT = 'wxa-e2e-record-btn';
@@ -174,9 +175,15 @@ class TesterBuilder extends Builder {
174175

175176
console.log('E2ETester work done');
176177

177-
// if (cmd.watch) this.watch(cmd);
178+
if (!cmd.record) {
179+
setTimeout(() => {
180+
runTestCase(cmd, this.wxaConfigs);
181+
}, 3000)
182+
183+
}
178184
}
179185

186+
180187
listen(cmdOptions) {
181188
let {port=9421, cliPath} = cmdOptions;
182189
let server = new Server({port}, logger);
@@ -193,14 +200,14 @@ class TesterBuilder extends Builder {
193200
let cli = cliPath || path.join(this.wxaConfigs.wechatwebdevtools, clipath[process.platform]);
194201

195202
try {
196-
let recordString = await e2eRecord2js(data.record, {cliPath: cli, name: data.name});
203+
// let recordString = await e2eRecord2js(data.record, {cliPath: cli, name: data.name});
197204
let outputPathBase = path.join(this.current, cmdOptions.outDir, data.name);
198-
let e2eRecordOutputPath = `${outputPathBase}/index.test.js`;
205+
let e2eRecordOutputPath = `${outputPathBase}/record.js`;
199206
let apiRecordOutputPath = `${outputPathBase}/api.json`;
200207
// save file;
201208

202-
writeFile(e2eRecordOutputPath, recordString);
203-
writeFile(apiRecordOutputPath, JSON.stringify(data.apiRecord))
209+
writeFile(e2eRecordOutputPath, `module.exports = ${JSON.stringify(data.record, null, 4)}`);
210+
writeFile(apiRecordOutputPath, JSON.stringify(data.apiRecord, null, 4))
204211
} catch (e) {
205212
logger.error('生成测试案例失败', e);
206213
}

packages/wxa-cli/src/tester/readMe.md

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
* 小程序原生的showModal、showActionSheet上的点击操作,无法录制&回放。虽然可以往wxa/core植入点代码,知道用户点击了哪个,执行了哪个函数。但回放的时候,原生的元素取不到,如果直接执行对应函数的话,modal弹框会一直在界面上,除非用户操作不然都不会消失
77
* 已知bug:
88
* tap事件绑定在父元素上,且依赖子元素上data数据的话,会有问题。应该要每个元素都给id编号,然后tap事件找到detail.target真实触发的元素,回放的时候tap detail.target那个元素
9-
9+
* 待优化:
10+
* 不带-r参数时,即回放模式,仅添加元素id(回放测试用例时能找到对应元素),不侵入过多代码(现在会劫持各种tap等事件,植入全局按钮组件)
1011

1112
2019年8月22日
1213

@@ -41,14 +42,17 @@
4142

4243
# 使用手册
4344

45+
4446
### 测试脚本录制
4547
* 微信开发者工具,打开对应项目,勾选`不校验合法域名`
48+
* windows系统,wxa.config.js里配置wechatwebdevtools: 微信开发者工具目录
4649
* 项目目录下执行`wxa2 test --e2e -r`,开启录制模式
4750
* 开始脚本录制,录制完成后脚本会保存在`__wxa_e2e_test__`目录下
51+
* 脚本都录制完毕后需执行,`wxa2 test --e2e --base ` 回放用例并检查录制内容是否正确,且此次回放的截屏会作为后续回放用例的比较基准,用于判断测试是否通过,`--test=testName`可指定要回放的用例,多个用例逗号分隔
4852

4953
### 测试脚本回放
5054
* `npm i -g jest`
51-
* 项目下执行 `npm i miniprogram-automator`
55+
* 项目下执行 `npm i miniprogram-automator looks-same`
5256
* 开发者工具修改调试基础库 2.7.3以上(src/project.config.json需同步修改libVersion)
5357
* 项目根目录下添加文件`babel.config.js`
5458
```
@@ -83,5 +87,4 @@ module.exports = {
8387
}]
8488
}
8589
```
86-
* `wxa2 test --e2e` 进入测试用例回放模式
87-
* 项目根目录下执行`jest __wxa_e2e_test__`,将按顺序执行所有用例
90+
* `wxa2 test --e2e` 进入测试用例回放模式,`--test=testName`指定执行用例,多个用例逗号分隔,操作截屏以时间命名保存在测试用例目录中,带参数`--screenshot`则会与`expect_screenshot`的截屏进行diff

packages/wxa-cli/src/tester/wxa-e2eTest/e2eRecord2js.js

Lines changed: 0 additions & 28 deletions
This file was deleted.

packages/wxa-cli/src/tester/wxa-e2eTest/e2eRecord2jsTpl.ejs

Lines changed: 0 additions & 93 deletions
This file was deleted.

packages/wxa-cli/src/tester/wxa-e2eTest/e2eRecordBtn.wxa

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@ class e2eBtn {
5454
console.log('e2etest upload fileName:', this.data.fileName);
5555
let apiRecord = this.$$e2e_state.apiRecord;
5656
const apiRecordObj = [...apiRecord.entries()].reduce((obj, [key, value]) => (obj[key] = value, obj), {})
57-
console.log(apiRecord, apiRecordObj)
5857
try {
5958
let result = fetch('http://127.0.0.1:9421/record', {
6059
name: this.data.fileName,
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
const fs = require('fs');
2+
const ejs = require('ejs');
3+
const path = require('path');
4+
5+
const e2eRecord2js = (data) => {
6+
return new Promise((resolve, reject) => {
7+
ejs.renderFile(path.join(__dirname + '/e2eTestCaseTpl.ejs'), data, (err, str) => {
8+
if (err) {
9+
return reject(err);
10+
}
11+
resolve(str);
12+
});
13+
});
14+
};
15+
16+
module.exports = e2eRecord2js;

0 commit comments

Comments
 (0)