生活札记
pytest框架、Appium之自动化测试(三)
一、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 对应的文件
pytest -sv:默认当前目录下所有文件
pytest register/test_register.py::Test_register::test_register -sv:详细方法
pytest -sv --html=report.html --self-contained-html:导出测试报告
pytest -k C001001 -s:通过关键字搜索来执行
pytest -k "not C001001" -s:可以用 not 表示选择名字中不包含
pytest -k "错 and 密码2" -s:可以用 and 表示选择名字同时包含多个关键字
pytest -k "错 or 密码2" -s:可以用 or 表示选择名字 包含指定关键字之一即可
pytest register -m reg -sv:通过mark执行测试
初始化、结束流程:
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
二、Appium
Appium 是一个移动 App (手机应用)自动化工具。Appium 自动化方案的特点:开源免费、支持多个平台iOS (苹果)、安卓 App 的自动化都支持、支持多种类型的自动化、支持苹果安卓应用原生界面的 自动化、支持应用内嵌WebView的自动化、支持手机浏览器中的web网站自动化、支持flutter应用的自动化、支持多种编程语言、像 Selenium一样,可以用多种编程语言调用它开发自动化程序。
教程:https://www.bilibili.com/video/BV1tE411n7rV
文档:https://www.byhy.net/tut/auto/appium/01/
安装:
1)、安装client编程库:pip install appium-python-client
2)、安装Appium Server:https://github.com/appium/appium-desktop/releases/
下载:Appium-Server-GUI-windows-1.22.3-4.exe,直接安装即可
3)、安装JDK:https://www.oracle.com/java/technologies/downloads/#java8-windows
下载安装完成之后,配置JAVA_HOME
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
5)、连接手机:
手机需要开启开发者模式(设置>>版本号>>点击3次),启动USB调试(测试的话,能开的权限都开启)
连接好以后,打开CMD命令行窗口, 执行 adb devices -l 命令来列出连接在电脑上的安卓设备,如果输出 类似如下的内容:表示电脑上可以查看到 连接的设备,就可以运行自动化程序了。
6)、查找应用Package 和 Activity:
没有apk:
CMD执行:adb shell dumpsys activity recents | find "intent={"
第一行: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=''
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()
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
Appium Inspector工具:https://github.com/appium/appium-inspector/releases/,下载:Appium-Inspector-windows-2023.3.1.exe,并安装。
定位元素,可以通过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"]')
文明上网理性发言!
已完结!