暂未成熟不建议尝试. 目前只是我个人写用例使用中. 还在逐渐的完善. 算是提供一种思路给大家.
使用了scalatest这个强大的测试框架作为依托.
他本身是支持BDD和TDD风格的.
http://www.scalatest.org/user_guide/selecting_a_style
详情可参考
http://www.scalatest.org/user_guide/using_selenium
这个selenium框架易用性很好. 支持selenium意味着可以支持appium,
先看示例
class BlogSpec extends FlatSpec with ShouldMatchers with WebBrowser {
implicit val webDriver: WebDriver = new HtmlUnitDriver
val host = "http://localhost:9000/"
"The blog app home page" should "have the correct title" in {
go to (host + "index.html")
pageTitle should be ("Awesome Blog")
}
}
appcrawler在selenium支持的基础上做了一个针对appium的封装,类名叫MiniAppium.他具有如下的特色
- 设计极简, 除了selenium的自身支持外,增加了几个api用于app的测试
- 封装了appium命令的启动停止
- 强大的断言
test("验证雪球登陆功能"){
//启动appium
start()
//配置appium client
config("app", "/Users/seveniruby/Downloads/xueqiu.apk")
config("appPackage", "com.xueqiu.android")
config("appActivity", ".view.WelcomeActivityAlias")
appium()
//自动化
see("输入手机号").send("13067754297")
see("password").send("xueqiu4297")
see("button_next").tap()
see("tip").tap().tap().tap()
swipe("down")
see("user_profile_icon").tap()
//断言
see("screen_name").nodes.head("text") should equal("huangyansheng")
see("screen_name")("text") shouldEqual "huangyansheng"
}
在selenium支持的基础上只增加了少数几个方法.
命令 | 用途 |
---|---|
see | 元素定位与属性提取 |
tap | 点击 |
send | 输入文本 |
swipe | 滑动 |
原来scalatest的selenium的支持仍然全部可用. 比如
click on id("login")
唯一的元素定位api.
see是引用了<阿凡达>电影里面一句台词"I See You".
它的作用是当你看到一个控件, 你应该可以根据看见的东西就可以定位它,并获取到这个控件的属性, 无须借助其他工具或者使用findElementByXXX之类的函数.
比如有个Button, 名字是"登录", 它的id是account, 定位它可以通过如下多种方式的任何一种
- see("登录")
- see("登")
- see("录")
- see("account")
- see("acc")
- see("//UIAButton[@id="account"]")
- see("screen_name")("text")
- see("screen_name").nodes.head("text")
- see("action_bar_title")("text") 文本
- see("action_bar_title")("tag") 类型
- see("action_bar_title")("selected") 是否选中
如果当前界面中存在了有歧义的空间, 比如其他一个名字为"登录"的输入框. 那么上述定位方法中定位中两个控件的定位方法会失败, 你需要自己调整即可.
这就是关于元素定位你只需要用see这个方法即可.
目前只封装了3个动作. tap send swipe.
see("输入手机号").send("13067754297")
see("password").send("xueqiu4297")
see("button_next").tap()
支持链式调用. 当然不推荐日常使用
//对三次连续出现的tip控件点击三次.
see("tip").tap().tap().tap()
see("输入手机号").send("13067754297").see("password").send("xueqiu4297")
支持标准的scalatest的should风格的断言. 支持两种风格的断言
assert(2>1)
assert(attempted == 1, "Execution was attempted " + left + " times instead of 1 time")
用法参考 http://www.scalatest.org/user_guide/using_assertions
这也是我喜欢的风格
//数字比较
one should be < 7
one should be > 0
one should be <= 7
one should be >= 0
sevenDotOh should be (6.9 +- 0.2)
//字符串断言
traversable should contain ("five")
string should startWith regex "Hel*o"
string should fullyMatch regex """(-)?(\d+)(\.\d*)?"""
"howdy" should contain oneOf ('a', 'b', 'c', 'd')
完整用法参考 http://www.scalatest.org/user_guide/using_matchers
安装scala与sbt, windows同学请自行找办法解决
brew install scala sbt
进入appcrawler的项目目录, 或者自己创建一个目录也是可以的.
目录结构如下
在lib下存放appcrawler.jar文件.
在src/test/scala下存放测试用例.
build.sbt是个固定模板.使用appcrawler自己的即可.
具体的配置可参考scala的sbt构建管理帮助文档, 可以使用idea等IDE管理
build.sbt
lib/
src/
main/
test/
scala/
在src/test/scala下编写自己的测试用例.
package com.testerhome.appcrawler.it
import com.testerhome.appcrawler.MiniAppium
/**
* Created by seveniruby on 16/5/21.
*/
class TestAndroidSimulator extends MiniAppium {
override def beforeAll(): Unit = {
start()
config("app", "/Users/seveniruby/Downloads/xueqiu.apk")
config("appPackage", "com.xueqiu.android")
config("appActivity", ".view.WelcomeActivityAlias")
config("fullReset", "false")
config("noReset", "true")
appium()
login()
quit()
}
def login(): Unit = {
swipe("left")
swipe("down")
see("输入手机号").send("13067754297")
see("password").send("xueqiu4297")
see("button_next").tap()
see("tip").tap().tap().tap()
swipe("down")
}
override def beforeEach(): Unit = {
config("appPackage", "com.xueqiu.android")
config("appActivity", ".view.WelcomeActivityAlias")
appium()
}
test("test android simulator") {
see("user_profile_icon").tap()
see("screen_name").nodes.head("text") should equal("huangyansheng")
see("screen_name").nodes.last("text") should be("huangyansheng")
see("screen_name").attribute("text") shouldBe "huangyansheng"
see("screen_name")("text") shouldEqual "huangyansheng"
}
test("自选") {
swipe("down")
see("自选").tap
see("雪球100").tap
swipe("down")
see("stock_current_price")("text").toDouble should be > 1000.0
}
override def afterEach: Unit = {
quit()
}
override def afterAll(): Unit = {
stop()
}
}
执行测试
sbt test
xml和html格式的测试报告会生成在项目的target/report目录下
目前的功能已经可以支持基础的自动化测试了. 仍然有一些内容需要完善. 我可能没有精力去维护了. 留给大家做参考吧.
- 支持单选 多选 滑块等封装动作
- 交互式调试
- 生成robotframework style的测试报告