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

  • 相关阅读:
    用 Python 带你看各国 GDP 变迁
    Fluent Interface(流式接口)
    probing privatePath如何作用于ASP.NET MVC View
    Word插入htm文件导致文本域动态增加的一个问题
    Visual Studio 2013附加进程调试IE加载的ActiveX Control无效解决方法
    Ubuntu下Chrome运行Silverlight程序
    Windows Phone Bing lock screen doesn't change解决方法
    SPClaimsUtility.AuthenticateFormsUser的证书验证问题
    Web Service Client使用Microsoft WSE 2.0
    Visual Studio 2013安装Update 3启动crash的解决方法
  • 原文地址:https://www.cnblogs.com/ranxf/p/8118235.html
Copyright © 2011-2022 走看看