George555 公众号:测试江湖路
如果这些内容对你有帮助,也可以打开微信扫一扫,加关注:
好多同学在问Airtest写的用例怎么管理,怎么执行,官方用了unittest做了二次封装来处理,而笔者经过实践,换用了pytest,感觉写起用例能飞起来~
接下来就写下用pytest来组织用例的思路方法。如果你还不会pytest使用,请进入下面的传送门>>>
python-pytest使用(1)-基础
python-pytest使用(2)-fixture
python-pytest使用(3)-conftest
python-pytest使用(4)-多线程多进程运行
1.接入pytest框架设计出发点:
A.框架简单易用,易上手
B.大部分代码方法来源于官网方法,免去自己框架约束的学习成本
C.可选择性执行用例
D.可并发执行用例
2.先看看目录结构设计思路
A.根目录的3个文件:总方法main.py、conftest.py、pytest.ini
main方法很简单,主要是调用pytest命令来执行所有用例,代码如下:
import pytest
if __name__ == '__main__':
pytest.main(['-s']) #顺序执行
# pytest.main(['-n=2']) #多进程并发
根目录放conftest.py的目的是在这里做所有airtest和poco的初始化对象。
import pytest,os
from airtest.core.api import *
from poco.drivers.android.uiautomation import AndroidUiautomationPoco
from poco_test.utils.util import *
@pytest.fixture(scope='function', params=(getConnectDevices()),name='newpoco')
def poco(request):#
'''poco对象预设值
@return: 返回poco对象,用newpoco代替'''
connect_device(request.param['uri'])
newpoco=AndroidUiautomationPoco(device=device())
start_app(GS.packageName)
sleep(10)
yield newpoco
sleep(3)
stop_app(GS.packageName)
sleep(3)
@pytest.fixture(scope='function', params=(getConnectDevices()),name='newAirtest')
def airtest(request,initEnv):#
'''airtest对象预设值'''
connect_device(request.param['uri'])
start_app(GS.packageName)
sleep(10)
yield
sleep(3)
stop_app(GS.packageName)
sleep(3)
备注:目前由于airtest对于跨设备的截图识别存在兼容问题还在摸索中,这里先加入初始化待用。
根目录放pytest.ini,目的是简化main方法执行参数,以及用例可按mark标记执行
[pytest]
marker =
smokeTest
functionTest
#addopts = -v -s --reruns 3 --reruns-delay=3 --html=.\\report\\testreport.html
B.用例创建
这里需要创建两大块airtest和poco用例,用于匹配两大框架。用例总目录为air_test、poco_test。而在这里用例设计方式借用之前用过的robotframework中思路,按照测试集-测试用例的方式管理。
如图中test_suite5_my的测试集下包含test_login和test_myConcern两个py测试文件,而这两个测试文件中分别有自己模块功能下的测试用例。(因为前提是使用pytest执行用例,那么它将会寻找项目目录下所有符合规则的test_开头的py文件去执行里面的测试方法。)
用例文件创建好了之后,那么用例该怎么写呢?下面给出test_myConcern文件中的测试用例代码
'''
Created on 2019年9月27日
@author: George
测试点:我的关注
'''
import pytest
from poco_test.utils.util import *
LOGGER=get_logger(__name__)
class TestMyAttention():
def test_001_clickMyAttention(self,newpoco):
LOGGER.info('执行test_002_clickMyAttention::点击-我的关注,检查QQ登录按钮')
newpoco(text='我的').click(sleep_interval=3)
newpoco(text='我的关注').click(sleep_interval=3)
qqLoginLabel=newpoco(text='QQ登录').get_text()
assert qqLoginLabel=='QQ登录','未找到QQ登录的标签'
if __name__ == '__main__':
pytest.main(['-s',__file__])
此代码可以单独运行,只运行当前py文件。也可以在根目录直接运行main方法,运行全部项目测试用例。
上面这些内容总体来说已经完成了poco结合pytest的项目环境搭建,再梳理下思路:
1.在根目录的conftest里面做poco的初始化动作,保证app可以打开,并返回poco对象
2.在编写用例时,只需要传入1中的poco对象,就不需要在每个用例中去连接、打开app、生成poco对象等操作了。
3.用例编写成功后,执行main方法,去执行全部项目用例,执行前去pytest.ini配置文件中找执行参数和执行的marker标签名(用例前面需要声明marker标签)。
4.最后生成测试报告,如图:
今天先写到这里,这个框架只是个简单示例,做为一种思路的分享,后面还需要加入更多功能,大家可以自由发挥。
比如:兼容Android、ios、win、web平台的初始化;对官方部分方法做2次封装更适用自己;报告的优化引入allure;测试数据分离等。
后面内容更新请持续关注。
#####欢迎大家加群交流####
QQ:464314378
微信群请先加群主微信,群主会拉各位小伙伴进群,注意添加备注。