Python基礎入門-unittest單元測試架構

來源:互聯網
上載者:User

標籤:from   uil   tde   屏蔽   not   訪問   sci   dfa   call   

    unittest單元測試架構不僅可以適用於單元測試,還可以適用WEB自動化測試案例的開發與執行,該測試架構可組織執行測試案例,並且提供了豐富的斷言方法,判斷測試案例是否通過,最終產生測試結果。今天筆者就總結下如何使用unittest單元測試架構來進行WEB自動化測試。

目錄

一、unittest模組的各個屬性說明

二、使用unittest架構編寫測試案例思路

三、使用unittest架構編寫測試案例執行個體

一、unittest模組的各個屬性說明

    先來聊一聊unittest模組的各個屬性,所謂知己知彼方能百戰百勝,瞭解unittest的各個屬性,對於後續編寫用例有很大的協助。

1.unittest的屬性如下:

[‘BaseTestSuite‘, ‘FunctionTestCase‘, ‘SkipTest‘, ‘TestCase‘, ‘TestLoader‘, ‘TestProgram‘, ‘TestResult‘, ‘TestSuite‘, ‘TextTestResult‘, ‘TextTestRunner‘, ‘_TextTestResult‘, ‘__all__‘, ‘__builtins__‘, ‘__doc__‘, ‘__file__‘, ‘__name__‘, ‘__package__‘, ‘__path__‘, ‘__unittest‘, ‘case‘, ‘defaultTestLoader‘, ‘expectedFailure‘, ‘findTestCases‘, ‘getTestCaseNames‘, ‘installHandler‘, ‘loader‘, ‘main‘, ‘makeSuite‘, ‘registerResult‘, ‘removeHandler‘, ‘removeResult‘, ‘result‘, ‘runner‘, ‘signals‘, ‘skip‘, ‘skipIf‘, ‘skipUnless‘, ‘suite‘, ‘util‘]

說明:

unittest.TestCase:TestCase類,所有測試案例類繼承的基本類。

class BaiduTest(unittest.TestCase):

unittest.main():使用她可以方便的將一個單元測試模組變為可直接啟動並執行測試指令碼,main()方法使用TestLoader類來搜尋所有包含在該模組中以“test”命名開頭的測試方法,並自動執行他們。執行方法的預設順序是:根據ASCII碼的順序載入測試用例,數字與字母的順序為:0-9,A-Z,a-z。所以以A開頭的測試案例方法會優先執行,以a開頭會後執行。

unittest.TestSuite():unittest架構的TestSuite()類是用來建立測試套件的。

unittest.TextTextRunner():unittest架構的TextTextRunner()類,通過該類下面的run()方法來運行suite所組裝的測試案例,入參為suite測試套件。

unittest.defaultTestLoader(): defaultTestLoader()類,通過該類下面的discover()方法可自動更具測試目錄start_dir匹配尋找測試案例檔案(test*.py),並將尋找到的測試案例組裝到測試套件,因此可以直接通過run()方法執行discover。用法如下:

discover=unittest.defaultTestLoader.discover(test_dir, pattern=‘test_*.py‘)

unittest.skip():裝飾器,當運行用例時,有些用例可能不想執行等,可用裝飾器暫時屏蔽該條測試案例。一種常見的用法就是比如說想調試某一個測試案例,想先屏蔽其他用例就可以用裝飾器屏蔽。

@unittest.skip(reason): skip(reason)裝飾器:無條件跳過裝飾的測試,並說明跳過測試的原因。

@unittest.skipIf(reason): skipIf(condition,reason)裝飾器:條件為真時,跳過裝飾的測試,並說明跳過測試的原因。

@unittest.skipUnless(reason): skipUnless(condition,reason)裝飾器:條件為假時,跳過裝飾的測試,並說明跳過測試的原因。

@unittest.expectedFailure(): expectedFailure()測試標記為失敗。

 

2.TestCase類的屬性如下:

[‘__call__‘, ‘__class__‘, ‘__delattr__‘, ‘__dict__‘, ‘__doc__‘, ‘__eq__‘, ‘__format__‘, ‘__getattribute__‘, ‘__hash__‘, ‘__init__‘, ‘__module__‘, ‘__ne__‘, ‘__new__‘, ‘__reduce__‘, ‘__reduce_ex__‘, ‘__repr__‘, ‘__setattr__‘, ‘__sizeof__‘, ‘__str__‘, ‘__subclasshook__‘, ‘__weakref__‘, ‘_addSkip‘, ‘_baseAssertEqual‘, ‘_classSetupFailed‘, ‘_deprecate‘, ‘_diffThreshold‘, ‘_formatMessage‘, ‘_getAssertEqualityFunc‘, ‘_truncateMessage‘, ‘addCleanup‘, ‘addTypeEqualityFunc‘, ‘assertAlmostEqual‘, ‘assertAlmostEquals‘, ‘assertDictContainsSubset‘, ‘assertDictEqual‘, ‘assertEqual‘, ‘assertEquals‘, ‘assertFalse‘, ‘assertGreater‘, ‘assertGreaterEqual‘, ‘assertIn‘, ‘assertIs‘, ‘assertIsInstance‘, ‘assertIsNone‘, ‘assertIsNot‘, ‘assertIsNotNone‘, ‘assertItemsEqual‘, ‘assertLess‘, ‘assertLessEqual‘, ‘assertListEqual‘, ‘assertMultiLineEqual‘, ‘assertNotAlmostEqual‘, ‘assertNotAlmostEquals‘, ‘assertNotEqual‘, ‘assertNotEquals‘, ‘assertNotIn‘, ‘assertNotIsInstance‘, ‘assertNotRegexpMatches‘, ‘assertRaises‘, ‘assertRaisesRegexp‘, ‘assertRegexpMatches‘, ‘assertSequenceEqual‘, ‘assertSetEqual‘, ‘assertTrue‘, ‘assertTupleEqual‘, ‘assert_‘, ‘countTestCases‘, ‘debug‘, ‘defaultTestResult‘, ‘doCleanups‘, ‘fail‘, ‘failIf‘, ‘failIfAlmostEqual‘, ‘failIfEqual‘, ‘failUnless‘, ‘failUnlessAlmostEqual‘, ‘failUnlessEqual‘, ‘failUnlessRaises‘, ‘failureException‘, ‘id‘, ‘longMessage‘, ‘maxDiff‘, ‘run‘, ‘setUp‘, ‘setUpClass‘, ‘shortDescription‘, ‘skipTest‘, ‘tearDown‘, ‘tearDownClass‘]

說明:

setUp():setUp()方法用於測試案例執行前的初始化工作。如測試案例中需要訪問資料庫,可以在setUp中建立資料庫連接並進行初始化。如測試案例需要登入web,可以先執行個體化瀏覽器。

tearDown():tearDown()方法用於測試案例執行之後的善後工作。如關閉資料庫連接。關閉瀏覽器。

assert*():一些斷言方法:在執行測試案例的過程中,最終用例是否執行通過,是通過判斷測試得到的實際結果和預期結果是否相等決定的。

assertEqual(a,b,[msg=‘測試失敗時列印的資訊‘]):斷言a和b是否相等,相等則測試案例通過。

assertNotEqual(a,b,[msg=‘測試失敗時列印的資訊‘]):斷言a和b是否相等,不相等則測試案例通過。

assertTrue(x,[msg=‘測試失敗時列印的資訊‘]):斷言x是否True,是True則測試案例通過。

assertFalse(x,[msg=‘測試失敗時列印的資訊‘]):斷言x是否False,是False則測試案例通過。

assertIs(a,b,[msg=‘測試失敗時列印的資訊‘]):斷言a是否是b,是則測試案例通過。

assertNotIs(a,b,[msg=‘測試失敗時列印的資訊‘]):斷言a是否是b,不是則測試案例通過。

assertIsNone(x,[msg=‘測試失敗時列印的資訊‘]):斷言x是否None,是None則測試案例通過。

assertIsNotNone(x,[msg=‘測試失敗時列印的資訊‘]):斷言x是否None,不是None則測試案例通過。

assertIn(a,b,[msg=‘測試失敗時列印的資訊‘]):斷言a是否在b中,在b中則測試案例通過。

assertNotIn(a,b,[msg=‘測試失敗時列印的資訊‘]):斷言a是否在b中,不在b中則測試案例通過。

assertIsInstance(a,b,[msg=‘測試失敗時列印的資訊‘]):斷言a是是b的一個執行個體,是則測試案例通過。

assertNotIsInstance(a,b,[msg=‘測試失敗時列印的資訊‘]):斷言a是是b的一個執行個體,不是則測試案例通過。

 

3.TestSuite類的屬性如下:(組織用例時需要用到)

[‘__call__‘, ‘__class__‘, ‘__delattr__‘, ‘__dict__‘, ‘__doc__‘, ‘__eq__‘, ‘__format__‘, ‘__getattribute__‘, ‘__hash__‘, ‘__init__‘, ‘__iter__‘, ‘__module__‘, ‘__ne__‘, ‘__new__‘, ‘__reduce__‘, ‘__reduce_ex__‘, ‘__repr__‘, ‘__setattr__‘, ‘__sizeof__‘, ‘__str__‘, ‘__subclasshook__‘, ‘__weakref__‘, ‘_addClassOrModuleLevelException‘, ‘_get_previous_module‘, ‘_handleClassSetUp‘, ‘_handleModuleFixture‘, ‘_handleModuleTearDown‘, ‘_tearDownPreviousClass‘, ‘_tests‘, ‘addTest‘, ‘addTests‘, ‘countTestCases‘, ‘debug‘, ‘run‘]

說明:

addTest(): addTest()方法是將測試案例添加到測試套件中,如下方,是將test_baidu模組下的BaiduTest類下的test_baidu測試案例添加到測試套件。

suite = unittest.TestSuite()suite.addTest(test_baidu.BaiduTest(‘test_baidu‘))
 

4.TextTextRunner的屬性如下:(組織用例時需要用到)

[‘__class__‘, ‘__delattr__‘, ‘__dict__‘, ‘__doc__‘, ‘__format__‘, ‘__getattribute__‘, ‘__hash__‘, ‘__init__‘, ‘__module__‘, ‘__new__‘, ‘__reduce__‘, ‘__reduce_ex__‘, ‘__repr__‘, ‘__setattr__‘, ‘__sizeof__‘, ‘__str__‘, ‘__subclasshook__‘, ‘__weakref__‘, ‘_makeResult‘, ‘buffer‘, ‘descriptions‘, ‘failfast‘, ‘resultclass‘, ‘run‘, ‘stream‘, ‘verbosity‘]

說明:

run(): run()方法是運行測試套件的測試案例,入參為suite測試套件。

runner = unittest.TextTestRunner()runner.run(suite)

 

二、使用unittest架構編寫測試案例思路

設計基本思路如下:

# coding=utf-8#1.先設定編碼,utf-8可支援中英文,如上,一般放在第一行#2.注釋:包括記錄建立時間,建立人,項目名稱。‘‘‘Created on 2016-7-27@author: JenniferProject:使用unittest架構編寫測試案例思路‘‘‘#3.匯入unittest模組import unittest#4.定義測試類別,父類為unittest.TestCase。#可繼承unittest.TestCase的方法,如setUp和tearDown方法,不過此方法可以在子類重寫,覆蓋父類方法。#可繼承unittest.TestCase的各種斷言方法。class Test(unittest.TestCase):     #5.定義setUp()方法用於測試案例執行前的初始化工作。#注意,所有類中方法的入參為self,定義方法的變數也要“self.變數”#注意,輸入的值為字元型的需要轉為int型    def setUp(self):        self.number=raw_input(‘Enter a number:‘)        self.number=int(self.number)#6.定義測試案例,以“test_”開頭命名的方法#注意,方法的入參為self#可使用unittest.TestCase類下面的各種斷言方法用於對測試結果的判斷#可定義多個測試案例#最重要的就是該部分    def test_case1(self):        print self.number        self.assertEqual(self.number,10,msg=‘Your input is not 10‘)            def test_case2(self):        print self.number        self.assertEqual(self.number,20,msg=‘Your input is not 20‘)    @unittest.skip(‘暫時跳過用例3的測試‘)    def test_case3(self):        print self.number        self.assertEqual(self.number,30,msg=‘Your input is not 30‘)#7.定義tearDown()方法用於測試案例執行之後的善後工作。#注意,方法的入參為self    def tearDown(self):        print ‘Test over‘        #8如果直接運行該檔案(__name__值為__main__),則執行以下語句,常用於測試指令碼是否能夠正常運行if __name__==‘__main__‘:#8.1執行測試案例方案一如下:#unittest.main()方法會搜尋該模組下所有以test開頭的測試案例方法,並自動執行它們。#執行順序是命名順序:先執行test_case1,再執行test_case2    unittest.main()‘‘‘#8.2執行測試案例方案二如下:#8.2.1先構造測試集#8.2.1.1執行個體化測試套件    suite=unittest.TestSuite()#8.2.1.2將測試案例載入到測試套件中。#執行順序是安裝載入順序:先執行test_case2,再執行test_case1    suite.addTest(Test(‘test_case2‘))    suite.addTest(Test(‘test_case1‘))#8.2.2執行測試案例#8.2.2.1執行個體化TextTestRunner類    runner=unittest.TextTestRunner()#8.2.2.2使用run()方法運行測試套件(即運行測試套件中的所有用例)    runner.run(suite)
‘‘‘ ‘‘‘#8.3執行測試案例方案三如下:#8.3.1構造測試集(簡化了方案二中先要建立測試套件然後再依次載入測試用例)#執行順序同方案一:執行順序是命名順序:先執行test_case1,再執行test_case2 test_dir = ‘./‘ discover = unittest.defaultTestLoader.discover(test_dir, pattern=‘test_*.py‘)#8.3.2執行測試案例#8.3.2.1執行個體化TextTestRunner類 runner=unittest.TextTestRunner()#8.3.2.2使用run()方法運行測試套件(即運行測試套件中的所有用例) runner.run(discover) ‘‘‘

使用方式情節一執行測試案例結果如下:

Enter a number:10
10
Test over
Enter a number:.10
Fs

Ran 3 tests in 6.092s

FAILED (failures=1, skipped=1)
10
Test over

因為先執行test_case1,再執行test_case2,所以第一次輸入10時,執行通過,返回. 第二次輸入10時,執行不通過,返回F,最終一個用例通過,一個用例失敗,還有一個用例是直接跳過的(裝飾器)。

 使用方式情節二執行測試案例結果如下:

Enter a number:10
10
Test over
Enter a number:F10
.

Ran 2 tests in 4.973s

FAILED (failures=1) 
10
Test over

因為先執行test_case2,再執行test_case1,所以第一次輸入10時,執行不通過,返回F , 第二次輸入10時,執行通過,返回. ,最終一個用例通過,一個用例失敗。

使用方式情節三執行測試案例結果如下(執行測試案例順序同方案一):

Enter a number:10
10
Test over
Enter a number:.10
Fs

Ran 3 tests in 6.092s

FAILED (failures=1, skipped=1)
10
Test over

因為先執行test_case1,再執行test_case2,所以第一次輸入10時,執行通過,返回. 第二次輸入10時,執行不通過,返回F,最終一個用例通過,一個用例失敗,還有一個用例是直接跳過的(裝飾器)。

 

三、使用unittest架構編寫測試案例執行個體

點擊返回目錄

目錄結構:

百度搜尋測試案例Test Case:

# coding=utf-8‘‘‘Created on 2016-7-22@author: JenniferProject:登入百度測試案例‘‘‘from selenium import webdriverimport unittest, timeclass BaiduTest(unittest.TestCase):    def setUp(self):        self.driver = webdriver.Firefox()        self.driver.implicitly_wait(30) #隱性等待時間為30秒        self.base_url = "https://www.baidu.com"        def test_baidu(self):        driver = self.driver        driver.get(self.base_url + "/")        driver.find_element_by_id("kw").clear()        driver.find_element_by_id("kw").send_keys("unittest")        driver.find_element_by_id("su").click()        time.sleep(3)        title=driver.title        self.assertEqual(title, u"unittest_百度搜尋")     def tearDown(self):        self.driver.quit()if __name__ == "__main__":    unittest.main()

有道翻譯測試案例Test Case:

# coding=utf-8‘‘‘Created on 2016-7-22@author: JenniferProject:使用有道翻譯測試案例‘‘‘from selenium import webdriverimport unittest, timeclass YoudaoTest(unittest.TestCase):    def setUp(self):        self.driver = webdriver.Firefox()        self.driver.implicitly_wait(30) #隱性等待時間為30秒        self.base_url = "http://www.youdao.com"        def test_youdao(self):        driver = self.driver        driver.get(self.base_url + "/")        driver.find_element_by_id("translateContent").clear()        driver.find_element_by_id("translateContent").send_keys(u"你好")        driver.find_element_by_id("translateContent").submit()        time.sleep(3)        page_source=driver.page_source        self.assertIn( "hello",page_source)     def tearDown(self):        self.driver.quit()if __name__ == "__main__":    unittest.main()

web測試案例:通過測試套件TestSuite來組裝多個測試案例。

# coding=utf-8‘‘‘Created on 2016-7-26@author: JenniferProject:編寫Web測試案例‘‘‘import unittestfrom test_case import test_baidufrom test_case import test_youdao#構造測試集suite = unittest.TestSuite()suite.addTest(test_baidu.BaiduTest(‘test_baidu‘))suite.addTest(test_youdao.YoudaoTest(‘test_youdao‘))if __name__==‘__main__‘:    #執行測試    runner = unittest.TextTestRunner()    runner.run(suite)

測試結果:

說明:.代表用例執行通過,兩個點表示兩個用例執行通過。F表示用例執行不通過。

《本篇文章轉自啄木鳥兒》感謝!!!

 

Python基礎入門-unittest單元測試架構

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.