python接口自動化(二十一)--unittest簡介(詳解)


簡介

  前邊的隨筆主要介紹的requests模塊的有關知識個內容,接下來看一下python的單元測試框架unittest。熟悉 或者了解java 的小伙伴應該都清楚常見的單元測試框架 Junit 和 TestNG,這個招聘的需求上也是經常見到的。python 里面也有單元

測試框架-unittest,相當於是一個 python 版的 junit。python 里面的單元測試框架除了 unittest,還有一個 pytest 框架,這個實際上用的比較少,后面有空再繼續介紹和分享。unittest單元測試框架不僅可以適用於單元測試,還可以適用WEB自動化測

試用例的開發與執行,該測試框架可組織執行測試用例,並且提供了豐富的斷言方法,判斷測試用例是否通過,最終生成測試結果。

學習和了解unittest

1、查看其中文官網:https://docs.python.org/zh-cn/3/library/unittest.html 英文官網:https://docs.python.org/3/library/unittest.html

2、先導入 unittest用 help 函數查看源碼解析查看描述:

Python unit testing framework, based on Erich Gamma's JUnit and Kent Beck's Smalltalk testing framework.

翻譯:python 的單元測試框架,是基於 java 的 junit 測試框架

簡單的用法

1、從官網源碼或者print的help里查找unittest用法

2、我們將上圖的這段代碼 copy 出來,單獨運行,看看測試和運行結果,抱着懷疑的心態自己體驗一下,因為所有人都不可能是不犯錯的,官網和源碼也不例外。

代碼分析和說明:

1、第一行是導入 unittest 這個模塊

2、class 這一行是定義一個測試的類,並繼承 unittest.TestCase 這個類

定義測試類,父類為unittest.TestCase。 #可繼承unittest.TestCase的方法,如setUp和tearDown方法,不過此方法可以在子類重寫,覆蓋父類方法。 #可繼承unittest.TestCase的各種斷言方法。

3、接下來是定義了兩個測試 case 名稱:testAdd 和 testMultiply4、注釋里面有句話很重要:## test method names begin 'test*'--翻譯:測試用例的名稱要以 test 開頭

4、然后是斷言 assert,這里的斷言方法是 assertEqual-判斷兩個是否相等,這個斷言可以是一個也可以是多個

5、if 下面的這個 unittest.main()是運行主函數,運行后會看到測試結果(跑了兩個用例耗時 0.000 秒,兩個用例都通過)

模仿和實踐

1、既然都了解的差不多了,還等什么呢,開始模仿和敲起了來吧。

2、上面的兩個案例是加法和乘法,我們可以寫個 case 試下減法和除法。

3、有很多小伙伴不知道斷言怎么寫,斷言其實就是拿實際結果和期望結果去對比,對比的方法很多,這里只是舉的最簡單的一個判斷相等的方法

參考代碼

 1 # coding=utf-8
 2 #1.先設置編碼,utf-8可支持中英文,如上,一般放在第一行
 3 
 4 #2.注釋:包括記錄創建時間,創建人,項目名稱。
 5 '''
 6 Created on 2019-4-23
 7 @author: 北京-宏哥
 8 Project:學習和使用unittest框架編寫測試用例思路
 9 '''
10 #3.導入unittest模塊
11 import unittest
12 
13 #4.copy 和運行測試
14 class IntegerArithmeticTestCase(unittest.TestCase):
15     def testSubtract(self):  # test method names begin with 'test'
16         result = 6-5   #實際結果
17         hope = 1       #期望結果
18         self.assertEqual(result, hope)
19 
20     def testDivide(self):
21         result = 7 / 2  # 實際結果
22         hope = 3.5  # 期望結果
23         self.assertEqual(result, hope)
24 
25 if __name__ == '__main__':
26     unittest.main()

前置條件和后置條件

1、setUp:在寫測試用例的時候,每次操作其實都是基於打開瀏覽器輸入對應網址這些操作,這個就是執行用例的前置條件。

2、tearDown:執行完用例后,為了不影響下一次用例的執行,一般有個數據還原的過程,這就是執行用例的后置條件。

3、很多小伙伴執行完用例,都不去做數據還原,以致於下一個用例執行失敗,這就是典型的自己給自己挖坑埋自己,自己坑自己,習慣不好。

4、前置和后置都是非必要的條件,如果沒有也可以寫 pass

參考代碼

 1 # coding=utf-8
 2 #1.先設置編碼,utf-8可支持中英文,如上,一般放在第一行
 3 
 4 #2.注釋:包括記錄創建時間,創建人,項目名稱。
 5 '''
 6 Created on 2019-4-23
 7 @author: 北京-宏哥
 8 Project:學習和使用unittest框架編寫測試用例思路
 9 '''
10 #3.導入unittest模塊
11 import unittest
12 
13 #4.前置、后置 和運行測試
14 class Test(unittest.TestCase):
15 
16     def setUp(self):
17         pass                  #如果沒有可以不寫或者pass代替
18 
19     def tearDown(self):
20         pass
21 
22     def testSubtract(self):  # test method names begin with 'test'
23         result = 6-5   #實際結果
24         hope = 1       #期望結果
25         self.assertEqual(result, hope)
26 
27     def testDivide(self):
28         result = 7 / 2  # 實際結果
29         hope = 3.5  # 期望結果
30         self.assertEqual(result, hope)
31 
32 if __name__ == '__main__':
33     unittest.main()

小結

一、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)


免責聲明!

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



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