之前在公司做過自動化測試的知識分享,現在把它記錄下來。
•一、如何更好的編寫測試用例
•1.模塊化:將一些基礎的、共有的步驟代碼獨立為單獨的模塊,使用時再調用。好處:可以使代碼復用,減少代碼編寫,利於變動時維護。比如登錄,退出等操作。
•2.參數化:將參數變化的輸入,可以讀取文件,或者產生隨機數。比如新增操作,很多時候要求數據唯一,參數化后可以有效解決這個問題。
•
•二、如何方便的組織、運行測試用例
•1.用例的組織架構划分清晰。這樣利於查找、維護
•2.命名規范。這樣便於識別哪些是測試用例
•三、用例執行結果的要求
•1.能導出結果,進行統計,並顯示錯誤
•三、Unittest模塊的簡單介紹
• unittest是一個單元測試的工具,提供了一些方法來方便進行單元測試。我們在這里用到它主要是解決上面說的幾個問題,再概況一下就是
•1、提供用例組織與執行方法
•①unittest 所提供有 TestSuite()類,其中的addTtest()方法,可以將命名規范的用例“組裝”起來(一個py文件可以有幾個用例)
•②defaultTestLoader 類,discover() 方法可以識別一定命名規則的文件,結合①就可以將不同文件中全部的測試用例組裝好
•③TextTestRunner()類, 通過它下面的 run()方法來運行 suite 所組裝的測試用例
•2、提供比較方法
• 用例的執行,總會有預期結果。unittest提供了很多比較的方法,比如assertEqual(a, b),用法:assertEqual(first, second, msg=……..),這是相等的方法,最后的msg是當不相等時,提供的提示信息。
•
3、提供豐富的日志、清晰的報告
使用擴展HTMLTestRunner生出測試報告
3、提供豐富的日志、清晰的報告
四、實例
•文件結構:
•…/ program/ all_test.py
• login.py
• xitongguanli/ test_1.py
• / test_2.py
•
•解釋:①all_test.py,是組裝、運行測試用例
• ②login.py是一個獨立出來的登錄模塊
• ③test開頭的文件,就是測試用例所在的文件
1.all_test.py
#coding=utf-8 import unittest import HTMLTestRunner import time def creatsuite(): testunit=unittest.TestSuite() #定義測試文件查找的目錄 test_dir='F:\\python\\selemium\\program' #定義 discover 方法的參數 discover=unittest.defaultTestLoader.discover(test_dir, pattern ='test_*.py', top_level_dir=None) #discover 方法篩選出來的用例,循環添加到測試套件中 for test_suite in discover: for test_case in test_suite: testunit.addTests(test_case) print testunit return testunit alltestnames = creatsuite() if __name__ == '__main__': now = time.strftime("%Y-%m-%d %H_%M_%S") filename = 'F:\\python\\selemium\\program\\'+now+'result.html' fp = file(filename,'wb') runner = HTMLTestRunner.HTMLTestRunner( stream = fp, title = u'測試報告', description = u'用例的執行情況') runner.run(alltestnames) fp.close()
2.login.py
#coding=utf-8 from selenium import webdriver import time driver = webdriver.Firefox() driver.maximize_window() driver.implicitly_wait(10) driver.get("http://www.baidu.com") def login(): driver.find_element_by_xpath("//div/div/div[@id='u1']/a[7]").click() driver.find_element_by_css_selector("#TANGRAM__PSP_8__userName").clear() driver.find_element_by_css_selector("#TANGRAM__PSP_8__userName").send_keys("xxxx") driver.find_element_by_css_selector("#TANGRAM__PSP_8__password").send_keys("xxxxxxx") driver.find_element_by_css_selector("#TANGRAM__PSP_8__submit").click()
3.test_1.py
#coding=utf-8 from selenium import webdriver import unittest, time, login import random random1 = random.randint(100000, 200000) class MyTest(unittest.TestCase): u'''百度搜索用例''' def setUp(self): self.driver = login.driver #self.driver.maximize_window() #self.driver.implicitly_wait(10) #self.base_url = "http://www.baidu.com" def test_baidu(self): driver = self.driver login.login() time.sleep(2) #driver.get(self.base_url + "/") driver.find_element_by_id("kw").clear() driver.find_element_by_id("kw").send_keys(random1) driver.find_element_by_id("su").click() time.sleep(2) title = driver.title #self.assertEqual(title, random1+u"_百度搜索") def tearDown(self): self.driver.quit() if __name__ == "__main__": unittest.main()
最后的結果是這樣子的:

