Appium 以测试集方式运行测试

zhangyang · 2014年09月01日 · 最后由 xuxu 回复于 2014年09月03日 · 3640 次阅读
本帖已被设为精华帖!

我上一篇文章介绍了我的搭建 appium 手机自动化测试环境(ios)的经验。环境搭建好了就可以编写具体的测试业务脚本了。当脚本编写完成当时候,我们一般会得到多个脚本,而我们要运行一次完整等测试需要将每个脚本都运行一次。如果单独的一个一个的去执行脚本是很不方便的。最好是能通过只运行一个脚本,就将所有业务测试脚本都运行一遍。测试集正好解决了这个问题。
具体的实现方式是,我们通过新建一个测试集并将若干具体的业务测试脚本加入到测试集中。然后通过运行包含该测试集的脚本来运行整个测试,这样我们就可以达到只运行一个脚本来运行整个自动化回归测试的目的。

好,下面就以实际的例子来给读者简单介绍一下具体如何以测试集方式运行整个测试。
1.首先,我们需要编写单独的测试业务脚本,例如模块 1 我们写了一个 test01.py 脚本,脚本中的测试类名称为 Module1_cls;模块 2 我们写了 test02.py 脚本,测试类名称为 Module2_cls;模块 3 写了个 test03.py 脚本,测试类名称为 Module3.cls(具体 appium 的 python 测试脚本的内容格式和编写方法,请自行参考 appium 的官方文档,有中文版)。这样就得到三个单独的业务测试脚本
test01.py

test02.py
test03.py
然后我们新建一个 main.py,最终我们要实现的是通过运行 main.py 脚本来实现 3 个具体测试业务脚本的执行。
请看具体实现代码:

# -*- coding:utf-8 -*-
from selenium import selenium
import unittest, time, re
import HTMLTestRunner

from test01 import Module1_cls
from test02 import Module2_cls
from test03 import Module3_cls

def suit_run():

    fp = file("/Users/hobbs/Desktop/ios-auto-test/reports/report01.html","wb")
    suit = unittest.TestSuite()
    suit.addTests(unittest.defaultTestLoader.loadTestsFromTestCase(Module1_cls))
    suit.addTests(unittest.defaultTestLoader.loadTestsFromTestCase(Module2_cls))
    suit.addTests(unittest.defaultTestLoader.loadTestsFromTestCase(Module3_cls))

    runner = HTMLTestRunner.HTMLTestRunner(stream=fp,title="report_of_xxx",description="hobbs report")
    runner.run(suit)

suit_run()

如上代码所示,我们需要通过 from ...... import ......语句将相关业务测试脚本中的测试类引入,这里说一下采用代码中的写法需要 test01.py,test02.py,test03.py 脚本与 main.py 脚本在同一个文件夹下或者上述三个脚本所在路径已经添加到 python 搜索路径中,具体到添加方式是在 python 命令行交互模式下通过 sys.path.append('your_path') 语句添加,当然执行这个语句之前别忘了 import sys。跑偏了继续说测试集。。。
上面的代码中 suit_ run() 函数的作用就是新建一个测试报告文件和测试集并运行,代码中通过测试集的 addTest() 函数来添加具体的测试脚本中的各测试类。添加完成后运行该测试集就可以实现一次性连续运行多个业务脚本的目的。
其中 runner.run(suit) 语句就是运行测试集的语句,测试集运行的过程中会不断将测试的结果写入定义的 report01.html 文件中,最后当测试集运行完成后,各个业务测试脚本的执行结果就都写入到 report01.html 文件里了,我们通过查看该文件可以了解本次测试执行的结果。

ps:后面我会向大家介绍一下我的持续集成方面的一些实践经验,找时间整理下,这个算是做个小铺垫吧~

共收到 11 条回复 时间 点赞

不过我觉得最好的方式不应该是硬编码. 这样不够灵活

#1 楼 @seveniruby 之前在具体弄这个的时候,想的是以一个 list 形式来将各个测试脚本的名字存在一个外部 txt 文件中(这样改起来方便一点),然后在函数中通过 while 或者 for 循环语句来 addTest()就好了,但是我不知道怎么解决引入脚本的问题,即不知道怎么动态的 from。。。import。。。思寒大神有什么好方法没?

@hobbs 放 xml 会好点,引入个 XML module 处理下就好!

#3 楼 @luis 好的,找时间按你这思路研究一下:)

我写的 python 也是这样硬编码,改起来确实比较麻烦,如果能像 TestNG 那样,直接 XML 就最好了,不过还在研究

这是我在项目中定义的 xml,当作 testsuite,之后程序读取这个文件动态加载各个模块,这样应该比较灵活

#6 楼 @vigossjjj testcase 节点的值是 Python 文件名吧?

#7 楼 @jacky 我看着更像类名,而且貌似是 java

#7 楼 @jacky @hobbs 可以,我这个 demo xml 是我们 android 的是包 +testclass(Robotium)iOS 的也一样只不过指的是 python 包 + 模块(Appium)。这只是一个 demo,看你们自己怎么去定义了。思想就是 xml 动态加载

@hobbs 介绍下 python+appium+jenkins 吧

#10 楼 @xuxu 虽然 jenkins 很好很强大,但是我在 mac 上并没有用 jenkins 做持续集成,不过介绍下是可以的,呵呵~

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册