軟體測試之python之追溯函數調用及錯誤日誌詳細列印

軟體測試之python之追溯函數調用及錯誤日誌詳細列印

一、函數調用追溯

1.1 原因

在列印日誌時,為實現日誌分層列印,將列印日誌的語句封裝到了print_log_info以及print_log_error中。但是如果在上述函數中直接通過logger.*列印日誌,日誌中的模塊名、行號就會一直列印print_log_info和print_log_error函數中的logger.*中的位置。所以有了追溯函數調用的想法,在列印正常日誌時,列印對應模塊名以及列印日誌語句的行號。

1.2 使用實例

2.2.1 追溯函數調用推導

在一個模塊中調用print_log_info函數,在print_log_info函數中調用了trace_caller函數,trace_caller函數定義如下:

import inspectdef trace_caller(laynum): cur_func_name = inspect.currentframe() cur_func_name = inspect.getouterframes(cur_func_name, 2) print(cur_func_name)

列印結果如下:

[(<frame object at 0x04DC2B70>, C:\Users\Think\PycharmProjects\InterfaceFrame\src\utils\utils.py, 19, trace_caller, [ cur_func_name = inspect.currentframe()
, cur_func_name = inspect.getouterframes(cur_func_name, 2)
], 1), (<frame object at 0x04DD5380>, C:\Users\Think\PycharmProjects\InterfaceFrame\src\utils\utils.py, 62, print_log_info, [ print(msg) # 在HTMLTestRunner列印測試報告,用例執行成功,不可能觸發斷言,所以需要列印msg
, caller_module, msg_lineno = trace_caller(2)
], 1), (<frame object at 0x04B0C6B0>, C:/Users/Think/PycharmProjects/InterfaceFrame/src/InterfaceTest.py, 18, <module>, [
, utils.print_log_info("最後調用tracecall函數")
], 1)]

可以看到列印結果是一個列表,列表中的元素是三個元組,我們重點從每個元素的第2個元素開始關注,發現分別是調用print(cur_func_name)以及上一級調用語句的模塊所在路徑、代碼行數、函數名、以及列印語句。所以我們根據需要取cur_func_name 對應元素的值就可以達到我們想要的效果了。

1.2.2 代碼示例

def trace_caller(laynum): 根據傳遞的laynum追溯函數調用者所在的模塊、行數。目前只能在列印日誌函數中使用 :param laynum:追溯層數,由於在列印日誌函數中調用本函數,追溯層數為2, :return:模塊名, 列印日誌所在行號 cur_func_name = inspect.currentframe() cur_func_name = inspect.getouterframes(cur_func_name, 2) caller_module = cur_func_name[laynum][1][len(settings.PROJECT_DIR)+1:] msg_lineno = cur_func_name[laynum][2] return caller_module, msg_lineno

二、錯誤詳細的日誌信息列印

通過上述方式,可以追溯到函數的調用過程,但最多只能追溯到列印日誌的logger.info()等語句。如果想要列印出錯行的代碼,就需要再採用其他方式了。也就是traceback模塊

2.1 traceback模塊介紹

使用traceback模塊,可以實現對出錯日誌的詳細輸出,但是需要結合try except語句來使用,單獨使用會報錯。使用案例如下:

class TestExample(unittest.TestCase): def test_add(self): result = Test(2, 2).add() try: self.assertEqual(result, 3, "加法錯誤,請重新輸入") utils.print_log_info("測試成功") except AssertionError as err: err_str = traceback.format_exc() utils.print_log_error(err_str) raise err

列印日誌

2018-04-25 Wednesday 21:48:47 - ERROR -MainThread:42464 - src estcase estExample.py : 16 Traceback (most recent call last): File "C:UsersThinkPycharmProjectsInterfaceFramesrc estcase estExample.py", line 12, in test_add self.assertEqual(result, 3, "加法錯誤,請重新輸入") File "C:Python33libunittestcase.py", line 641, in assertEqual assertion_func(first, second, msg=msg) File "C:Python33libunittestcase.py", line 634, in _baseAssertEqual raise self.failureException(msg)AssertionError: 4 != 3 : 加法錯誤,請重新輸入

推薦閱讀:

測試是否需要更多的場景化思維?
15個常見正則表達式
測試需要考慮軟體設計的七宗罪
Selenium 2.0與Selenum 3.0介紹
Python Selenium設計模式-POM

TAG:Python | 軟體測試 | 軟體測試培訓 |