qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請?jiān)L問 http://qaseven.github.io/

          使用Python Selenium進(jìn)行自動化功能測試

          Why Automation Testing
            現(xiàn)在似乎大家都一致認(rèn)同一個項(xiàng)目應(yīng)該有足夠多的測試來保證功能的正常運(yùn)作,而且這些此處的‘測試’特指自動化測試;并且大多數(shù)人會認(rèn)為如果還有哪個項(xiàng)目依然采用人工測試來保證代碼的正確性的話,那簡直是太落后了,太不可思議了。
            但是在我現(xiàn)在的項(xiàng)目里,之前大部分的情況下我們還是在使用手動測試,項(xiàng)目依然在每周一次井然有序的上線著。當(dāng)然有部分原因是因?yàn)轫?xiàng)目業(yè)務(wù)和技術(shù)上的特殊性,但是這開始讓我思考:我們究竟為什么要進(jìn)行自動化?什么情況下該進(jìn)行自動化?自動化測試使用與所有的測試場景嗎?
            我認(rèn)為自動化測試對我們的項(xiàng)目之所以重要,有幾點(diǎn)原因:
            Automated Software Testing Saves Time
            我們的項(xiàng)目現(xiàn)在以每周一次的頻率上線,由于項(xiàng)目本身的特殊性,每次上線后就要進(jìn)行一次大規(guī)模的手動測試來保證不會break任何已有功能。這樣的測試每周一次的重復(fù)著,測試的內(nèi)容也毫無變化,這消耗了團(tuán)隊(duì)成員大部分的時間和精力。所以引入自動化測試之后我們就能夠運(yùn)行自動化測試來完成這些重復(fù)性的工作,節(jié)省了時間和不必要的勞動。
            Team Morale Improves
            并不是說如果沒有測試我們就對自己的代碼沒有了信心。但是無論多么厲害的程序員都沒有辦法保證自己的代碼能夠100%毫無差錯的運(yùn)行,尤其是當(dāng)這些代碼需要和一個已有的項(xiàng)目結(jié)合起來運(yùn)作的時候。當(dāng)我們的代碼和別的項(xiàng)目結(jié)合的時候,我們有時會擔(dān)心我們的代碼能夠單獨(dú)的運(yùn)作,但是卻會在集成后破壞一些原有的功能。特別是在這種情況確實(shí)發(fā)生過之后,這樣的擔(dān)心又會被進(jìn)一步放大。自動化運(yùn)行的測試能夠在一定程度上保證我們的代碼是按照我們的期待運(yùn)作的,這就加強(qiáng)了開發(fā)人員對自己的代碼的信心。并且這種信心不是出于程序員對自己的代碼的欣賞,而是自己的代碼能夠真的經(jīng)受檢驗(yàn)后正常運(yùn)作。同時,這樣的信心也來自于自動化測試帶來的第三個好處:
            Increase Test Coverage
            正是因?yàn)樽詣踊瘻y試可以覆蓋到更多的人工測試需要花大量時間精力才能覆蓋到的測試范圍和深度,我們才能知道我們的代碼在一定程度上已經(jīng)能夠經(jīng)受住考驗(yàn)了,才能對自己的代碼更有信心的繼續(xù)后續(xù)的集成和開發(fā)。
            Selenium + Python
            Selenium是一個自動化瀏覽器的工具,常被用來做web應(yīng)用的自動化測試。它與其他的測試工具相比優(yōu)勢主要在于:
            Selenium 測試直接在瀏覽器中運(yùn)行,就像真實(shí)用戶所做的一樣。
            Selenium webdriver可以運(yùn)行在各種不同的操作系統(tǒng)的眾多瀏覽器平臺上:
          Google Chrome 12.0.712.0+
          Internet Explorer 6, 7, 8, 9 - 32 and 64-bit where applicable
          Firefox 3.0, 3.5, 3.6, 4.0, 5.0, 6, 7
          Opera 11.5+
          HtmlUnit 2.9
          Android – 2.3+ for phones and tablets (devices & emulators)
          iOS 3+ for phones (devices & emulators) and 3.2+ for tablets (devices & emulators)
            另外,selenium提供多種編程語言支持:Java, Javascript, Ruby, PHP, Python, Perl , C#。
            在這么多的語言支持中,為什么我們選擇了python呢?
            首先,python是一門非常容易入門的面向?qū)ο蟮哪_本語言。我在開始寫python+selenium之前完全沒有python的編程經(jīng)驗(yàn),但是由于它的語法相當(dāng)簡單,并且表意和英語十分接近,因此讓人能在簡單的學(xué)習(xí)之后就快速的上手。
            另外,作為一門腳本語言,相較于java來說就有了天生的優(yōu)勢:解釋執(zhí)行。這就意味著我寫了幾行代碼,只需要一行命令就可以快速的運(yùn)行起來看到結(jié)果,而不像Java那樣需要漫長的編譯打包等過程。完成同樣的功能,python只需要一個py文件和一行命令,而java則需要整整一個project,然后編譯打包發(fā)布等等。就算使用maven,也要進(jìn)行很多相關(guān)的配置,過程相當(dāng)麻煩。
            在將python與selenium結(jié)合起來寫functional test時,只需要在機(jī)器上配置好python的環(huán)境,下載selenium(easy_install selenium),編寫測試代碼,然后一句簡單的命令:python xxx.py 就可以將測試代碼運(yùn)行起來。
            How to Write Test Code
            首先,我們需要將selenium webdriver的依賴加入我們的測試代碼中:
            from selenium import webdriver
            webdriver組件包含了所有的WebDriver的實(shí)現(xiàn),這樣我們就可以使用selenium webdriver為我們提供的瀏覽器交互等強(qiáng)大的功能了。
            driver = web driver.Firefox()
            driver.get("http://www.google.com")
            創(chuàng)建一個Firefox WebDriver的實(shí)例,driver.get方法將打開方法參數(shù)中給出的URL所指向的網(wǎng)頁。這行代碼將會等到指向的目標(biāo)頁面完全加載后才會把控制還給后續(xù)的代碼。
            得到了我們想要打開的頁面后,我們就可以對網(wǎng)頁進(jìn)行一些基礎(chǔ)的判斷:
            assert "Google" in driver.title
            這個斷言會判斷網(wǎng)頁的html <title>標(biāo)簽中是否包含“Google”這個字符串。這種斷言很常見,可以用來判斷打開的是否是我們期待的頁面。
            之后,在目標(biāo)頁面上,我們可以進(jìn)一步的定位到每一個頁面元素,與這些元素進(jìn)行交互來模仿用戶操作,測試元素的行為是否和我們預(yù)期的相符:
          searchInput = driver.find_element_by_id("lst-ib")
          searchInput.send_keys("selenium")
          searchBtn = driver.find_element_by_name("btnK")
          searchBtn.click()
            WebDriver提供了多種的定位到元素的方法:
            click()與send_keys()都是selenium.webdriver.common.action_chains.ActionChains中提供的與元素交互的方法。click()模擬了對一個元素的點(diǎn)擊,send_keys()模擬了向一個元素輸入一些鍵盤輸入。其他的交互方法可以查看API。
            最后,在完成了頁面操作之后我們可以使用driver.close()或是driver.quit()來退出。這兩者的區(qū)別是:close只關(guān)閉一個tab,quit則是關(guān)閉整個瀏覽器。
            A Simple Demo
            上面的代碼嚴(yán)格來說并不像我們常常寫的測試代碼,它只是打開了一個網(wǎng)頁并做了一些簡單的操作而已。我們可以使用python提供的標(biāo)準(zhǔn)unittest庫來把它寫得更符合我們的測試代碼的風(fēng)格。使用unittest庫后,我們能在terminal中看到測試報告。
          import unittest
          from selenium import webdriver
          class GooglePageTest(unittest.TestCase):
          def setUp(self):
          self.driver = webdriver.Firefox()
          def test_click_all_links_on_page(self):
          driver = self.driver
          driver.get("http://www.google.com")
          length = len(driver.find_elements_by_tag_name("a"))
          for i in range(0,length):
          links = driver.find_elements_by_tag_name("a")
          if links[i].is_displayed():
          links[i].click()
          driver.back()
          self.assertIn("Google" or "YouTube",driver.title)
          def tearDown(self):
          self.driver.close()
          if __name__ == "__main__":
          unittest.main()
            這段代碼首先引入了unittest組件,然后使用我們熟悉的test case的風(fēng)格寫了一個測試用例,測試了Google主頁上面的所有<a>標(biāo)簽點(diǎn)擊,對每個打開的頁面檢查title中是否含有期待的關(guān)鍵字。測試結(jié)束后將自動關(guān)閉瀏覽器,并且在terminal中可以看到測試報告。

          posted on 2014-06-17 10:13 順其自然EVO 閱讀(327) 評論(0)  編輯  收藏 所屬分類: selenium and watir webdrivers 自動化測試學(xué)習(xí)

          <2014年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 平江县| 鄱阳县| 乌鲁木齐市| 蚌埠市| 长兴县| 吕梁市| 霸州市| 吉安市| 星座| 通城县| 乃东县| 漳浦县| 临汾市| 阜宁县| 三都| 桃江县| 嘉义市| 桂林市| 江城| 德阳市| 和田县| 客服| 绵阳市| 读书| 湖南省| 广元市| 锡林郭勒盟| 乳源| 郁南县| 济阳县| 岗巴县| 沙田区| 杂多县| 宣恩县| 锦屏县| 雷波县| 武乡县| 宁强县| 漳州市| 彰化市| 维西|