生活札记

pytest框架、Appium之自动化测试(三)

copylian    1 评论    16843 浏览    2023.03.26

一、pytest

pytest 可以用来做系统测试的自动化,它的特点有:用Python编写测试用例,简便易用、可以用文件系统目录层次对应手工测试用例层次结构、灵活的初始化清除机制、可以灵活挑选测试用例执行、利用第三方插件,可以生成不错的报表。

教程:https://www.bilibili.com/video/BV1bV41167a4

文档:https://www.byhy.net/tut/auto/pytest/01/

安装:pip install pytest、pip install pytest-html

测试命令:pytest 目录/test_*.py::Test_class::test_fun -sv --html=report.html --self-contained-html

pytest项目:pytest会查找 test_*.py、*_test.py 对应的文件

微信图片_20230328135824.png

pytest -sv:默认当前目录下所有文件

微信图片_20230328140034.png

pytest register/test_register.py::Test_register::test_register -sv:详细方法

微信图片_20230328140155.png

pytest -sv --html=report.html --self-contained-html:导出测试报告

微信图片_20230328140315.png

微信图片_20230328145432.png

pytest -k C001001 -s:通过关键字搜索来执行

pytest -k "not C001001" -s:可以用 not 表示选择名字中不包含

pytest -k "错 and 密码2" -s:可以用 and 表示选择名字同时包含多个关键字

pytest -k "错 or 密码2" -s:可以用 or 表示选择名字 包含指定关键字之一即可

微信图片_20230328143012.png

pytest register -m reg -sv:通过mark执行测试

微信图片_20230328144148.png


初始化、结束流程:

1)、目录级别初始化、结束:目录文件 conftest.py

# 目录初始化

import pytest


@pytest.fixture(scope='package', autouse=True)

def st_emptyEnv():

    print(f'\n\n***** 初始化-register目录 *****')

    yield

    print(f'***** 清除-register目录 *****')


2)、模块级别初始化、结束;类级别初始化、结束;方法级别初始化、结束:

# 测试注册

import pytest


# 模块初始化方法

def setup_module():

    print("***** 初始化模块 *****")


# 模块结束方法

def teardown_module():

    print("***** 结束模块 *****")


class Test_register:

    # 初始化类

    @classmethod

    def setup_class(cls):

        print("***** 初始化类 *****")

   

    # 结束类

    @classmethod

    def teardown_class(cls):

        print("***** 结束类 *****")


    # 初始化方法

    def setup_method(self):

        print("***** 初始化方法 *****")


    # 结束方法

    def teardown_method(self):

        print("\n***** 结束方法 *****")


    # 测试方法

    @pytest.mark.reg

    def test_register(self):

        print("测试注册")

        assert "测试注册" == "测试注册"

   

    # 测试方法

    @pytest.mark.reg1

    def test_register1(self):

        print("测试注册1")

        assert "测试注册1" == "测试注册1"


简单案例:py -m pytest login/test_login.py::Test_login -sv --html=report.html --self-contained-html


lib/login.py:验证登录公共类库

# 登录验证

from selenium import webdriver

from selenium.webdriver.common.by import By


# 验证登录

def login(username, password):


    # 将可执行文件放入环境变量path中

    wd = webdriver.Chrome()


    # 等待元素

    wd.implicitly_wait(10)


    # 调用WebDriver 对象的get方法 可以让浏览器打开指定网址

    wd.get("https://www.copylian.com/members/login.html")


    # 验证用户名、密码

    if username is not None:

        wd.find_element(By.ID, 'username').send_keys(username)

    if password is not None:

        wd.find_element(By.ID, 'password').send_keys(password)


    # 登录

    wd.find_element(By.ID, "sub").click()


    # 捕获弹窗信息

    alertText = wd.switch_to.alert.text

    print(alertText)


    # 退出

    wd.quit()


    # 返回数据

    return alertText


login/test_login.py:测试登录用例

# 测试登录

import pytest

from lib.login import login

class Test_login:


    # 数据驱动

    @pytest.mark.parametrize('username, password, expectedalert', [

        (None, '88888888', '账号不能为空'),

        ('byhy', None, '密码不能为空'),

        ('byh', '88888888', '用户名与密码不匹配!'),

        ('byhy', '888888888', '用户名与密码不匹配!'),

        ('飓风呀', 'llc1818181818llc', '恭喜你,登录成功!'),

    ])


    # 测试登录

    def test_login(self, username, password, expectedalert):

        print("测试登录")

        alertText = login(username, password)

        assert alertText == expectedalert

微信图片_20230328152332.png

微信图片_20230328160844.png


二、Appium

Appium 是一个移动 App (手机应用)自动化工具。Appium 自动化方案的特点:开源免费、支持多个平台iOS (苹果)、安卓 App 的自动化都支持、支持多种类型的自动化、支持苹果安卓应用原生界面的 自动化、支持应用内嵌WebView的自动化、支持手机浏览器中的web网站自动化、支持flutter应用的自动化、支持多种编程语言、像 Selenium一样,可以用多种编程语言调用它开发自动化程序。

20200223122125834.png

官网:http://appium.io/

教程:https://www.bilibili.com/video/BV1tE411n7rV

文档:https://www.byhy.net/tut/auto/appium/01/

安装:

1)、安装client编程库:pip install appium-python-client

微信图片_20230329103427.png

2)、安装Appium Serverhttps://github.com/appium/appium-desktop/releases/

下载:Appium-Server-GUI-windows-1.22.3-4.exe,直接安装即可

微信图片_20230329103611.png

3)、安装JDK:https://www.oracle.com/java/technologies/downloads/#java8-windows

下载安装完成之后,配置JAVA_HOME

微信图片_20230329103834.png

4)、安装 Android SDK:https://www.cnblogs.com/lc-blogs/p/17012523.html

如果下载安装很慢,那就使用下面的安装包

链接:https://pan.baidu.com/s/19C9fGmoXne8DgfXhrTB2TQ提取码:kgwb

下载并解压到对应目录如:D:\Tools\androidsdk,添加一个 环境变量 ANDROID_HOME ,设置值为sdk包解压目录,D:\Tools\androidsdk,新增环境变量PATH ,D:\Tools\androidsdk\platform-tools

微信图片_20230329104330.png

微信图片_20230329104229.png

5)、连接手机:

手机需要开启开发者模式设置>>版本号>>点击3次),启动USB调试(测试的话,能开的权限都开启

微信图片_20230329105818.jpg

连接好以后,打开CMD命令行窗口, 执行 adb devices -l 命令来列出连接在电脑上的安卓设备,如果输出 类似如下的内容:表示电脑上可以查看到 连接的设备,就可以运行自动化程序了。

20200210132442926.png

微信图片_20230329110132.png


6)、查找应用Package 和 Activity:

没有apk:

CMD执行:adb shell dumpsys activity recents | find "intent={"

微信图片_20230329144054.png

第一行:cmp=tv.danmaku.bili/.MainActivityV2应用的package名称:tv.danmaku.bili,应用的启动Activity .MainActivityV2


有apk:

如果你已经获取到了 apk,在命令行窗口执行:

        D:\Tools\androidsdk\build-tools\29.0.3\aapt.exe dump badging D:\Download\iBiliPlayer-bili.apk | find "package: name="

输出信息中,就有应用的package名称:

        package: name='tv.danmaku.bili' versionCode='7220300' versionName='7.22.0' compileSdkVersion='32' compileSdkVersionCodename='12'

在命令行窗口执行:

        D:\Tools\androidsdk\build-tools\29.0.3\aapt.exe dump badging D:\Download\iBiliPlayer-bili.apk | find "launchable-activity"

输出信息中,就有应用的启动Activity:

        launchable-activity: name='tv.danmaku.bili.MainActivityV2'  label='哔哩哔哩' icon=''

微信图片_20230329145209.png

7)、Demo案例:

from appium import webdriver

from selenium.webdriver.common.by import By

from appium.webdriver.extensions.android.nativekey import AndroidKey


       # 配置信息

desired_caps = {

    'platformName': 'Android',  # 被测手机是安卓

    'platformVersion': '13',  # 手机安卓版本

    'deviceName': 'xiaomi 12 pro',  # 设备名,安卓手机可以随意填写

    'appPackage': 'tv.danmaku.bili',  # 启动APP Package名称

    'appActivity': '.MainActivityV2',  # 启动Activity名称

    'unicodeKeyboard': True,  # 使用自带输入法,输入中文时填True

    'resetKeyboard': True,  # 执行完程序恢复原来输入法

    'noReset': True,       # 不要重置App

    'newCommandTimeout': 6000,

    'automationName': 'UiAutomator2'

    # 'app': r'D:\Download\iBiliPlayer-bili.apk', # 直接使用apk

}


# 连接Appium Server,初始化自动化环境

driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)


# 设置缺省等待时间

driver.implicitly_wait(5)


# 如果有`青少年保护`界面,点击`我知道了`

iknow = driver.find_elements(By.ID, "text3")

if iknow:

    iknow.click()


# 根据id定位搜索位置框,点击

driver.find_element(By.ID, 'expand_search').click()


# 根据id定位搜索输入框,点击

sbox = driver.find_element(By.ID, 'search_src_text')

sbox.send_keys('飓风呀')


# 输入回车键,确定搜索

driver.press_keycode(AndroidKey.ENTER)


# 选择(定位)所有视频标题

eles = driver.find_elements(By.ID, 'title')


for ele in eles:

    # 打印标题

    print(ele.text)


input('**** Press to quit..')

driver.quit()

微信图片_20230329160016.png

微信图片_20230329160112.jpg

8)、定位元素:

uiautomatorviewer工具:D:\Tools\androidsdk\tools\bin\uiautomatorviewer.bat

出现错误:

        Error while obtaining UI hierarchy XML file: com.android.ddmlib.SyncException: Remote object doesn't exist!

解决:

        adb kill-server

        adb start-server

微信图片_20230329161112.png


Appium Inspector工具:https://github.com/appium/appium-inspector/releases/下载:Appium-Inspector-windows-2023.3.1.exe,并安装。

微信图片_20230329163357.png

微信图片_20230329163247.png

定位元素,可以通过AppiumBy.ID、AppiumBy.CLASS_NAME、AppiumBy.ACCESSIBILITY_ID、AppiumBy.XPATH 来查找到对应的元素

根据ID,resource-id 属性:

from appium.webdriver.common.appiumby import AppiumBy

driver.find_element(AppiumBy.ID, 'expand_search')


根据CLASS NAME:

from appium.webdriver.common.appiumby import AppiumBy

driver.find_element(AppiumBy.CLASS_NAME, 'android.widget.TextView')


根据ACCESSIBILITY ID,content-desc 属性:

from appium.webdriver.common.appiumby import AppiumBy

driver.find_element(AppiumBy.ACCESSIBILITY_ID, '找人')


Xpath:Appium 也支持通过 Xpath选择元素

from appium.webdriver.common.appiumby import AppiumBy

driver.find_element(AppiumBy.XPATH, '//ele1/ele2[@attr="value"]')

只袄早~~~
感谢你的支持,我会继续努力!
扫码打赏,感谢您的支持!

文明上网理性发言!