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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM