前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Appium自动化(十三)引入ddt管理测试用例数据

Appium自动化(十三)引入ddt管理测试用例数据

作者头像
雷子
发布2021-03-15 16:34:19
3870
发布2021-03-15 16:34:19
举报
文章被收录于专栏:雷子说测试开发

前言

在上一篇文章--Appium自动化(十二)Appium+unittest组织测试用例,来组织测试用例,那么用例的数据我们是否也可以统一管理呢,答案是可以的。

正文

我们选择了ddt来管理,首先我们去安装ddt

代码语言:javascript
复制
pip install  ddt

那么如何使用呢?首先我们先导入ddt数据驱动。

代码语言:javascript
复制
import  ddt

我们应该如何组织呢,我们先对数据进行提出,我们来提出来的是用户名和密码进行提出来。

代码语言:javascript
复制
data=[{'username':"name",'password':"123456"},
{'username':"shibai",'password':"123456"}]

那么我们在测试用例中怎么使用呢

代码语言:javascript
复制
@ddt.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()

    @ddt.data(*data)
    def testlogin(self,data):
        username = self.driver.find_element_by_id('tv.danmaku.bili:id/username')
        username.clear()
        username.send_keys(data['username'])
        password = self.driver.find_element_by_id('tv.danmaku.bili:id/passport_tag')
        password.clear()
        password.send_keys(data['passowrd'])
        login = self.driver.find_element_by_id('tv.danmaku.bili:id/btn_login')
        login.click()
        try:
            self.driver.find_element_by_id('tv.danmaku.bili:id/btn_login')
            self.assertTrue(False,msg="测试失败")
        except:
            self.assertTrue(True,msg="测试成功")

这样我们都简单的完成了对于数据的提出来,使用数据驱动来管理这样的数据,那么我们按照这样的方式也可以把其他的数据按照这样的方式提取出来,完成来我们数据的提出,使用ddt来驱动管理数据,目前的我们的数据只是存储在代码文件中,后续呢,我们可以存放在文件中进行管理。经过调整,我们最后的代码如下

代码语言:javascript
复制
from time import sleep
from appium import webdriver
from androguard.core.bytecodes.apk import APK
import os
import  unittest
import ddt

data=[{'username':"name",'password':"123456"},{'username':"shibai",'password':"123456"}]
apk_path = "/Users/lileilei/Downloads/iBiliPlayer-bili.apk"
def get_devices() -> list:
    all_devices = []
    cmd = "adb devices"
    reslut = os.popen(cmd).readlines()[1:]
    for item in reslut:
        if item != "\n":
            all_devices.append(str(item).split("\t")[0])
    return all_devices


def getPlatForm(dev: str) -> str:
    cmd = 'adb -s {} shell getprop ro.build.version.release'.format(dev)
    reslut = os.popen(cmd).readlines()[0]
    return str(reslut).split("\n")[0]


def get_apkname(apk):
    a = APK(apk, False, "r")
    return a.get_package()


def get_apk_lautc(apk):
    a = APK(apk, False, "r")
    return a.get_main_activity()


def isinstallapk(packname: str, devname: str) -> bool:
    cmd = "adb -s {} shell pm list packages -3".format(devname)
    reslut = os.popen(cmd).readlines()
    all_apkname = []
    for i in reslut:
        apkname = str(i).split('\n')[0].split(":")[1]
        all_apkname.append(apkname)
    if packname in all_apkname:
        return True
    return False


def uninstallapk(packname: str, devname: str) -> bool:
    cmd = "adb -s {} shell pm list packages -3".format(devname)
    reslut = os.popen(cmd).readlines()
    all_apkname = []
    for i in reslut:
        apkname = str(i).split('\n')[0].split(":")[1]
        all_apkname.append(apkname)
    if packname in all_apkname:
        cmd = 'adb -s %s uninstall %s ' % (devname, packname)
        os.system(cmd)
        return True
    return False


def installapk(paknamepath: str, devname: str) -> bool:
    cmd = 'adb -s %s install %s' % (devname, paknamepath)
    os.system(cmd)
    return True

@ddt.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()

    @ddt.data(*data)
    def testlogin(self,data):
        username = self.driver.find_element_by_id('tv.danmaku.bili:id/username')
        username.clear()
        username.send_keys(data['username'])
        password = self.driver.find_element_by_id('tv.danmaku.bili:id/passport_tag')
        password.clear()
        password.send_keys(data['passowrd'])
        login = self.driver.find_element_by_id('tv.danmaku.bili:id/btn_login')
        login.click()
        try:
            self.driver.find_element_by_id('tv.danmaku.bili:id/btn_login')
            self.assertTrue(False,msg="测试失败")
        except:
            self.assertTrue(True,msg="测试成功")

if __name__ == "__main__":
    unittest.main()

后记

后续我们还会继续分享,如何讲分层管理代码,如何维护多功能的测试用例测试数据。欢迎持续关注雷子说测试开发。

如果觉得这篇文章还不错,来个【分享、点赞、在看】三连吧,让更多的人也看到~

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

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

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

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

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