zoukankan      html  css  js  c++  java
  • selenium+python—实现自动化测试基本思路

    测试是一个贯穿于整个开发过程的连续过程,测试最基本的原理就是比较预期结果是否与实际执行结果相同,如果相同则测试成功,否则测试失败。

    为了让单元测试代码能够被测试和维护人员更容易地理解,最好的解决办法是遵循一定的规范来编写用于测试的代码,具体到Python程序员来讲,则是要采用unittest这一自动测试框架来构造单元测试用例。目前PyUnit已经得到了大多数Python开发人员的认可,成了事实上的单元测试标准。如果采用unittest来进行同样的测试,则测试代码将下所示:

    from widget import Widget
    import unittest
    # 执行测试的类
    class WidgetTestCase(unittest.TestCase):
        def setUp(self):
            self.widget = Widget()
        def tearDown(self):
            self.widget = None
        def testSize(self):
            self.assertEqual(self.widget.getSize(), (40, 40))
    # 构造测试集
    def suite():
        suite = unittest.TestSuite()
        suite.addTest(WidgetTestCase("testSize"))
        return suite
    # 测试
    if __name__ == "__main__":
        unittest.main(defaultTest = 'suite')

    在采用unittest这一单元测试框架后,用于测试的代码做了相应的改动:

    • 用import语句引入unittest模块。
    • 让所有执行测试的类都继承于TestCase类,可以将TestCase看成是对特定类进行测试的方法的集合。
    • 在setUp()方法中进行测试前的初始化工作,并在tearDown()方法中执行测试后的清除工作,setUp()和tearDown()都是TestCase类中定义的方法。
    • 在testSize()中调用assertEqual()方法,对Widget类中getSize()方法的返回值和预期值进行比较,确保两者是相等的,assertEqual()也是TestCase类中定义的方法。
    • 提供名为suite()的全局方法,PyUnit在执行测试的过程调用suit()方法来确定有多少个测试用例需要被执行,可以将TestSuite看成是包含所有测试用例的一个容器。

    虽然看起来有点复杂,但PyUnit使得所有的Python程序员都可以使用同样的单元测试方法,测试过程不再是杂乱无章的了,而是在同一规范指导下进行的有序行为,这就是使用PyUnit这一自动单元测试框架所带来的最大好处。

    1、用unittest框架写自动化用例:

    #! /usr/bin/env python
    
    '''
    Date:2017.12.26
    Author:Ranxf
    Project:xin300平台BS
    '''
    
    import unittest
    from selenium import webdriver
    
    class XzrsPlantBs(unittest.TestCase):
        def setUp(self):
            self.driver = webdriver.Firefox()   # 选择火狐浏览器
        def test_xzrsPlantBs(self):
            pass
        def tearDown(self):
            self.driver.quit()  # 退出浏览器

    2、断言,检查跳转的网页是否和实际一致

    断言网址时需注意是否为伪静态(PATH_INFO)或者GET,前者采用路径传参数(sys/user-creat.html),后者通过字符查询传参数(main.action?type=guide

    当采用不同方式校验网址会发现变化。

    self.assertEqual("http://10.1.1.166:8080/xzrs/main.action?type=guide",
                        self.driver.current_url,"登录跳转失败")

     3、利用Page模式实现看复用的用例

    关于Page模式:

    • 抽象出来一个BasePage基类,它包含一个指向Selenium.webdriver的属性
    • 每一个webpage都继承自BasePage基类,通过driver来获取本页面的元素,每个页面的操作都抽象为一个个方法
    • TestCase继承自unittest.Testcase类,并依赖相应的Page类来实现相应的test case步骤

     后台BS端登录页面为BasePage,代码如下BasePage.py:

    '''
    Date:2017.12.26
    Author:Ranxf
    '''
    
    from selenium.webdriver.common.by import By
    from selenium.webdriver.common.keys import Keys
    
    
    # super class
    class BasePage(object):
        def __init__(self, driver):
            self.driver = driver
    
    
    # page element identifier
    class LoginPage(BasePage):
        username = (By.ID, 'userID')
        password = (By.ID, 'password')
        dialogTitle = (By.ID, '')
        loginButton = (By.ID, 'login')
    
        # Get userneme textbox and input username
        def set_username(self, username):
            name = self.driver.find_element(*LoginPage.username)
            # name.send_key(username)
    
        # get passowd textbox and input password
        def set_password(self, password):
            pwd = self.driver.find_element(*LoginPage.password)
            pwd.send_keys(password + Keys.RETURN)
    
        # Get "登录" button and then click
        def click_login(self):
            lgn = self.driver.find_element(*LoginPage.loginButton)
            lgn.click()

    Test_Login.py:

    '''
    Date:2017.12.26
    Author:Ranxf
    '''
    
    
    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys
    from selenium.webdriver.common.alert import Alert
    import unittest
    import time
    import sys
    import BasePage
    
    # print(sys.path)
    
    class Test_Login(unittest.TestCase):
        # setup
        def setUp(self):
            self.driver = webdriver.Firefox()
            self.driver.implicitly_wait(30)
            self.base_url = "http://10.1.1.166:8080/xzrs/"
    
        def test_Login(self):
            # Step1:open base site
            self.driver.get(self.base_url)
    
            # Step2:open login page
            login_page = BasePage.LoginPage(self.driver)
    
            # step3:Enter username
            login_page.set_username('000000')
    
            # step4:enter password
            login_page.set_password('admin')
    
            # step5: click login
            login_page.click_login()
    
        # tearDown
        def tearDown(self):
            self.driver.quit()
    
    if __name__ == '__main__':
        unittest.main()

    Page模式:

    1. 易读性: 现在单看test_login方法,确实有点test case的样子了,每一步都很明了

    2. 可扩展性:由于把每个page的元素操作都集成到一个page类中,所以增删改查都比较方便

    3. 可复用性: page的基本操作都变成了一个个的方法,在不同的test case中可以重复使用

    4. 可维护性:如果页面修改,只需修改相应page类中的方法即可,无需修改每个test case

    参考文档:

    http://www.cnblogs.com/AlwinXu/p/5537955.html

    https://www.ibm.com/developerworks/cn/linux/l-pyunit/

    https://www.cnblogs.com/melodylin/p/5656185.html

    http://blog.csdn.net/huilan_same/article/details/52559711

  • 相关阅读:
    linux远程文件、目录操作
    make update-api的使用
    android4.1设置系统 默认方向
    NAIPC2018-K-Zoning Houses
    ICPC2017 Urumqi
    牛客多校第十场-D- Rikka with Prefix Sum
    杭电多校第八场-A-Character Encoding
    杭电多校第七场-J-Sequence
    ConvexScore
    异或序列
  • 原文地址:https://www.cnblogs.com/ranxf/p/8118235.html
Copyright © 2011-2022 走看看