基于appium实现的线性代码引用unittest单元测试框架

在前段时间,分享了几篇关于appium基础的博文,再加上期间也有讲到unittest测试框架,所以今天就来一个专题,在appium+python实现的线性代码基础上,引入unittest框架,使代码更简洁。

之前的博客,可以见以下链接快速阅读:

基于Python的Appium环境搭建合集

Genymotion模拟器的安装及脚本制作

Appium Python API 中文版

Appium-Server与Appium-Desktop的区别

单元测试框架Uinttest一文详解

在以上博文中,代码示例,很多只是个线性脚本,没有太多的实用之处,用来写个demo还是可以,但实际运用到产品中,就不行了。脚本还是得引用框架,这样看起来,代码就不会那么乱,更有逻辑性,便于维护。

好了,进入正题,对unittest以及appium还不熟悉的,可以先阅读如上的博文了解,此篇文中,就不赘述了。

unittest代码优化一

优化逻辑:

①将启用服务字段放到初始化当中

②将输入账号、输入密码、获取当前activity的操作封装成一个个函数

③在用例中去调用需要执行的函数

示例代码如下:

import selenium
import time
from appium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
import unittest

‘‘‘
@author: wenyihuqingjiu
@project: appiumcode
@file: test_login.py
@time: 2019-10-20 22:11
@desc:
‘‘‘

print(‘selenium version = ‘, selenium.__version__)

def input_account(self):
    account = self.driver.find_element_by_id(‘id/rel_content‘)
    account.find_element_by_id(‘id/edit_acount‘)
    print("定位输入框")
    self.driver.press_keycode(61)
    print("换行操作")
    account.send_keys(‘‘)
    print("账号输入完毕")
    time.sleep(2)

def current(self):
    ac = self.driver.current_activity
    print(‘当前activity:‘ + ac)

def input_password(self):
    # genymotion只需要一次换行
    self.driver.press_keycode(61)
    print("换行操作")
    password = self.driver.find_element_by_id(‘id/rel_content‘)
    password.find_element_by_id(‘id/edit_pass‘)
    print("定位输入框")
    password.send_keys(‘‘)
    print("输入密码")
    self.driver.find_element_by_xpath(‘//android.widget.TextView[@text="登 录"]‘).click()
    print("点击登录")
    time.sleep(5)
    print(‘登录成功‘)

class case_01(unittest.TestCase):
    @classmethod
    def setUpClass(cls):

        desired_caps = {

            ‘platformName‘: ‘Android‘,
            ‘platformVersion‘: ‘4.4.4‘,
            ‘deviceName‘: ‘S5‘,
            ‘appPackage‘: ‘‘,
            # 非首次登录的activity
            ‘appActivity‘: ‘.ui.login.view.LoginActivity‘,
            ‘udid‘: ‘192.168.66.101:5555‘,
            ‘noReset‘: ‘true‘,

        }
        cls.driver = webdriver.Remote(‘http://192.168.1.101:4723/wd/hub‘, desired_caps)
        print("服务启动成功")

    @classmethod
    def tearDownClass(cls):
        cls.driver.quit()

    def add_img(self):
        self.imgs.append(self.driver.get_screenshot_as_base64())
        return True

    def setUp(self):
        # 在是python3.x 中,如果在这里初始化driver ,因为3.x版本 unittestbasic1 运行机制不同,会导致用力失败时截图失败
        self.driver.implicitly_wait(30)
        self.imgs = []
        self.addCleanup(self.cleanup)

    def cleanup(self):
        pass

    def test_login01(self):
        input_account(self)
        current(self)
        input_password(self)

if __name__ == "__main__":
    suites = unittest.TestSuite()
    suites.addTest(case_01("test_login01"))
    runner = unittest.TextTestRunner(verbosity=2)
    runner.run(suites)

unittest代码优化二

优化逻辑:

①将启用服务字段放到初始化当中

②将输入账号、输入密码、获取当前activity的操作封装成一个个函数,并将数据参数做成形参

③在用例中去调用需要执行的函数并入参

示例代码如下:

import selenium
import time
from appium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
import unittest

‘‘‘
@author: wenyihuqingjiu
@project: appiumcode
@file: test_login.py
@time: 2019-10-20 22:11
@desc:
‘‘‘

print(‘selenium version = ‘, selenium.__version__)

def input_account(self, username):
    account = self.driver.find_element_by_id(‘id/rel_content‘)
    account.find_element_by_id(‘id/edit_acount‘)
    print("定位输入框")
    self.driver.press_keycode(61)
    print("换行操作")
    account.send_keys(username)
    print("账号输入完毕")
    time.sleep(2)

def current(self):
    ac = self.driver.current_activity
    print(‘当前activity:‘ + ac)

def input_password(self, send_password):
    # genymotion只需要一次换行
    self.driver.press_keycode(61)
    print("换行操作")
    password = self.driver.find_element_by_id(‘id/rel_content‘)
    password.find_element_by_id(‘id/edit_pass‘)
    print("定位输入框")
    password.send_keys(send_password)
    print("输入密码")
    self.driver.find_element_by_xpath(‘//android.widget.TextView[@text="登 录"]‘).click()
    print("点击登录")
    time.sleep(5)
    print(‘登录成功‘)

class case_01(unittest.TestCase):
    @classmethod
    def setUpClass(cls):

        desired_caps = {

            ‘platformName‘: ‘Android‘,
            ‘platformVersion‘: ‘4.4.4‘,
            ‘deviceName‘: ‘S5‘,
            ‘appPackage‘: ‘‘,
            # 非首次登录的activity
            ‘appActivity‘: ‘.ui.login.view.LoginActivity‘,
            ‘udid‘: ‘192.168.66.101:5555‘,
            ‘noReset‘: ‘true‘,

        }
        cls.driver = webdriver.Remote(‘http://192.168.1.101:4723/wd/hub‘, desired_caps)
        print("服务启动成功")

    @classmethod
    def tearDownClass(cls):
        cls.driver.quit()

    def add_img(self):
        self.imgs.append(self.driver.get_screenshot_as_base64())
        return True

    def setUp(self):
        # 在是python3.x 中,如果在这里初始化driver ,因为3.x版本 unittestbasic1 运行机制不同,会导致用力失败时截图失败
        self.driver.implicitly_wait(30)
        self.imgs = []
        self.addCleanup(self.cleanup)

    def cleanup(self):
        pass

    def test_login01(self):
        # 正常登录
        input_account(self, "")
        current(self)
        input_password(self, "")

    def test_login02(self):
        # 异常登录
        input_account(self, "")
        current(self)
        input_password(self, "")

if __name__ == "__main__":
    suites = unittest.TestSuite()
    suites.addTest(case_01("test_login01"))
    suites.addTest(case_01("test_login02"))
    runner = unittest.TextTestRunner(verbosity=2)
    runner.run(suites)

通过上述代码可看出,使用更方便了,可以满足正向/反向的用例设计了,是不是很简单。

代码可扩展性还有很多,在unittest基础上,再引入PO模式,那代码的健壮性就更高了,以后有时间再出类似博文。

本文仅代表作者观点,系作者@温一壶清酒发表。欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。文章出处:http://www.cnblogs.com/hong-fithing/

原文地址:https://www.cnblogs.com/hong-fithing/p/11733788.html

时间: 2024-10-10 01:52:53

基于appium实现的线性代码引用unittest单元测试框架的相关文章

Selenium基于Python web自动化基础二 -- 免登录、等待及unittest单元测试框架

一.免登录在进行测试的过程中难免会遇到登录的情况,给测试工作添加了工作量,本文仅提供一些思路供参考解决方式:手动请求中添加cookies.火狐的profile文件记录信息实现.人工介入.万能验证码.去掉验证码 1.手动在请求中添加cookies信息 1 url = "http://www.baidu.com" 2 driver = webdriver.Firefox() 3 driver.get(url) 4 time.sleep(3) 5 #添加cookies的方式 6 7 c1 =

Python+Selenium ----unittest单元测试框架

unittest是一个单元测试框架,是Python编程的单元测试框架.有时候,也做叫做"PyUnit",是Junit的Python语言版本.这里了解下,Junit是Java语言的单元测试框架,Java还有一个很好用的单元测试框架叫TestNG,本系列只学习Python,所以只需要unittest是Python里的一个单元测试框架就可以了.       unittest支持测试自动化,共享测试用例中的初始化和关闭退出代码,在unittest中最小单元是test,也就是一个测试用例.要了解

15. Unittest单元测试框架的介绍与使用

?什么是单元测试 在计算机编程中,单元测试(英语:Unit Testing)又称为模块测试, 是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作.程序单元是应用的最小可测试部件.在过程化编程中,一个单元就是单个程序.函数.过程等:对于面向对象编程,最小单元就是方法,包括基类(超类).抽象类.或者派生类(子类)中的方法. 上面这段内容摘自维基百科.笔者在入职的时候,一直搞不明白什么是单元测试.即使搜了很多资料,也还是搞不明白.一直到接触代码的时候,才对单元测试有了一个大概的认识.当然以

python3+unittest单元测试框架

#unittest单元测试框架,主要由四部分组成:测试固件.测试用例.测试套件.测试执行器 #1.测试固件: '''def setUp(self): # 每条用例执行前都要执行,例如测试前的准备工作 print('setup') def tearDown(self): # 每条用例执行后都要执行,例如测试执行完成后的清除配置工作 print('tearDown') ''' #例如: 1 import unittest 2 3 def calc(a,b): 4 return a+b 5 6 cla

第 6 章 unittest 单元测试框架 - Selenium3 自动化测试

第 6 章 unittest 单元测试框架 单元测试是一项对技术要求很高的工作,只有白盒测试人员和软件开发人员才能胜任但用单元测试框架做单元测试却十分简单,而且单元测试框架不仅可以用来做单元测试,它还适用于不同类型的「自动化」测试. 1.提供测试用例组织和执行在 Python 中,我们编写的代码可以定义类.方法和函数,那么如何定义一条「测试用例」?如何灵活地控制这些「测试用例」的执行?单元测试框架会告诉我们. 2.提供丰富的断言方法当我们进行功能测试时,测试用例需要有预期结果.当测试用例的执行结

Python基础入门-unittest单元测试框架

unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果.今天笔者就总结下如何使用unittest单元测试框架来进行WEB自动化测试. 目录 一.unittest模块的各个属性说明 二.使用unittest框架编写测试用例思路 三.使用unittest框架编写测试用例实例 一.unittest模块的各个属性说明 先来聊一聊unittest模块的各个属性,所谓知己知

unittest单元测试框架总结

unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果.今天笔者就总结下如何使用unittest单元测试框架来进行WEB自动化测试. 目录 一.unittest模块的各个属性说明 二.使用unittest框架编写测试用例思路 三.使用unittest框架编写测试用例实例 一.unittest模块的各个属性说明 点击返回目录 先来聊一聊unittest模块的各个属

unittest单元测试框架小白入门

unittest单元测试框架: 一般也称为pyunit,是从java程序中广泛应用的junit启发而来的,unittest使我们具备创建测试用例,测试套件,测试·夹具的能力.unittest组件:1):Test fixture(测试夹具): 使用测试夹具,可以定义在单个或多个测试执行之前的准备工作和执行之后的清理工作.2)Test Case(测试用例):unittest中执行测试的最小单元,通过验证unittest提供的assert方法来验证一组特定的操作和输入以后得到的响应,unittest提

基于APPIUM测试微信公众号的UI自动化测试框架(结合Allure2测试报告框架)

框架初衷 前两周组内的小伙伴跟我说她现在测试的微信公众号项目(保险)每次上新产品时测试起来很费时,存在大量的重复操作(点点点),手工测试每个产品可能需要半天到一天的时间,复杂的产品需要两天. 由于保险下单的过程中字段比较多,输入费劲的同时测试用例也很多(不同年龄段.工种.有无社保等),且!每个产品的页面都有部分差异! 问我能否基于UI自动化提高她测试新产品的测试速度,同时用于上线时生产的验证. 因为我写过微信公众号页面的UI监控脚本,也尝试过基于appium的多机并发测试,于是我就想,能否搭建一