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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM