• Python+Appium+Pytest+Allure实战APP自动化测试框架,小试牛刀


    Hi,大家好。今天我们来聊聊Python+Appium+Pytest+Allure实战APP自动化测试,pytest只是单独的一个单元测试框架,要完成app测试自动化需要把pytest和appium进行整合,同时利用allure完成测试报告的产出。

    编写常规的线性脚本具体的步骤如下:

    1、设计待测试APP的自动化测试用例

    2、新建app测试项目

    3、配置conftest.py文件等

    4、编写整体app测试用例运行文件

    5、把设计好的自动化测试用例转化成脚本备注

    为了保证脚本的稳定性,又把pytest常用功能应用,以下示例采用android计算器为示例讲解。

    前置条件:下载第三方库

    1、下载 appium-python-client

    2、下载pytest

    3、下载 allure-pytest

    一、设计待测试APP的自动化测试用例

    二、新建APP测试项目

    三、配置文件信息

    1、先配置外层conftest.py文件

    1. import pytest
    2. # 配置app的各种连接信息
    3. @pytest.fixture(scope='session')
    4. def android_setting():
    5. des = {
    6. 'automationName': 'appium',
    7. 'platformName': 'Android',
    8. 'platformVersion': '6.0.1', # 填写android虚拟机/真机的系统版本号
    9. 'deviceName': 'MuMu', # 填写安卓虚拟机/真机的设备名称
    10. 'appPackage': 'com.sky.jisuanji', # 填写被测app包名
    11. 'appActivity': '.JisuanjizixieActivity', # 填写被测app的入口
    12. 'udid': '127.0.0.1:7555', # 填写通过命令行 adb devices 查看到的udid
    13. 'noReset': True, # 是否重置APP
    14. 'noSign': True, # 是否不签名
    15. 'unicodeKeyboard': True, # 是否支持中文输入
    16. 'resetKeyboard': True, # 是否支持重置键盘
    17. 'newCommandTimeout': 30 # 30秒没发送新命令就断开连接
    18. }
    19. return des

    2、再配置用例层的conftest.py文件

    1. import time
    2. import pytest
    3. from appium import webdriver
    4. driver = None
    5. # 启动安卓系统中的计算器app
    6. @pytest.fixture()
    7. def start_app(android_setting):
    8. global driver
    9. driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',android_setting)
    10. return driver
    11. # 关闭安卓系统中的计算器app
    12. @pytest.fixture()
    13. def close_app():
    14. yield driver
    15. time.sleep(2)
    16. driver.close_app()

    3、配置pytest.ini文件进行分组设置

    四、编写run_all_cases.py测试执行入口文件

    1. import os
    2. import pytest
    3. # 当前路径(使用 abspath 方法可通过dos窗口执行)
    4. current_path = os.path.dirname(os.path.abspath(__file__))
    5. # json报告路径
    6. json_report_path = os.path.join(current_path,'report/json')
    7. # html报告路径
    8. html_report_path = os.path.join(current_path,'report/html')
    9. # 执行pytest下的用例并生成json文件
    10. pytest.main(['-s','-v','--alluredir=%s'%json_report_path,'--clean-alluredir'])
    11. # 把json文件转成html报告
    12. os.system('allure generate %s -o %s --clean'%(json_report_path,html_report_path))

    五、编写测试用例

    在testcases层下有两个业务子模块 test_add_sub_module 和 test_mul_div_module;

    1、test_add_sub_module模块下test_add.py文件

    代码如下:

    1. import allure
    2. from appium.webdriver.webdriver import By
    3. @allure.epic('安卓计算机项目')
    4. @allure.feature('V1.0版本')
    5. class TestAddSub():
    6. @allure.story('加法运算')
    7. @allure.title('[case01] 验证计算机能否正常完成加法功能')
    8. # @pytest.mark.add_basic
    9. def test_cases01(self,start_app,close_app):
    10. with allure.step('1、启动安卓系统中的计算机app'):
    11. driver = start_app
    12. with allure.step('2、依次按下9、+、8、='):
    13. driver.find_element(By.XPATH,'//android.widget.Button[@resource-id="com.sky.jisuanji:id/btn9"]').click()
    14. driver.find_element(By.XPATH, '//android.widget.Button[@resource-id="com.sky.jisuanji:id/jia"]').click()
    15. driver.find_element(By.XPATH, '//android.widget.Button[@resource-id="com.sky.jisuanji:id/btn8"]').click()
    16. driver.find_element(By.XPATH, '//android.widget.Button[@resource-id="com.sky.jisuanji:id/denyu"]').click()
    17. actual_result = driver.find_element(By.XPATH, '//android.widget.EditText[@resource-id="com.sky.jisuanji:id/text"]').text
    18. with allure.step('3、验证实际结果是否正确'):
    19. # 断言 实际结果 == 17.0
    20. assert actual_result == '17.0'

    2、test_add_sub_module模块下test_sub.py文件

    代码如下:

    1. import allure
    2. from appium.webdriver.webdriver import By
    3. @allure.epic('安卓计算机项目')
    4. @allure.feature('V1.0版本')
    5. class TestAddSub():
    6. @allure.story('减法运算')
    7. @allure.title('[case01] 验证计算机能否正常完成减法功能')
    8. def test_cases01(self,start_app,close_app):
    9. with allure.step('1、启动安卓系统中的计算机app'):
    10. driver = start_app
    11. with allure.step('2、依次按下6、-、2、='):
    12. driver.find_element(By.XPATH,'//android.widget.Button[@resource-id="com.sky.jisuanji:id/btn6"]').click()
    13. driver.find_element(By.XPATH, '//android.widget.Button[@resource-id="com.sky.jisuanji:id/jian"]').click()
    14. driver.find_element(By.XPATH, '//android.widget.Button[@resource-id="com.sky.jisuanji:id/btn2"]').click()
    15. driver.find_element(By.XPATH, '//android.widget.Button[@resource-id="com.sky.jisuanji:id/denyu"]').click()
    16. actual_result = driver.find_element(By.XPATH, '//android.widget.EditText[@resource-id="com.sky.jisuanji:id/text"]').text
    17. with allure.step('3、验证实际结果是否正确'):
    18. # 断言 实际结果 == 4.0
    19. assert actual_result == '4.0'

    3、test_mul_div_module模块下test_mul.py文件

    代码如下:

    1. import allure
    2. from appium.webdriver.webdriver import By
    3. @allure.epic('安卓计算机项目')
    4. @allure.feature('V1.0版本')
    5. class TestAddSub():
    6. @allure.story('减法运算')
    7. @allure.title('[case01] 验证计算机能否正常完成减法功能')
    8. def test_cases01(self,start_app,close_app):
    9. with allure.step('1、启动安卓系统中的计算机app'):
    10. driver = start_app
    11. with allure.step('2、依次按下6、-、2、='):
    12. driver.find_element(By.XPATH,'//android.widget.Button[@resource-id="com.sky.jisuanji:id/btn6"]').click()
    13. driver.find_element(By.XPATH, '//android.widget.Button[@resource-id="com.sky.jisuanji:id/jian"]').click()
    14. driver.find_element(By.XPATH, '//android.widget.Button[@resource-id="com.sky.jisuanji:id/btn2"]').click()
    15. driver.find_element(By.XPATH, '//android.widget.Button[@resource-id="com.sky.jisuanji:id/denyu"]').click()
    16. actual_result = driver.find_element(By.XPATH, '//android.widget.EditText[@resource-id="com.sky.jisuanji:id/text"]').text
    17. with allure.step('3、验证实际结果是否正确'):
    18. # 断言 实际结果 == 4.0
    19. assert actual_result == '4.0'

    4、test_mul_div_module模块下test_div.py文件

    代码如下:

    1. import allure
    2. from appium.webdriver.webdriver import By
    3. @allure.epic('安卓计算机项目')
    4. @allure.feature('V1.0版本')
    5. class TestAddSub():
    6. @allure.story('除法运算')
    7. @allure.title('[case01] 验证计算机能否正常完成除法功能')
    8. def test_cases01(self,start_app,close_app):
    9. with allure.step('1、启动安卓系统中的计算机app'):
    10. driver = start_app
    11. with allure.step('2、依次按下8、*、4、='):
    12. driver.find_element(By.XPATH,'//android.widget.Button[@resource-id="com.sky.jisuanji:id/btn8"]').click()
    13. driver.find_element(By.XPATH, '//android.widget.Button[@resource-id="com.sky.jisuanji:id/chu"]').click()
    14. driver.find_element(By.XPATH, '//android.widget.Button[@resource-id="com.sky.jisuanji:id/btn4"]').click()
    15. driver.find_element(By.XPATH, '//android.widget.Button[@resource-id="com.sky.jisuanji:id/denyu"]').click()
    16. actual_result = driver.find_element(By.XPATH, '//android.widget.EditText[@resource-id="com.sky.jisuanji:id/text"]').text
    17. with allure.step('3、验证实际结果是否正确'):
    18. # 断言 实际结果 == 2.0
    19. assert actual_result == '2.0'

    六、运行结果生成测试报告

  • 相关阅读:
    做自媒体如何获得更多的流量?
    图神经网络:GAT学习、理解、入坑
    向世界展示“中国品牌”实力,中海达参展INTERGEO
    golang 运行时死锁排查和检测
    Java安全之freemaker模版注入
    ZZULIOJ:1004: 三位数的数位分离
    redis 发布者订阅者实例
    Qt扫盲-QSqlQueryModel理论总结
    什么是MVVM模式?(含示例)
    MVCC多版本并发控制的理解
  • 原文地址:https://blog.csdn.net/okcross0/article/details/125492095