在前面一章中示例了如何編寫一個簡單的測試,但有兩個問題:
- 我們知道測試用例的執行順序是根據測試用例名稱順序執行的,在不改變用例名稱的情況下,我們怎么來控制用例執行的順序呢?
- 一個測試文件,我們直接執行該文件即可,但如果有多個測試文件,怎么進行組織,總不能一個個文件執行吧?
要解決上面兩個問題,我們就要用到測試套件(TestSuite)了
代碼:
# 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) self.driver = webdriver.Ie(executable_path=driverfile_path) self.driver.get("http://172.21.13.83:28080/") def tearDown(self): self.driver.quit() 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, '密碼不能為空') 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") 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, '密碼錯誤,請重新輸入!') def test_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, '用戶不存在!') if __name__ == "__main__": # 構造測試套件 suite = unittest.TestSuite() suite.addTest(CmsLoginTest("test_login1")) suite.addTest(CmsLoginTest("test_login2")) suite.addTest(CmsLoginTest("test_login4")) suite.addTest(CmsLoginTest("test_login3")) # 執行測試 runner = unittest.TextTestRunner(verbosity=2) runner.run(suite)
注:verbosity
參數可以控制輸出的錯誤報告的詳細程度,默認是 1;
如果設為 0
,則不輸出每一用例的執行結果;如果設為 2
,則輸出詳細的執行結果
執行結果:
"C:\Program Files\Python36\python.exe" D:/Git/Test_Framework/utils/1.py test_login1 (__main__.CmsLoginTest) 用戶名、密碼為空 ... ok test_login2 (__main__.CmsLoginTest) 用戶名正確,密碼錯誤 ... ok test_login4 (__main__.CmsLoginTest) 用戶名不存在 ... ok test_login3 (__main__.CmsLoginTest) 用戶名、密碼正確 ... ok ---------------------------------------------------------------------- Ran 4 tests in 44.818s OK Process finished with exit code 0
從用例的執行結果中我們可以看到,用例的執行順序是按照添加用例時的順序來執行的
一個一個地添加測試用例到測試套件中,有點麻煩,其實我們可以把要執行的測試用例用個列表來管理,然后再把這個列表添加到測試套件中,如下代碼:
if __name__ == "__main__": # 構造測試套件 suite = unittest.TestSuite() test_cases = [CmsLoginTest("test_login1"),CmsLoginTest("test_login2"),CmsLoginTest("test_login4"), CmsLoginTest("test_login3")] suite.addTests(test_cases) # 執行測試 runner = unittest.TextTestRunner(verbosity=2) runner.run(suite)
下面我們就來講講多個文件的測試用例組織。
假如我有兩個系統的登錄需要測試,測試用例分別放在兩個文件中(cmslogin.py,smelogin.py),現在我需要把這兩個文件中的用例添加到一個測試套件中來執行,為此我們要重新建立一個叫run_all.py的文件
import unittest from cmslogin import CmsLoginTest from smelogin import SmeLoginTest if __name__ == "__main__": # 構造測試套件 suite = unittest.TestSuite() test_cases = [CmsLoginTest("test_login1"),CmsLoginTest("test_login2"),CmsLoginTest("test_login4"), CmsLoginTest("test_login3"),SmeLoginTest("test_login1"),SmeLoginTest("test_login2")] suite.addTests(test_cases) # 執行測試 runner = unittest.TextTestRunner(verbosity=2) runner.run(suite)
還可以用addTests + TestLoader方法來添加用例,但是這種方法是無法對case進行排序的
import unittest from cmslogin import CmsLoginTest from smelogin import SmeLoginTest if __name__ == "__main__": # 構造測試套件 suite = unittest.TestSuite() # 第一種方法:傳入'模塊名.TestCase名' suite.addTests(unittest.TestLoader().loadTestsFromName('cmslogin.CmsLoginTest')) suite.addTests(unittest.TestLoader().loadTestsFromName('smelogin.SmeLoginTest')) # 這里還可以把'模塊名.TestCase名'放到一個列表中 suite.addTests(unittest.TestLoader().loadTestsFromNames(['cmslogin.CmsLoginTest','smelogin.SmeLoginTest'])) # 第二種方法:傳入TestCase suite.addTests(unittest.TestLoader().loadTestsFromTestCase(CmsLoginTest)) # 執行測試 runner = unittest.TextTestRunner(verbosity=2) runner.run(suite)