前言
在上一篇文章--Appium系列(十六)如何维护用例中定位元素,我们对于测试用例的定位的元素进行了维护,但是后续我们可能需要测试很多的手机,那么端口号不是唯一的,那么我们将如何维护现有的端口号呢。本文将揭秘。
正文
我们要动态化维护现在的参数,那么我们可以对unittest进行改造,让其支持参数的传递。我们可以写一个方法,可以在测试用例获取传入的参数即可,那么我们如何实现呢
import unittest
class Parmer(unittest.TestCase):
def __init__(self, methodName='runTest', parme=None):
super(Parmer, self).__init__(methodName)
self.parme = parme
@classmethod
def parametrize(self,testcase_klass, parame):
testloader = unittest.TestLoader()
testnames = testloader.getTestCaseNames(testcase_klass)
suite = unittest.TestSuite()
for name in testnames:
suite.addTest(testcase_klass(methodName=name, parme=parame))
return suite
我们把这个文件放在common的parame中
接下来,我们去改写我们的测试用例。
from time import sleep
from common.adbtool import *
from common.packageparse import *
from ddt import ddt,file_data
from appium import webdriver
from common.pyyaml import getyaml
from common.parame import Parmer
element=getyaml("data/element/loginelement.yaml")
apk_path = "apk/iBiliPlayer-bili.apk"
@ddt
class testCase(Parmer):
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:%s/wd/hub'%str(self.parme['port']), desired_caps)
sleep(10)
# 启动同意用户协议
agree=element['agreeelement']
self.driver.find_element_by_id(agree).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):
sleep(10)
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)
这样改完之后就可以了,其实不是的,我们还需要去改造用例执行的,传入参数。我们在run.py 做如下改写即可。
import unittest as un
from common.parame import Parmer
from case.logintestcase import testCase
if __name__ =="__main__":
parames={"port":4723}
suite = un.TestSuite()
suite.addTests(Parmer.parametrize(testCase,parames))
rune = un.TextTestRunner()
rune.run(suite)
那么我们启动appium和设备,去执行下测试用例。目前将测试端口参数化后同样我们还可以把其他参数也动态化。
后续我们将把多设备用例执行等增加进来。