前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Appium系列(十七)将Appium服务端口号通过参数传递给测试用例

Appium系列(十七)将Appium服务端口号通过参数传递给测试用例

作者头像
雷子
发布2021-03-30 16:36:32
9450
发布2021-03-30 16:36:32
举报

前言

在上一篇文章--Appium系列(十六)如何维护用例中定位元素,我们对于测试用例的定位的元素进行了维护,但是后续我们可能需要测试很多的手机,那么端口号不是唯一的,那么我们将如何维护现有的端口号呢。本文将揭秘。

正文

我们要动态化维护现在的参数,那么我们可以对unittest进行改造,让其支持参数的传递。我们可以写一个方法,可以在测试用例获取传入的参数即可,那么我们如何实现呢

代码语言:javascript
复制
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中

接下来,我们去改写我们的测试用例。

代码语言:javascript
复制
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 做如下改写即可。

代码语言:javascript
复制
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和设备,去执行下测试用例。目前将测试端口参数化后同样我们还可以把其他参数也动态化。

后续我们将把多设备用例执行等增加进来。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-03-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 雷子说测试开发 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档