addTest:用例按順序執行
問題:
- 我們知道測試用例的執行順序是根據測試用例名稱順序執行的,在不改變用例名稱的情況下,我們怎么來控制用例執行的順序呢?
- 一個測試文件,我們直接執行該文件即可,但如果有多個測試文件,怎么進行組織,總不能一個個文件執行吧?
要解決上面兩個問題,我們就要用到測試套件(TestSuite)了
代碼如下:
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
,則輸出詳細的執行結果
一個一個地添加測試用例到測試套件中,有點麻煩,其實我們可以把要執行的測試用例用個列表來管理,然后再把這個列表添加到測試套件中,如下代碼:
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)