文章目录
Python+Appium+Pytest+Allure自动化测试框架,本文主要讲述工程的搭建,测试用例的编写
自动化测试框架工程目录
pycharm创建python工程AutoTest,main.py做为主入口
设定目录结构如下
各目录用途说明
├─common # 公共模块目录
├─datas # 配置文件目录
├─outputs # 测试输出目录
│ ├─logs # 日志目录, 4723.log代表appium端口为4723服务的日志
│ ├─picture # 截图存放目录
│ └─reports # 测试报告存放目录
└─testcase # 测试用例目录
示例测试代码
main.py调用pytest进行用例测试, 然后再调用allure生成报告
python"># _*_coding:utf-8 _*_import os
import pytestdef run_case():pytest.main(["-s","-v","--alluredir", "./outputs/reports/data"])generate_report()def generate_report():# 查看allure报告os.system("allure generate outputs/reports/data -o outputs/reports/html --clean")if __name__ == "__main__":run_case()
写个打印Hello World的测试用例,里面加上allure添加报告信息,
pytest与allure的使用后面会讲到,这里只做个简单示例,
testcase/test_device_info.py
python"># _*_coding:utf-8 _*_
import os
import timeimport allure@allure.feature("设备信息模块")
class TestDeviceInfo:@allure.story("设备信息故事")@allure.description("设备信息描述")@allure.severity(allure.severity_level.BLOCKER)def test_get_device_info(self):print('test_get_device_info start')print('Hello World')print('test_get_device_info end')
示例结果查看
有没有错可以直接在pycharm的打印中看
执行完用例,会生成allure的测试结果报告在outputs/reports/html目录下
在命令行中输入以下指令查看html结果
D:\workspace>allure open .\AutoTest\outputs\reports\html
allure_76">allure
Allure 是一个灵活且功能强大的测试报告框架,主要用于为自动化测试生成美观且信息丰富的测试报告。
pytest_79">pytest
pytest是一个功能强大的 Python 测试框架,用于编写简单且可扩展的测试。
这里面有个testcase目录是专门给pytest用的,测试用例都放在这个目录下
pytest_82">编写pytest测试样例的规则
可以在工程根目录下放置pytest.in指定pytest规则,
它会在指定的目录及其子目录中自动搜索符合命名规则的测试函数和测试类。不需要手动添加每个测试用例到测试套件中。
比如,如果你有一个测试模块test_device_info.py,只要运行pytest命令,它就会自动发现并执行其中以test_开头的函数。
pytest_conftestpy_92">pytest conftest.py向测试函数传参
main.py与testcase下的测试用例是隔离的,比如在main.py中创建个单例模式对象,在pytest测试函数中再调用这个单例对象实际会新创建个实例,二者不是一个对象。
这时需要用到pytest conftest.py向测试函数传参
- pytest会默认读取conftest.py里面的所有fixture
- conftest.py 文件名称是固定的,不能改动
- conftest.py只对同一个package下的所有测试用例生效
- 不同目录可以有自己的conftest.py,一个项目中可以有多个conftest.py
- 测试用例文件中不需要手动import conftest.py,pytest会自动查找
在testcase目录下新建文件conftest.py里面
python"># _*_coding:utf-8 _*_
import time
import pytest# pytest.addoption()钩子函数,注册自定义参数 cmdopt 添加到配置对象
def pytest_addoption(parser):parser.addoption("--cmdopt",action="store",default="device_info", # 默认参数值help=None)# 从配置对象中读取自定义参数的值
@pytest.fixture(scope='session')
def cmdopt(pytestconfig):# 两种写法return pytestconfig.getoption("--cmdopt")
通过pytest.fixture, 把cmdopt传给测试函数。
修改main.py, 加了参数–cmdopt=Hi, 把Hi传过去。
python"># _*_coding:utf-8 _*_import os
import pytestdef run_case():pytest.main(["-s","-v","--cmdopt=Hi","--alluredir", "outputs/reports/data"])generate_report()def generate_report():# 生成allure报告os.system("allure generate outputs/reports/data -o outputs/reports/html --clean")if __name__ == "__main__":run_case()
test_device_info.py中,函数添加cmdopt,把参数接收进来
python"># _*_coding:utf-8 _*_
import os
import timeimport allure@allure.feature("设备信息模块")
class TestDeviceInfo:@allure.story("设备信息故事")@allure.description("设备信息描述")@allure.severity(allure.severity_level.BLOCKER)def test_get_device_info(self, cmdopt):print('test_get_device_info start')print('get cmdopt:' + cmdopt)print('test_get_device_info end')
执行结果,可以看到打印了Hi
appium_171">appium
Appium 是一个开源的自动化测试框架,主要用于移动应用(包括 iOS 和 Android)的自动化测试。
其使用步骤是
appium_174">启动appium服务
在命令行中输入
start /b appium -a 127.0.0.1 -p 4723 -pa /wd/hub
注意新版本appium不支持-bp参数(bootstrap port),加了会报错,另外需要加上-pa /wd/hub的参数,否则会报错“No route found for /wb/hub/session”。
第一次启动要慢些,有时候要花十多秒,等待appium的打印出现才执行后面的操作
appium_183">代码端通过端口与appium服务通信对设备进行操作
把调试设备(比如开adb功能的手机)连usb到电脑,
命令行中查看设备名称
adb devices
比如得到:X36405Y4041600056
我们把这个值填写到代码配置中,
python">from appium.options.android import UiAutomator2Optionsdef get_appium_driver():desired_caps = {"platformName": "Android","platformVersion": "13", # 这个填设备的安卓版本,如果写错会报错的"deviceName": "X36405Y4041600056", # 这个填设备adb device获取的名称,写错会报错"noReset": True,}#driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)# 新版本appium需要对参数进行转化options = UiAutomator2Options()options.load_capabilities(desired_caps)driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', options=options)return driver
注意,新版本appium要用options参数,不能直接用desired_caps,否则会报错:
> capabilities = options.to_capabilities()
E AttributeError: 'NoneType' object has no attribute 'to_capabilities'
报错图如下:
pytestappium_217">在pytest测试用例中调用appium
这个例子我们调用appium获取设备的屏幕宽度并打印出来
python">@allure.feature("设备信息模块")
class TestDeviceInfo:@allure.story("设备信息故事")@allure.description("设备信息描述")@allure.severity(allure.severity_level.BLOCKER)def test_get_device_info(self, cmdopt):print('test_get_device_info start')print('get cmdopt:' + cmdopt)driver = get_appium_driver()width = driver.get_window_size()['width']print('screen width {}'.format(width))print('test_get_device_info end')
运行结果:
到此Python+Appium+Pytest+Allure框架就串连起来了。