Macaca 如何从头编写你的 Macaca 测试用例

小帅 · March 29, 2016 · Last by xi replied at October 28, 2016 · 2489 hits

前置条件

  • 安装环境
  • 新建一个 Macaca 工程目录,macaca-client 会默认跑 macaca-test 文件夹下所有 .test.js 为后缀的文件。
| -- README.md
| -- macaca-test
| | -- lib
| | -- webdriver-client.js
| | -- macaca-pc.test.js
| | -- macaca-mobile.test.js
| -- package.json
  • 配置你的 package.json 文件, 最重要的是需要配置开发环境的依赖 devDependencies
{
"name": "macaca-test-sample",
"version": "0.1.0",
"description": "macaca-test-sample",
"keywords": [
"sample"
],
"dependencies": {
},
"devDependencies": {
"wd-next": "*",
"macaca-chromedriver": "*",
"wd": "*"
},
"author": "your name",
"email": "your email",
"license": "MIT"
}
  • 在项目根目录下执行 cnpm i 安装 node 模块

你要测什么?

A. PC(跳到1)
B. iOS/Android(跳到2)

1. 桌面浏览器端测试

  • PC 用例 API:wd-next 是我们用 Node.js 对 selenium-webdriver 做了一层封装,接口与 WebDriver 标准统一。
  • 引用 macaca-chromedriver ,这是我们用 Node.js 对 ChromeDriver 进行的封装,ChromeDriver 最终会根据参数实例化一个 WebDriver 实例,你最终看到的就是运行了一个 standalone 的 Chrome 浏览器。
// 文件 macaca-pc.test.js
var path = require('path');
var wd = require('wd-next'); // 引用 wd-next
var macacachromedriver = require('macaca-chromedriver'); // 引用 macaca-chromedriver

module.exports = (options) => {
var binPath = macacachromedriver.binPath;
process.env.PATH = `${process.env.PATH}:${path.dirname(binPath)}`;

return wd;
};

  • 查询 wd-next 编写测试用例。编写用例前,一定要先初始化一个 promise wd.initPromiseChain(),之后 it 中的所有用例的方法都是使用 promise 链式调用方法
// 文件 macaca-pc.test.js
var path = require('path');
var wd = require('wd-next'); // 引用 wd-next
var macacachromedriver = require('macaca-chromedriver'); // 引用 macaca-chromedriver

module.exports = (options) => {
var binPath = macacachromedriver.binPath;
process.env.PATH = `${process.env.PATH}:${path.dirname(binPath)}`;

/*
* 开始编写测试用例
*/

describe('macaca desktop sample', function () {
this.timeout(5 * 60 * 1000);

const driver = wd.initPromiseChain(); // 初始化一个promise
const initialURL = 'https://www.baidu.com';

before((done) = > {
return driver
.init()
.setNormalSize()
.end(done);
});

it('#0 should go into macaca', function () {
return driver
.get(initialURL)
.sleep(3000);
});

it('#1 should works with macaca', function () {
return driver
.elementById('kw')
.sendKeys('macaca')
.sleep(3000)
.elementById('su')
.click()
.sleep(5000)
.source()
.then(function (html) {
html.should.containEql('macaca');
})
.takeScreenshot();
});
});

return wd;
};

  • 在工程根目录下执行命令行 macaca run Bravo! 就可以看到啦~

2. 移动端测试

  • iOS/Android 用例API: 我们推荐使用 wd.js 或者 webdriverio
  • 建议可以根据自己的 APP 封装一层自己的 webdriver-client, 同时适配 iOS 和 Android。在 macaca-test/lib/ 下新建文件 webdriver-client.js,以 login 为例

iOS 代码实现如下:

module.exports = function(username, password) {
return this
.waitForElementByXPath('//UIATextField[1]')
.sendKeys(username)
.waitForElementByXPath('//UIASecureTextField[1]')
.sendKeys(password)
.sleep(1000)
.sendKeys('\n')
.waitForElementByName('Login')
.click()
.sleep(5000);
};

但是由于 Android 下元素名会不同,实现如下:

module.exports = function(username, password) {
return this
.waitForElementsByClassName('android.widget.EditText', {}, 120000)
.then(function(els) {
return els[0];
})
.sendKeys(username)
.sleep(1000)
.elementsByClassName('android.widget.EditText')
.then(function(els) {
return els[1];
})
.sendKeys(password)
.sleep(1000)
.waitForElementByName('Login')
.click()
.sleep(5000);
};

可以查看我们已经写好的例子
注意!这不是通用的 webdriver-client ,你需要根据自己的 APP 封装出自己的 webdriver-client。

  • 引入你的 webdriver-client 模块,查询 wd.js, 开始编写用例。
// 这里是 wd 实例初始化
var wd = require('./lib/webdriver-client')({
platformName: platform,
app: 'path/to/your/app'
});

describe('macaca mobile sample', function() {
this.timeout(5 * 60 * 1000);

var driver = wd.initPromiseChain();

before(function() {
return driver.initDriver();
});

after(function() {
return driver
.sleep(1000)
.quit();
});

it('#1 should login success', function() {
return driver
.login('12345678', '111111')
.sleep(1000);
});

...

});

  • 在工程根目录下执行命令行 macaca run --server 用例就可以跑起来了。

最后

iOS效果 https://testerhome.com/topics/4359

Android效果 https://testerhome.com/topics/4442

PC效果 https://testerhome.com/topics/4523

共收到 17 条回复 时间 点赞

比appium 好用吗?

—— 来自TesterHome官方 安卓客户端

小帅 #2 · March 30, 2016 作者

macaca支持多平台、跨平台的解决方案。Macaca使用非常简单,是目前我认为的最优解方案。

macaca 做自动化需要源码吗,比如IOS上APP证书及版本问题,没有源码,会对自动化来说很麻烦

小帅 #4 · March 30, 2016 作者

@holysor 不需要 只需要指定到你打包好的app即可

var wd = require('./lib/webdriver-client')({
platformName: platform,
app: 'path/to/your/app' // 这里指定到你app的文件目录,也可以是url
});


跑的PC端的例子,结果这样,是devDependencies问题吗

没有APP源码的人怎么玩

小帅 #7 · March 30, 2016 作者

@holysor before((done)=> { }) => 这个中间多了空格

小帅 #8 · March 30, 2016 作者

@carl https://github.com/xudafeng/ios-app-bootstrap 可以用我们写好的 sample app 写着玩

#7楼 @tsj1107 谢谢!Node.js还没学过。。。没报错

可以断点调试吗? 真机具体怎么传入udid?

小帅 #11 · March 31, 2016 作者

@lylh 真机看这里 https://testerhome.com/topics/4541 断点调试之后我的小伙伴会有介绍哦

感觉没有calabash(cucumber)的来的舒服啊,JS写用例看上去好混乱,还是cucumber更成熟啊

#14楼 @dongyupu 是Node.js,可以了解看看

@tsj1107 大神,用什么IDE工具去编写macaca用例脚本啊? 就是能直接. 点出来API接口语法的那种。
JetBrains WebStorm 我用这个,然后打开示例项目,点出来的是 mocha的API啊。

小马 [Topic was deleted] 中提及了此贴 08 Aug 16:32
小马 [Topic was deleted] 中提及了此贴 09 Aug 10:55

1) macaca mobile sample "before all" hook:
[init({"autoAcceptAlerts":true,"platformName":"Android","app":"/Users/mining/macaca-test-sample/app/android-app-bootstrap.zip"})] connect ECONNREFUSED 211.139.136.73:3456
Error: connect ECONNREFUSED 211.139.136.73:3456
at Object.exports._errnoException (util.js:1026:11)
at exports._exceptionWithHostPort (util.js:1049:20)
at TCPConnectWrap.afterConnect as oncomplete
android初始化的时候连接不上,怎么解决呢

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up