PyUnit提供的動態方法,只編寫一個測試類來完成對整個軟件模塊的測試,這樣對象的初始化工作可以在setUp()方法中完成,而資源的釋放則可以在tearDown()方法中完成。
使用PyUnit可以像xunit那樣設置一個個函數,分別測試不同的數據和不同的用例。
例如,構建下面的測試類,測試遠程API服務
1 class Request: 2 def __init__(self): 3 pass 4 def request(self,RequestMethod,RequestURL,param,requestHeaders): 5 return Request.__dict__[RequestMethod](self,RequestURL,param,requestHeaders) 6 def get(self,RequestURL,param,requestHeaders): 7 RequestURL=RequestURL+"?"+urllib.parse.urlencode(param) 8 req = url.Request(RequestURL) 9 result = url.urlopen(req).read()10 return result11 def post(self,RequestURL,param,requestHeaders):12 postdata= json.dumps(param)13 req = url.Request(14 url = RequestURL,15 data = postdata.encode("utf-8"),16 headers = requestHeaders17 ) 18 result = url.urlopen(req).read()19 return result
想要知道其中執行結果,構造下面的測試類
1 class APITest(unittest.TestCase): 2 def setUp(self): 3 self.r=Request() 4 def test_UserPermisionQueryPost(self): 5 RequestURL="http://10.125.198.137/permission/table/listUserTablePermissions.json" 6 RequestMethod="post" 7 requestHeaders={"Accept":"*/*",} 8 param={ 9 "tablePermissionParam": {10 "currentPage": 1,11 "pageSize": 50,12 "tablename": "s_auction_auctions",13 "usernames": [14 "067765"15 ]16 }17 }18 expectResult=b'{"returnCode":"0","returnValue":[{"id":2067,"username":"067765","tablename":"s_auction_auctions","packagename":"yunti1.taobao","readlevelpermission":2,"permissiontime":19 "2014-03-18 06:02:10","distabletime":"2015-03-18 06:02:08","permissionstatus":1,"gmtCreate":"2014-03-18 06:02:10","gmtModify":"2014-03-18 06:02:10","columns":["id","title"]}]}'20 self.assertEqual(self.r.request(RequestMethod,RequestURL,param,requestHeaders),expectResult)21 def test_UserPermisionQueryGet(self):22 RequestMethod="get"23 RequestURL="http://10.125.198.137/permission/table/listUserTablePermissions"24 param={"tablename":"s_auction_auctions"}25 expectResult=b'{"returnCode":"0","returnValue":[{"id":2067,"username":"067765","tablename":"s_auction_auctions","packagename":"yunti1.taobao","readlevelpermission":2,"permissiontime":26 "2014-03-18 06:02:10","distabletime":"2015-03-18 06:02:08","permissionstatus":1,"gmtCreate":"2014-03-18 06:02:10","gmtModify":"2014-03-18 06:02:10","columns":["id","title"]},{"id":2066, 27 "username":"068521","tablename":"s_auction_auctions","packagename":"yunti1.taobao","readlevelpermission":2,"permissiontime":"2014-03-18 06:02:10","distabletime":"2015-03-18 06:02:08", 28 "permissionstatus":1,"gmtCreate":"2014-03-18 06:02:10","gmtModify":"2014-03-18 06:02:10","columns":["id","title"]}],"count":2}'29 self.assertEqual(self.r.request(RequestMethod,RequestURL,param,""),expectResult)
PyUnit模塊中定義了一個名為main的全局方法,使用它可以很方便地將一個單元測試模塊變成可以直接運行的測試腳本,main()方法使用TestLoader類來搜索所有包含在該模塊中的測試方法,并自動執行它們。如果Python程序員能夠按照約定(以test開頭)來命名所有的測試方法,那就只需要在測試模塊的最后加入如下幾行代碼即可:
if __name__=='__main__': unittest.main()
或者通過自己添加的方式決定哪些用例需要真正的被執行
def suite(): suite = unittest.TestSuite() suite.addTest(APITest("test_UserPermisionQueryGet")) suite.addTest(APITest("test_UserPermisionQueryPost")) runner = unittest.TextTestRunner() runner.run(suite)
當選擇main函數作為入口的時候,還可以獲取到幫助信息
python3 ./Request.py -hUsage: Request.py [options]Options: -h, --help show this help message and exit -v, --verbose Verbose output -q, --quiet Quiet output -f, --failfast Stop on first fail or error -c, --catch Catch ctrl-C and display results so far -b, --buffer Buffer stdout and stderr during tests
直接在命令行中指定testSuite.testcase
python3 ./Request.py APITest.test_UserPermisionQueryGet.----------------------------------------------------------------------Ran 1 test in 0.179sOK
新聞熱點
疑難解答