zoukankan      html  css  js  c++  java
  • 自动化测试模型

    自动化测试模型可以看作自动化测试框架与工具设计的思想。自动化测试不仅仅是单纯写脚本运行就可以了,还需要考虑到如何使脚本运行效率提高,代码复用、参数化等问题。自动化测试模型分为四大类:线性模型、模块化驱动测试、数据驱动、关键字驱动。

    1、线性模型

    通过录制或编写对应应用程序的操作步骤产生的线性脚本。单纯的来模拟用户完整的操作场景。线性脚本中每个脚本都相互独立,且不会产生其他依赖与调用,其实就是简单模拟用户某个操作流程都脚本。
    操作,重复操作,数据都混合在一起。
    优点:每个脚本相对独立,且不产生其他依赖和调用。
    缺点:开发成本高,用例之间存在重复的操作。比如重复的用户登录和退出。维护成本高,由于重复的操作,当重复的操作发生改变时,则需要逐一进行脚本的修改。

    '''
    案例:自动登录与退出操作
    '''
    
    from selenium import webdriver
    from time import sleep
    
    driver = webdriver.Firefox()
    driver.get_cookie("http://localhot/")
    
    # 输入用户名
    driver.find_element_by_name('username').clear()
    driver.find_element_by_name('username').send_keys('zxw')
    
    # 输入密码
    driver.find_element_by_name('password').clear()
    driver.find_element_by_name('password').send_keys('123456')
    
    # 登录
    driver.find_element_by_name('Submit').click()
    sleep(3)
    
    # 退出
    driver.find_element_by_link_text('退出').click()
    driver.switch_to.alert().accept()
    sleep(3)
    
    driver.quit()
    

    2、模块化驱动测试

    线性模型虽然每个用例都可以拿来独立运行,但是用例之间重复代码很多,开发、维护成本高。其实把重复的操作代码封装为独立的公共模块,当用例执行时需要用到这部分,直接调用即可,这就是模块驱动的方式。比如登录系统、退出登录、截图函数等等。
    操作+(重复操作,数据)混合在一起。
    优点:由于最大限度消除了重复,从而提高了开发效率和提高测试用例的可维护性。
    缺点:虽然模块化的步骤相同,但是测试数据不同。比如说重复的登录模块,如果登录用户不同,依旧要重复编写登录脚本。

    from selenium import webdriver
    from time import sleep
    
    
    class Login():
        def user_login(self, driver):
            # 输入用户名
            driver.find_element_by_name('username').clear()
            driver.find_element_by_name('username').send_keys('zxw')
    
            # 输入密码
            driver.find_element_by_name('password').clear()
            driver.find_element_by_name('password').send_keys('123456')
    
            # 登录
            driver.find_element_by_name('Submit').click()
    
        def user_logout(self, driver):
            # 退出
            driver.find_element_by_link_text('退出').click()
            sleep(3)
            driver.switch_to.alert().accept()
    
    
    if __name__ == '__main__':
        driver = webdriver.Firefox()
        driver.get("http://127.0.0.1")
        # 隐式等待
        driver.implicitly_wait(10)
    
        Login.user_login(driver)
        Login.user_logout(driver)
    
    # 调用登录模块
    from LoginClass import *
    
    driver = webdriver.Firefox()
    driver.get("http://localhost/")
    driver.implicitly_wait(10)
    
    Login().user_login(driver)
    Login.user_logout(driver)
    

    3、数据驱动测试(参数化)

    模块驱动测试等模型虽然解决了脚本的重复问题,但是需要测试不同数据的用例时,模块驱动的方式就不狠适合了。数据驱动就是数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变。装载数据的方式可以使列表、字典或是外部文件(txt、csv、xml、excel),目的就是实现数据和脚本的分离。
    操作+重复操作+数据分开。
    优点:通过这种方式,将数据和重复操作分开,可以快速增加相似测试,完成不同数据情况下的测试。

    from selenium import webdriver
    from time import sleep
    
    
    class Login():
        def user_login(self, driver, username, password):
            # 输入用户名
            driver.find_element_by_name('username').clear()
            driver.find_element_by_name('username').send_keys(username)
    
            # 输入密码
            driver.find_element_by_name('password').clear()
            driver.find_element_by_name('password').send_keys(password)
    
            # 登录
            driver.find_element_by_name('Submit').click()
    
        def user_logout(self, driver):
            # 退出
            driver.find_element_by_link_text('退出').click()
            sleep(3)
            driver.switch_to.alert().accept()
    
    
    if __name__ == '__main__':
        driver = webdriver.Firefox()
        driver.get("http://127.0.0.1")
        # 隐式等待
        driver.implicitly_wait(10)
    
        Login.user_login(driver, "test", "123456")
        Login.user_logout(driver)
    
    # 调用登录模块
    from LoginClass_para import *
    
    driver = webdriver.Firefox()
    driver.get("http://localhost/")
    driver.implicitly_wait(10)
    
    Login().user_login(driver, "test", "123456")
    Login.user_logout(driver)
    

    4、关键字驱动测试

    通过关键字的改变从而驱动自动化测试的执行,最终引起测试结果的改变。selenium IDE是一种传统的关键字驱动的自动化工具,Robot Framework是一个功能更强大的关键字驱动测试框架。

  • 相关阅读:
    LeetCode Flatten Binary Tree to Linked List
    LeetCode Longest Common Prefix
    LeetCode Trapping Rain Water
    LeetCode Add Binary
    LeetCode Subsets
    LeetCode Palindrome Number
    LeetCode Count and Say
    LeetCode Valid Parentheses
    LeetCode Length of Last Word
    LeetCode Minimum Depth of Binary Tree
  • 原文地址:https://www.cnblogs.com/xidian2014/p/10422736.html
Copyright © 2011-2022 走看看