unittest詳解(三) 測試套件(TestSuite)


在前面一章中示例了如何編寫一個簡單的測試,但有兩個問題:

  1. 我們知道測試用例的執行順序是根據測試用例名稱順序執行的,在不改變用例名稱的情況下,我們怎么來控制用例執行的順序呢?
  2. 一個測試文件,我們直接執行該文件即可,但如果有多個測試文件,怎么進行組織,總不能一個個文件執行吧?

要解決上面兩個問題,我們就要用到測試套件(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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM