unittest是python內置的一個單元測試框架,在學習怎么使用它之前,我們先來了解它的一些概念和原理。
- Test Case:測試用例,一個TestCase的實例就是一個測試用例。什么是測試用例呢?就是一個完整的測試流程,包括測試前准備環境的搭建(setUp),執行測試代碼(run),以及測試后環境的還原(tearDown)。單元測試(unit test)的本質也就在這里,一個測試用例是一個完整的測試單元,通過運行這個測試單元,可以對某一個問題進行驗證。
- Test Suite:測試套件,就是多個測試用例集合在一起
- Test Runner:測試執行,用來執行測試用例,其中的run(test)會執行TestSuite/TestCase
- Test Fixture:對一個測試用例環境的搭建和銷毀,是一個fixture,通過覆蓋TestCase的setUp()和tearDown()方法來實現。這個有什么用呢?比如說在這個測試用例中需要訪問數據庫,那么可以在setUp()中建立數據庫連接以及進行一些初始化,在tearDown()中清除在數據庫中產生的數據,然后關閉連接。注意tearDown的過程很重要,要為以后的TestCase留下一個干凈的環境。
了解了概念后,我們來看一個登陸的測試腳本。
代碼:
# coding = utf-8 import unittest import warnings from selenium import webdriver from time import sleep # 驅動文件路徑 driverfile_path = r'D:\coship\Test_Framework\drivers\IEDriverServer.exe' class CmsLoginTest(unittest.TestCase): def setUp(self): # 這行代碼的作用是忽略一些告警打印 warnings.simplefilter("ignore", ResourceWarning) print("test start!") self.driver = webdriver.Ie(executable_path=driverfile_path) self.driver.get("http://172.21.13.83:28080/") def tearDown(self): self.driver.quit() print("test end!") def test_login1(self): '''用戶名、密碼為空''' self.driver.find_element_by_css_selector("#imageField").click() error_message1 = self.driver.find_element_by_css_selector("[for='loginName']").text error_message2 = self.driver.find_element_by_css_selector("[for='textfield']").text self.assertEqual(error_message1, '用戶名不能為空') self.assertEqual(error_message2, '密碼不能為空') print("用例test_login1執行結束") def test_login3(self): '''用戶名、密碼正確''' self.driver.find_element_by_css_selector("[name='admin.loginName']").send_keys("autotest") self.driver.find_element_by_css_selector("[name='admin.password']").send_keys("111111") self.driver.find_element_by_css_selector("#imageField").click() sleep(1) self.driver.switch_to.frame("topFrame") username = self.driver.find_element_by_css_selector("#nav_top>ul>li>a").text self.assertEqual(username,"autotest") print("用例test_login3執行結束") def test_login2(self): '''用戶名正確,密碼錯誤''' self.driver.find_element_by_css_selector("[name='admin.loginName']").send_keys("autotest") self.driver.find_element_by_css_selector("[name='admin.password']").send_keys("123456") self.driver.find_element_by_css_selector("#imageField").click() error_message = self.driver.find_element_by_css_selector(".errorMessage").text self.assertEqual(error_message, '密碼錯誤,請重新輸入!') print("用例test_login2執行結束") def login4(self): '''用戶名不存在''' self.driver.find_element_by_css_selector("[name='admin.loginName']").send_keys("test007") self.driver.find_element_by_css_selector("[name='admin.password']").send_keys("123456") self.driver.find_element_by_css_selector("#imageField").click() error_message = self.driver.find_element_by_css_selector(".errorMessage").text self.assertEqual(error_message, '用戶不存在!') print("用例login4執行結束") if __name__ == "__main__": unittest.main()
執行結果:
"C:\Program Files\Python36\python.exe" D:/Git/Test_Framework/utils/1.py test start! 用例test_login1執行結束 .test end! test start! 用例test_login2執行結束 .test end! test start! 用例test_login3執行結束 test end! . ---------------------------------------------------------------------- Ran 3 tests in 34.044s OK Process finished with exit code 0
從腳本和運行結果我們可以得到以下結論:
- 要使用unittest這個測試框架時,需要先導入unittest
- 定義一個測試類時,要繼承unittest.TestCase這個類
- setUp()是測試用例執行前的環境准備,tearDown()是測試用例執行結束后的環境恢復,每個測試用例都會執行一次setUp()和tearDown()
- 測試用例必須以test開頭,否則不會被執行。
- 測試用例執行順序是根據用例名稱順序來執行的