unittest单元测试简单介绍
unittest單元測(cè)試框架不僅可以適用于單元測(cè)試,還可以適用WEB自動(dòng)化測(cè)試用例的開發(fā)與執(zhí)行,該測(cè)試框架可組織執(zhí)行測(cè)試用例,并且提供了豐富的斷言方法,判斷測(cè)試用例是否通過,最終生成測(cè)試結(jié)果。今天筆者就總結(jié)下如何使用unittest單元測(cè)試框架來進(jìn)行WEB自動(dòng)化測(cè)試。
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類,所有測(cè)試用例類繼承的基本類。
class DemoTest(unittest.TestCase):?
unittest.main():使用她可以方便的將一個(gè)單元測(cè)試模塊變?yōu)榭芍苯舆\(yùn)行的測(cè)試腳本,main()方法使用TestLoader類來搜索所有包含在該模塊中以“test”命名開頭的測(cè)試方法,并自動(dòng)執(zhí)行他們。執(zhí)行方法的默認(rèn)順序是:根據(jù)ASCII碼的順序加載測(cè)試用例,數(shù)字與字母的順序?yàn)?#xff1a;0-9,A-Z,a-z。所以以A開頭的測(cè)試用例方法會(huì)優(yōu)先執(zhí)行,以a開頭會(huì)后執(zhí)行。
unittest.TestSuite():unittest框架的TestSuite()類是用來創(chuàng)建測(cè)試套件的。
unittest.TextTextRunner():unittest框架的TextTextRunner()類,通過該類下面的run()方法來運(yùn)行suite所組裝的測(cè)試用例,入?yún)閟uite測(cè)試套件。
unittest.defaultTestLoader():?defaultTestLoader()類,通過該類下面的discover()方法可自動(dòng)更具測(cè)試目錄start_dir匹配查找測(cè)試用例文件(test*.py),并將查找到的測(cè)試用例組裝到測(cè)試套件,因此可以直接通過run()方法執(zhí)行discover。用法如下:
discover=unittest.defaultTestLoader.discover(test_dir, pattern='test_*.py')?
unittest.skip():裝飾器,當(dāng)運(yùn)行用例時(shí),有些用例可能不想執(zhí)行等,可用裝飾器暫時(shí)屏蔽該條測(cè)試用例。一種常見的用法就是比如說想調(diào)試某一個(gè)測(cè)試用例,想先屏蔽其他用例就可以用裝飾器屏蔽。
@unittest.skip(reason):?skip(reason)裝飾器:無條件跳過裝飾的測(cè)試,并說明跳過測(cè)試的原因。
@unittest.skipIf(reason):?skipIf(condition,reason)裝飾器:條件為真時(shí),跳過裝飾的測(cè)試,并說明跳過測(cè)試的原因。
@unittest.skipUnless(reason):?skipUnless(condition,reason)裝飾器:條件為假時(shí),跳過裝飾的測(cè)試,并說明跳過測(cè)試的原因。
@unittest.expectedFailure(): expectedFailure()測(cè)試標(biāo)記為失敗。
?
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()方法用于測(cè)試用例執(zhí)行前的初始化工作。如測(cè)試用例中需要訪問數(shù)據(jù)庫,可以在setUp中建立數(shù)據(jù)庫連接并進(jìn)行初始化。如測(cè)試用例需要登錄web,可以先實(shí)例化瀏覽器。
tearDown():tearDown()方法用于測(cè)試用例執(zhí)行之后的善后工作。如關(guān)閉數(shù)據(jù)庫連接。關(guān)閉瀏覽器。
assert*():一些斷言方法:在執(zhí)行測(cè)試用例的過程中,最終用例是否執(zhí)行通過,是通過判斷測(cè)試得到的實(shí)際結(jié)果和預(yù)期結(jié)果是否相等決定的。
assertEqual(a,b,[msg='測(cè)試失敗時(shí)打印的信息']):斷言a和b是否相等,相等則測(cè)試用例通過。
assertNotEqual(a,b,[msg='測(cè)試失敗時(shí)打印的信息']):斷言a和b是否相等,不相等則測(cè)試用例通過。
assertTrue(x,[msg='測(cè)試失敗時(shí)打印的信息']):斷言x是否True,是True則測(cè)試用例通過。
assertFalse(x,[msg='測(cè)試失敗時(shí)打印的信息']):斷言x是否False,是False則測(cè)試用例通過。
assertIs(a,b,[msg='測(cè)試失敗時(shí)打印的信息']):斷言a是否是b,是則測(cè)試用例通過。
assertNotIs(a,b,[msg='測(cè)試失敗時(shí)打印的信息']):斷言a是否是b,不是則測(cè)試用例通過。
assertIsNone(x,[msg='測(cè)試失敗時(shí)打印的信息']):斷言x是否None,是None則測(cè)試用例通過。
assertIsNotNone(x,[msg='測(cè)試失敗時(shí)打印的信息']):斷言x是否None,不是None則測(cè)試用例通過。
assertIn(a,b,[msg='測(cè)試失敗時(shí)打印的信息']):斷言a是否在b中,在b中則測(cè)試用例通過。
assertNotIn(a,b,[msg='測(cè)試失敗時(shí)打印的信息']):斷言a是否在b中,不在b中則測(cè)試用例通過。
assertIsInstance(a,b,[msg='測(cè)試失敗時(shí)打印的信息']):斷言a是是b的一個(gè)實(shí)例,是則測(cè)試用例通過。
assertNotIsInstance(a,b,[msg='測(cè)試失敗時(shí)打印的信息']):斷言a是是b的一個(gè)實(shí)例,不是則測(cè)試用例通過。
?
3.TestSuite類的屬性如下:(組織用例時(shí)需要用到)
['__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()方法是將測(cè)試用例添加到測(cè)試套件中,如下方,是將test_baidu模塊下的BaiduTest類下的test_baidu測(cè)試用例添加到測(cè)試套件。
suite = unittest.TestSuite() suite.addTest(test_demo.DemoTest('test_baidu'))4.TextTextRunner的屬性如下:(組織用例時(shí)需要用到)
['__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()方法是運(yùn)行測(cè)試套件的測(cè)試用例,入?yún)閟uite測(cè)試套件。
runner = unittest.TextTestRunner() runner.run(suite)?
使用unittest框架編寫測(cè)試用例思路
# coding=utf-8 #1.先設(shè)置編碼,utf-8可支持中英文,如上,一般放在第一行#2.注釋:包括記錄創(chuàng)建時(shí)間,創(chuàng)建人,項(xiàng)目名稱。 ''' Project:使用unittest框架編寫測(cè)試用例思路 ''' #3.導(dǎo)入unittest模塊 import unittest#4.定義測(cè)試類,父類為unittest.TestCase。 #可繼承unittest.TestCase的方法,如setUp和tearDown方法,不過此方法可以在子類重寫,覆蓋父類方法。 #可繼承unittest.TestCase的各種斷言方法。 class Test(unittest.TestCase): #5.定義setUp()方法用于測(cè)試用例執(zhí)行前的初始化工作。 #注意,所有類中方法的入?yún)閟elf,定義方法的變量也要“self.變量” #注意,輸入的值為字符型的需要轉(zhuǎn)為int型def setUp(self):self.number=raw_input('Enter a number:')self.number=int(self.number)#6.定義測(cè)試用例,以“test_”開頭命名的方法 #注意,方法的入?yún)閟elf #可使用unittest.TestCase類下面的各種斷言方法用于對(duì)測(cè)試結(jié)果的判斷 #可定義多個(gè)測(cè)試用例 #最重要的就是該部分def test_case1(self):print self.numberself.assertEqual(self.number,10,msg='Your input is not 10')def test_case2(self):print self.numberself.assertEqual(self.number,20,msg='Your input is not 20')@unittest.skip('暫時(shí)跳過用例3的測(cè)試')def test_case3(self):print self.numberself.assertEqual(self.number,30,msg='Your input is not 30')#7.定義tearDown()方法用于測(cè)試用例執(zhí)行之后的善后工作。 #注意,方法的入?yún)閟elfdef tearDown(self):print 'Test over'#8如果直接運(yùn)行該文件(__name__值為__main__),則執(zhí)行以下語句,常用于測(cè)試腳本是否能夠正常運(yùn)行 if __name__=='__main__': #8.1執(zhí)行測(cè)試用例方案一如下: #unittest.main()方法會(huì)搜索該模塊下所有以test開頭的測(cè)試用例方法,并自動(dòng)執(zhí)行它們。 #執(zhí)行順序是命名順序:先執(zhí)行test_case1,再執(zhí)行test_case2 unittest.main()''' #8.2執(zhí)行測(cè)試用例方案二如下: #8.2.1先構(gòu)造測(cè)試集 #8.2.1.1實(shí)例化測(cè)試套件suite=unittest.TestSuite() #8.2.1.2將測(cè)試用例加載到測(cè)試套件中。 #執(zhí)行順序是安裝加載順序:先執(zhí)行test_case2,再執(zhí)行test_case1suite.addTest(Test('test_case2'))suite.addTest(Test('test_case1')) #8.2.2執(zhí)行測(cè)試用例 #8.2.2.1實(shí)例化TextTestRunner類runner=unittest.TextTestRunner() #8.2.2.2使用run()方法運(yùn)行測(cè)試套件(即運(yùn)行測(cè)試套件中的所有用例)runner.run(suite) '''''' #8.3執(zhí)行測(cè)試用例方案三如下: #8.3.1構(gòu)造測(cè)試集(簡(jiǎn)化了方案二中先要?jiǎng)?chuàng)建測(cè)試套件然后再依次加載測(cè)試用例) #執(zhí)行順序同方案一:執(zhí)行順序是命名順序:先執(zhí)行test_case1,再執(zhí)行test_case2test_dir = './'discover = unittest.defaultTestLoader.discover(test_dir, pattern='test_*.py') #8.3.2執(zhí)行測(cè)試用例 #8.3.2.1實(shí)例化TextTestRunner類runner=unittest.TextTestRunner() #8.3.2.2使用run()方法運(yùn)行測(cè)試套件(即運(yùn)行測(cè)試套件中的所有用例)runner.run(discover) '''?
轉(zhuǎn)載于:https://www.cnblogs.com/BlueSkyyj/p/8392171.html
總結(jié)
以上是生活随笔為你收集整理的unittest单元测试简单介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用Express、MySQL搭建项目(接
- 下一篇: CentOS 7下搭建配置 SVN 服务