大家好,我是剛哥。
從這篇文章開始,將對HttpRunner3的源碼進行剖析。
爲什麼是HttpRunner3?其實pytest是一個更強大的測試框架,無奈它的源碼實在是太複雜了,連學習pytest的使用都要花上很多時間,哪還有那麼多精力去看它的源碼。而其他很多所謂的測試框架實在是太粗糙了,學不到東西不說,還可能學錯。HttpRunner正好介於兩者之間,既不復雜,也不簡單,剛剛好。
對源碼進行怎樣的剖析?HttpRunner的源碼包括這幾個目錄:docs(文檔)、examples(示例)、httprunner(源文件)、tests(測試文件),我只會選擇httprunner(源文件)來進行剖析,它的源碼全在這個目錄下。看源碼是特別費腦的,但是就算費腦也可能還是看的雲裏霧裏,這時候方法就顯得格外重要了。我覺得需要帶着問題去看,比如__init__
文件幹了些啥?項目初始化結構是怎麼來的?請求是怎麼發出去的?用例是怎麼運行的?報告是怎麼生成的?等等等。
本文先從httprunner/__init__.py
這個初始化文件開始,由淺入深,由易入難。它的內容很簡單:
__version__ = "3.1.6"
__description__ = "One-stop solution for HTTP(S) testing."
# import firstly for monkey patch if needed
from httprunner.ext.locust import main_locusts
from httprunner.parser import parse_parameters as Parameters
from httprunner.runner import HttpRunner
from httprunner.testcase import Config, Step, RunRequest, RunTestCase
__all__ = [
"__version__",
"__description__",
"HttpRunner",
"Config",
"Step",
"RunRequest",
"RunTestCase",
"Parameters",
]
__version__
是版本號,會在很多地方用到:
__description__
是描述,也會在很多地方用到:
這一行代碼:
# import firstly for monkey patch if needed
from httprunner.ext.locust import main_locusts
main_locusts是在httprunner/ext/locust/__init__.py
文件中定義的。註釋是說,先把這個模塊導入進來,如果需要的話,可以在這裏添加猴子補丁。有點費解,只有這一處代碼:
先看下__all__
的作用,再來猜測。
__all__
是爲了方便其他地方直接通過from httprunner import
來導入包,比如裏面的HttpRunner是from httprunner.runner import HttpRunner
這樣導入的,加入到__all__
以後,就能直接from httprunner import HttpRunner
來導入了:
省去了from httprunner.runner
這種代碼。
那麼那個猴子補丁,我對它用法的猜測是這樣的:
# import firstly for monkey patch if needed
from httprunner.ext.locust import main_locusts
def main_locusts_monkey_patch():
# ...
main_locusts = main_locusts_monkey_patch
__all__ = [
"main_locusts"
]
有任何不同想法,歡迎加羣討論喲。
參考資料: