前言
在上一篇文章--Appium系列(十五)继续利用分层化思想优化代码,我们对于测试用例的数据进行维护,但是现在的定位元素的相关的维护没有进行优化,那么我们应该怎么优化呢,本文带着大家揭晓。
正文
方案一:
我们可以在之前的测试用例维护的文件中进行维护用例定位的相关的,在data的casedata目录创建logincase.yaml进行维护。
-
usernameedit: tv.danmaku.bili:id/username
passwordedit: tv.danmaku.bili:id/passport_tag
loginbtn: tv.danmaku.bili:id/btn_login
assertelement: tv.danmaku.bili:id/btn_login
user: name
user_password: 123456
msg: 测试失败
-
usernameedit: tv.danmaku.bili:id/username
passwordedit: tv.danmaku.bili:id/passport_tag
loginbtn: tv.danmaku.bili:id/btn_login
assertelement: tv.danmaku.bili:id/btn_login
user: shibai
user_password: 123456
msg: 测试成功
那么我们在测试用例也需要进行优化,那么应该如何优化呢。
from time import sleep
from common.adbtool import *
from common.packageparse import *
import unittest
from ddt import ddt,file_data
from appium import webdriver
apk_path = "apk/iBiliPlayer-bili.apk"
@ddt
class testCase(unittest.TestCase):
def setUp(self) -> None:
packname = get_apkname(apk_path)
dev = get_devices()[0]
is_first_install = False
# 1.判断是否安装app
is_install = isinstallapk(packname, dev)
if is_install is False:
# 2.如果没有安装,则安装
installapk(apk_path, dev)
is_first_install = True
# 3.启动apk测试
apkname = get_apkname(apk_path)
launcheractivity = get_apk_lautc(apk_path)
desired_caps = {
'platformName': 'Android',
'deviceName': dev, # adb deivces
'platformVersion': getPlatForm(dev), # 从设置中可以获取
'appPackage': apkname, # 包名
'appActivity': launcheractivity, # apk的launcherActivity
# 'skipServerInstallation': True
}
self.driver = webdriver.Remote('http://0.0.0.0:4723/wd/hub', desired_caps)
sleep(10)
# 启动同意用户协议
self.driver.find_element_by_id("tv.danmaku.bili:id/agree").click()
if is_first_install:
# 首次安装需要加载文件
sleep(50)
sleep(10)
self.driver.find_element_by_id("tv.danmaku.bili:id/avatar_layout").click()
sleep(5)
self.driver.find_element_by_xpath("//*[@text='登录']").click()
def tearDown(self) -> None:
self.driver.close()
@file_data("data/casedata/logincase.yaml")
def testlogin(self,usernameedit,passwordedit,loginbtn,assertelement,user,user_password,msg):
username = self.driver.find_element_by_id(usernameedit)
username.clear()
username.send_keys(user)
password = self.driver.find_element_by_id(passwordedit)
password.clear()
password.send_keys(user_password)
login = self.driver.find_element_by_id(loginbtn)
login.click()
try:
self.driver.find_element_by_id(assertelement)
self.assertTrue(False,msg=msg)
except:
self.assertTrue(True,msg=msg)
这个方案目前的弊端:
1.每个用例都需要单独维护一次。
2.部分的测试环境初始化的参数没有维护。
那么我们应该怎么进行优化呢,其实我们可以单独在写一个文件去存放。那么我们就出来方案二。
方案二:存放在单独的定位的文件中,然后去解析。
我们把所有定位相关的直接维护到data下面的element文件中的loginelement.yaml,没有去创建即可。内容如下:
usernameedit: tv.danmaku.bili:id/username
passwordedit: tv.danmaku.bili:id/passport_tag
loginbtn: tv.danmaku.bili:id/btn_login
assertelement: tv.danmaku.bili:id/btn_login
agreeelement: tv.danmaku.bili:id/agree
opearelement: tv.danmaku.bili:id/avatar_layout
logintextclik: //*[@text='登录']
接下来,我们去安装操作yaml的模块。
pip install pyyaml
接着我们去导入;
import yaml
解析方法如下。我们封装在
def getyaml(path):
f = open(path, encoding="utf8")
reslut=yaml.load(f)
f.close()
return reslut
我门可以传入文件的路径进行调试,结果如下:
{'usernameedit': 'tv.danmaku.bili:id/username', 'passwordedit': 'tv.danmaku.bili:id/passport_tag', 'loginbtn': 'tv.danmaku.bili:id/btn_login', 'assertelement': 'tv.danmaku.bili:id/btn_login', 'agreeelement': 'tv.danmaku.bili:id/agree', 'opearelement': 'tv.danmaku.bili:id/avatar_layout', 'logintextclik': "//*[@text='登录']"}
那么我们就可以在测试用例中使用
from time import sleep
from common.adbtool import *
from common.packageparse import *
import unittest
from ddt import ddt,file_data
from appium import webdriver
from common.pyyaml import getyaml
element=getyaml("data/element/loginelement.yaml")
apk_path = "apk/iBiliPlayer-bili.apk"
@ddt
class testCase(unittest.TestCase):
def setUp(self) -> None:
packname = get_apkname(apk_path)
dev = get_devices()[0]
is_first_install = False
# 1.判断是否安装app
is_install = isinstallapk(packname, dev)
if is_install is False:
# 2.如果没有安装,则安装
installapk(apk_path, dev)
is_first_install = True
# 3.启动apk测试
apkname = get_apkname(apk_path)
launcheractivity = get_apk_lautc(apk_path)
desired_caps = {
'platformName': 'Android',
'deviceName': dev, # adb deivces
'platformVersion': getPlatForm(dev), # 从设置中可以获取
'appPackage': apkname, # 包名
'appActivity': launcheractivity, # apk的launcherActivity
# 'skipServerInstallation': True
}
self.driver = webdriver.Remote('http://0.0.0.0:4723/wd/hub', desired_caps)
sleep(10)
# 启动同意用户协议
self.driver.find_element_by_id(element['agreeelement']).click()
if is_first_install:
# 首次安装需要加载文件
sleep(50)
sleep(10)
self.driver.find_element_by_id(element['opearelement']).click()
sleep(5)
self.driver.find_element_by_xpath(element['logintextclik']).click()
def tearDown(self) -> None:
self.driver.close()
@file_data("data/casedata/logincase.yaml")
def testlogin(self,user,user_password,msg):
username = self.driver.find_element_by_id(element['usernameedit'])
username.clear()
username.send_keys(user)
password = self.driver.find_element_by_id(element['passwordedit'])
password.clear()
password.send_keys(user_password)
login = self.driver.find_element_by_id(element['loginbtn'])
login.click()
try:
self.driver.find_element_by_id(element['assertelement'])
self.assertTrue(False,msg=msg)
except:
self.assertTrue(True,msg=msg)
这样我们就完成了第二种方案对于测试用例相关定位的维护。
大家可以根据自己的方式进行选择。