本文目錄
一、什么是自動化測試
二、什么情況不需要自動化測試
三、自動化測試過程
四、在這個過程中遇到的問題
一、什么是自動化測試
把人為驅動的測試行為轉化為機器執行的一種過程稱為自動化測試。(來自百度百科)本質上來說,自動化測試對比起手工測試除了需要寫代碼外並沒有什么不同,它們的不同在於在各自適合的場景不同,從而使它們能夠在它們的場合發揮更大的優勢。
二、什么情況不需要自動化測試
①需求變動頻繁
②項目周期短
③自動化腳本一次性
等受時間(少)、技術(難度大)和重用性(低)因素影響的情況
三、自動化測試過程
上面說了很多概念性的東西,現在我引入一個實例來說明自動化測試的過程。現在有一個場景,我們需要測試一個網站的登錄界面(簡書的登錄頁面)。
首先需要寫測試用例(如果有需求文檔再寫測試用例更好,這里的登錄只做最簡單的手機或郵箱、密碼登錄,其他如記住我,注冊功能不測試)
組合有兩個:
手機+密碼,可以拓展成①手機已注冊+密碼正確,②手機已注冊+密碼不正確,③手機未注冊+密碼在數據庫內,④手機未注冊+密碼不在數據庫內,⑤手機號密碼均為空,⑥手機號為空,⑦密碼為空,⑧手機號密碼都不空。其中手機號密碼全部空的情況前面四種情況都可以驗證。
郵箱+密碼,可以拓展的幾個方面與上面相同。所以寫成的手工測試用例如下圖(圖片中所有數據均為虛擬數據,僅供參考)
然后我們可以把這個手工測試用例轉變成自動測試用例,以上的用例都屬於登錄這個行為的,自動化測試的用例比手工測試的用例要更詳細一點。 這里舉兩個例子
上面的自動化測試用例中有id(編號),feature(功能名稱),scenario(場景名稱),given(前置條件),when(操作步驟),then(預測結果),result(實際結果)這幾個元素其中,given,when,then是所有用例的基本元素,在此基礎上還可以擴展更多的元素如測試數據的覆蓋率,測試結果的可靠性等等,這里的元素都是用到英文是為了方便使用某些測試框架的時候直接用,可以看到里面填入的內容對比起手工測試用例要更加詳細更加腳本化。
經過用例設計評審后開始進行測試,因為這次是自動化測試,所以需要寫腳本,驗證腳本正確性,提交缺陷。如果把腳本和用例等寫在測試框架里面會更有利於我們對這次測試的管理,不過自動化測試框架是一個需要展開的內容,所以留到下下次講。
現在我們用一個現成的框架unittest
import unittest import time from selenium import webdriver from selenium.webdriver import ActionChains class testcase(unittest.TestCase): def setUp(self): print("test start") self.browser = webdriver.Chrome(r'D:\webdriver\chromedriver.exe') url = 'https://www.jianshu.com/sign_in' self.browser.get(url) input1 = self.browser.find_element_by_id('session_remember_me') selected = input1.is_selected() if selected:#判斷勾選框是否勾選,把“記住我”勾選去掉 input1.click() def test_Login_001(self):#必須要加test在前面不然不執行 print("Login_001") self.browser.find_element_by_id('session_email_or_mobile_number').send_keys('18888888888') self.browser.find_element_by_id('session_password').send_keys('ABC111') self.browser.find_element_by_class_name('sign-in-button').click() time.sleep(30) try: hover_element = self.browser.find_element_by_class_name('user') #獲取需要鼠標懸停才能顯示下拉欄的元素class ActionChains(self.browser).move_to_element(hover_element).perform() #鼠標移動到這個元素並懸停(在頭像處懸停) time.sleep(3) self.browser.find_element_by_link_text('我的主頁').click() #懸停后下拉欄選擇“我的主頁” result1 = self.browser.find_element_by_xpath("//a[@class='name']").text self.assertEqual(result1, '昵稱') #只能是self.直接不能是self.browser. except Exception as e: print("error reason:s%" % e) raise e time.sleep(1) def test_Login_002(self): print("Login_001") self.browser.find_element_by_id('session_email_or_mobile_number').send_keys('18888888888') self.browser.find_element_by_id('session_password').send_keys('') self.browser.find_element_by_class_name('sign-in-button').click() time.sleep(8) try: result1 = self.browser.find_element_by_xpath("//span[@class='noty_text']").text self.assertEqual(result1, '手機號碼/郵箱地址或密碼不能為空') #只能是self.直接不能是self.browser. except Exception as e: print("error reason:s%" % e) raise e time.sleep(1) ''' 可以繼續加入用例 ''' def tearDown(self): self.browser.quit() print('test gone') if __name__=="__main__": unittest.main()
上面的代碼只寫了兩條用例,剩下也是按照這個思路寫,很多的代碼解釋我也寫作注釋了。因為這一篇章我不考慮驗證碼的問題,所以這里處理驗證碼的方法是在按登錄后等待手動操作接着獲取結果,用斷言assertEqual判斷結果是否正確。
這里用了setup和teardown兩種方法,這兩種方法都是每個case運行前或運行后都會執行一次的。這里也可以用setupclass和teardownclass來替代,這兩種方法是在所有case執行前或執行后用一次,如果在以上這個例子中用setupclass和teardownclass需要在每個case的結尾加上重置回登錄頁面的代碼,所以setupclass和teardownclass更加適合流程遞進的用例。
不過這里需要提一下最后的這里unittest.main(),可以看到在執行程序前,引入了unittest,最后這個入口也指向了unittest的main方法,我們來看一下用例是如何被實現的。
首先,打開python文件夾,如果沒有改安裝路徑應該會在C盤(如C:\Python\Lib\unittest),打開main.py文件可以看到unittest.main()調用的是class TestProgram進入到init初始化testRunner、testLoader並根據用例模塊即我們寫的case創建測試集和執行它。簡單來說就是unittest.main()其實是到了class TestProgram里面我們的case經過init方法初始化case需要進行的所有動作,parseArgs方法傳入參數並賦值,createTests方法根據前一個方法的賦值創建測試集,runTests方法執行測試用例這四個步驟。
完成測試需要輸出測試結果
import unittest import HTMLTestRunner import time import testcase suite=unittest.TestSuite()#創建測試集,也就是把所有的用例放在一起 ts=unittest.TestLoader()#加載測試 suite.addTests(ts.loadTestsFromModule(testcase))#尋找模塊名testcase的用例,把它加載並加入到測試集 now=time.strftime("%Y-%m-%d_%H_%M_%S") path="python_report"+now+".html" with open(path,"wb+") as f: runner=HTMLTestRunner.HTMLTestRunner(stream=f,verbosity=2,title='MathFunc Test Report',description='generated by HTMLTestRunner.') ''' stream表示測試報告寫入文件的存儲區域,如stream=f表示以文件流的方式輸出報告到open(path,"wb+")的路徑 verbosity=1的時候 默認值為1,不限制完整結果,即單個用例成功輸出’.’,失敗輸出’F’,錯誤輸出’E’ =0的時候。不輸出信息 =2的時候,需要打印詳細的返回信息 title表示測試報告標題 description表示測試報告描述 ''' runner.run(suite)#輸出結果html
這里的HTMLTestRunner我是下載HTMLTestRunner.py再進行修改得到的 ,修改方法及下載網上可查,你也可以通過pip install html-testRunner的方法下載最新的HTMLTestRunner,方法同樣網上可查展示效果如下:
用戶指導手冊
用戶指導手冊每個公司都會有模板按照模板來寫就可以了。
四、在這個過程你可能會遇到的問題:
1.下載webdriver與瀏覽器或者瀏覽器版本是否匹配
這一章,主要說了不需要驗證碼的自動化登錄是如何執行的,下一章我們聊一下有驗證碼的情況應該如何做登錄功能的自動化測試,下下一章我們再聊自動化測試框架。