jenkins學習18 - 把 pytest 執行結果通過 jenkins 傳送到郵件正文裡
前言
pytest 執行用例後會在終端最後一行列印總的執行結果類似於:===== 1 failed, 5 passed in 0.52s ====
這個執行的介面是可以通過 pytest_terminal_summary 這個hook函式拿到的,拿到後如何給到jenkins發郵件的報告裡面呢?
pytest_terminal_summary
第一步先拿到pytest執行的測試結果,通過pytest_terminal_summary 這個hook函式
在專案根目錄conftest.py檔案下寫如下程式碼
import time from _pytest import terminal # 作者-上海悠悠 QQ交流群:717225969 # blog地址 https://www.cnblogs.com/yoyoketang/ def pytest_terminal_summary(terminalreporter, exitstatus, config): '''收集測試結果''' # print(terminalreporter.stats) print("total:", terminalreporter._numcollected) print('passed:', len([i for i in terminalreporter.stats.get('passed', []) if i.when != 'teardown'])) print('failed:', len([i for i in terminalreporter.stats.get('failed', []) if i.when != 'teardown'])) print('error:', len([i for i in terminalreporter.stats.get('error', []) if i.when != 'teardown'])) print('skipped:', len([i for i in terminalreporter.stats.get('skipped', []) if i.when != 'teardown'])) print('成功率:%.2f' % (len(terminalreporter.stats.get('passed', []))/terminalreporter._numcollected*100)+'%') # terminalreporter._sessionstarttime 會話開始時間 duration = time.time() - terminalreporter._sessionstarttime print('total times: %.2f' % duration, 'seconds')
執行後的結果
------------------------------------------------ Captured stdout call ------------------------------------------------- 22222222 total: 6 passed: 5 failed: 1 error: 0 skipped: 0 成功率:83.33% total times: 0.26 seconds =============================================== short test summary info =============================================== FAILED test_b.py::test_b - assert 1 == 2 ============================================= 1 failed, 5 passed in 0.27s =============================================
到這一步實際上已經拿到結果了,很多小夥伴有疑問如何取出來?那麼接下來我們只需要寫個open函式把結果儲存到專案根目錄本地即可
result.txt儲存本地
import time from _pytest import terminal # 作者-上海悠悠 QQ交流群:717225969 # blog地址 https://www.cnblogs.com/yoyoketang/ def pytest_terminal_summary(terminalreporter, exitstatus, config): '''收集測試結果''' # print(terminalreporter.stats) total = terminalreporter._numcollected passed= len([i for i in terminalreporter.stats.get('passed', []) if i.when != 'teardown']) failed=len([i for i in terminalreporter.stats.get('failed', []) if i.when != 'teardown']) error=len([i for i in terminalreporter.stats.get('error', []) if i.when != 'teardown']) skipped=len([i for i in terminalreporter.stats.get('skipped', []) if i.when != 'teardown']) successful = len(terminalreporter.stats.get('passed', []))/terminalreporter._numcollected*100 # terminalreporter._sessionstarttime 會話開始時間 duration = time.time() - terminalreporter._sessionstarttime print('total times: %.2f' % duration, 'seconds') with open("result.txt", "w") as fp: fp.write("TOTAL=%s" % total+"\n") fp.write("PASSED=%s" % passed+"\n") fp.write("FAILED=%s" % failed+"\n") fp.write("ERROR=%s" % error+"\n") fp.write("SKIPPED=%s" % skipped+"\n") fp.write("SUCCESSFUL=%.2f%%" % successful+"\n") fp.write("TOTAL_TIMES=%.2fs" % duration)
儲存後txt內容
jenkins 執行shell
執行shell,輸入執行pytest用例的命令
用於執行用例失敗後,退出碼為1,導致後面的步驟不會執行,於是設定為構建不穩定時的退出碼:1
新增環境變數(Environment Injector)
新增構建操作 Environment Injector variables
Properties File Path 引用本地檔案
到這一步前面執行完pytest生成的result.txt會把相關鍵值對新增到環境變數
郵件引用變數
系統管理-系統配置,配置郵件Default Content
<tr>
測試結果:<br/>
<td>
<p>用例總數:${TOTAL} 成功:${PASSED} 失敗:${FAILED} 異常:${ERROR} 跳過:${SKIPPED}</p>
<p>執行成功率:${SUCCESSFUL} 執行時長:${TOTAL_TIMES}</p>
</td>
</tr>
構建job後收到的郵件
參考資料:
pytest Hooks函式pytest_terminal_summary https://www.cnblogs.com/yoyoketang/p/12741564.html
jenkins 新增環境變數 Environment Injector https://www.cnblogs.com/yoyoketang/p/14955965.html
jenkins 配置郵件傳送 Email Extension Plugin https://www.cnblogs.com/yoyoketang/p/12174056.html