Skip to content

Latest commit

 

History

History
226 lines (199 loc) · 6.54 KB

自动化测试结合.md

File metadata and controls

226 lines (199 loc) · 6.54 KB

自动化测试结合 [实验性]

暂未成熟不建议尝试. 目前只是我个人写用例使用中. 还在逐渐的完善. 算是提供一种思路给大家.

测试框架选择

使用了scalatest这个强大的测试框架作为依托.
他本身是支持BDD和TDD风格的. http://www.scalatest.org/user_guide/selecting_a_style

scalatest自带的selenium支持

详情可参考 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")
  }
}

Appium支持

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"
  }

appium关键字

在selenium支持的基础上只增加了少数几个方法.

命令 用途
see 元素定位与属性提取
tap 点击
send 输入文本
swipe 滑动

原来scalatest的selenium的支持仍然全部可用. 比如

click on id("login")

see

唯一的元素定位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风格

assert(2>1)
assert(attempted == 1, "Execution was attempted " + left + " times instead of 1 time")

用法参考 http://www.scalatest.org/user_guide/using_assertions

should风格

这也是我喜欢的风格

//数字比较
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目录下

TODO

目前的功能已经可以支持基础的自动化测试了. 仍然有一些内容需要完善. 我可能没有精力去维护了. 留给大家做参考吧.

  • 支持单选 多选 滑块等封装动作
  • 交互式调试
  • 生成robotframework style的测试报告