背景
最近開(kāi)發(fā)有關(guān)業(yè)務(wù)場(chǎng)景的功能時(shí),涉及的API接口比較多,需要自己模擬多個(gè)業(yè)務(wù)場(chǎng)景的自動(dòng)化測(cè)試(暫時(shí)不涉及性能測(cè)試),并且在每次測(cè)試完后能夠生成一份測(cè)試報(bào)告。
考慮到日常使用Python自帶的UnitTest,所以先從官方文檔下手,了解到有相關(guān)的TestTextRunner:https://docs.python.org/zh-cn/3/library/unittest.html?highlight=unittest#unittest.TextTestRunner。
自帶的TextTestRunner每次能把測(cè)試結(jié)果輸出到流中的測(cè)試運(yùn)行器,可以簡(jiǎn)單根據(jù)verbosity調(diào)整每次測(cè)試結(jié)果輸出的信息,但是都太基礎(chǔ)了,如果我想在測(cè)試過(guò)程中打印一些請(qǐng)求參數(shù)或者docstring,看了一下UnitTest內(nèi)置的方法,實(shí)現(xiàn)過(guò)程可能會(huì)比較繁瑣。
然后在網(wǎng)上找了一下輪子工具、html-testrunner、beautifulreport,這些工具生成的網(wǎng)頁(yè)css、js都是使用公網(wǎng)的CDN,由于內(nèi)網(wǎng)環(huán)境,不適合。
后面看了一些技術(shù)文章很多都是使用Pytest,之前有相關(guān)Pytest的基礎(chǔ)使用經(jīng)驗(yàn),大概了解一下,決定根據(jù)Pytest+pytest-html滿足當(dāng)前測(cè)試場(chǎng)景。
模塊安裝
pip install pytest
pip install pytest-html
方案設(shè)計(jì)
pytest.ini
首先定義pytest.ini(pytest的基礎(chǔ)配置文件,和測(cè)試文件在同一目錄,使用pytest命令時(shí)會(huì)先讀取該文件):
[pytest]
log_cli = True
log_cli_level = INFO
備注:開(kāi)啟日志消息打印,設(shè)置日志記錄捕獲的最低消息級(jí)別為INFO。
conftest.py
設(shè)置conftest.py(沒(méi)有自己創(chuàng)建,同樣是和測(cè)試文件同個(gè)目錄下,用于pytest-html生成測(cè)試報(bào)告的配置文件):
# --*-- coding: utf-8 --*--
from datetime import datetime
from py.xml import html
import pytest
def pytest_html_report_title(report):
report.title = "測(cè)試報(bào)告"
def pytest_html_results_table_header(cells):
cells.insert(2, html.th("Description"))
cells.insert(1, html.th("Time", class_="sortable time", col="time"))
cells.pop()
def pytest_html_results_table_row(report, cells):
cells.insert(2, html.td(report.description))
def pytest_html_results_table_row(report, cells):
cells.insert(2, html.td(report.description))
cells.insert(1, html.td(datetime.utcnow(), class_="col-time"))
cells.pop()
@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_makereport(item, call):
outcome = yield
report = outcome.get_result()
report.description = str(item.function.__doc__)
通過(guò)設(shè)置鉤子函數(shù)分別修改測(cè)試報(bào)告的列,添加描述列、測(cè)試用例耗時(shí)時(shí)間列、刪除鏈接列,我這里是直接參考官方文檔中給出的示例:https://pytest-html.readthedocs.io/en/latest/user_guide.html#creating-a-self-contained-report,有興趣的可以研究一下。
測(cè)試用例
根據(jù)Pytest的官方文檔,Pytest同樣是支持UnitTest的功能,所以可以在原有的基礎(chǔ)上直接運(yùn)行Pytest:
# -*- coding: utf-8 -*-
# @Author: linshukai
# @Desc: pytestc測(cè)試用例
# @Date: 20220827
import unittest
import pytest
import logging
import requests
class TestString(unittest.TestCase):
def test_upper_method(self):
"""
測(cè)試字符串大寫
"""
self.assertEqual("linshukai".upper(), "LINSHUKAI")
logging.info("測(cè)試linshukai")
def test_lower_method(self):
"""
測(cè)試字符串小寫
"""
self.assertEqual( "ZhangSan".lower(), "zhangsan")
logging.info("測(cè)試ZhangSan")
def test_count_method(self):
"""
測(cè)試字符串長(zhǎng)度統(tǒng)計(jì)
"""
self.assertEqual( len("zhangsan"), 8)
logging.info("測(cè)試Zhangsan")
class TestString2(unittest.TestCase):
def test_get_html(self):
"""
測(cè)試請(qǐng)求網(wǎng)頁(yè)狀態(tài)碼是否正常
"""
response = requests.get("http://www.baidu.com")
self.assertEqual(response.status_code, 500)
if __name__ == "__main__":
pytest.main(["pytest_example.py", "--html=report.html", "--self
備注:簡(jiǎn)單寫了幾個(gè)測(cè)試用例,需要特別說(shuō)明的是可以通過(guò)pytest.main()方法,直接在Python代碼中調(diào)用Pytest,所以我每次只需要執(zhí)行這個(gè)腳本就行,當(dāng)然也可以選擇在命令行界面通過(guò)Pytest命令調(diào)用指定測(cè)試文件執(zhí)行指定測(cè)試用例。
另外一個(gè)地方需要注意的是–self-contained-html這個(gè)參數(shù)主要是針對(duì)pytest-html模塊,由于默認(rèn)pytest-html中生成測(cè)試報(bào)告的網(wǎng)頁(yè)和CSS文件都是分開(kāi)來(lái)存儲(chǔ)的,如果想直接將css文件合并到html中,這樣分享測(cè)試報(bào)告的時(shí)候也更加方便,所以只需要加入這個(gè)參數(shù)即可–self-contained-html。
預(yù)期效果
?預(yù)期會(huì)出現(xiàn)的問(wèn)題
Pytest中使用requests,拋出錯(cuò)誤,但不影響測(cè)試結(jié)果,拋出的異常:
Windows fatal exception: code 1073807366
解決方式,降低Pytest為4.6.11版本后,異常就不會(huì)拋出,但是pytest-html需要6.0版本上的Pytest,由于不影響測(cè)試結(jié)果,更加完善的解決方法后續(xù)再研究。
? ? ? ? ? 【下面是我整理的2023年最全的軟件測(cè)試工程師學(xué)習(xí)知識(shí)架構(gòu)體系圖】
一、Python編程入門到精通
二、接口自動(dòng)化項(xiàng)目實(shí)戰(zhàn)??
三、Web自動(dòng)化項(xiàng)目實(shí)戰(zhàn)
四、App自動(dòng)化項(xiàng)目實(shí)戰(zhàn)?
五、一線大廠簡(jiǎn)歷
六、測(cè)試開(kāi)發(fā)DevOps體系?
七、常用自動(dòng)化測(cè)試工具
八、JMeter性能測(cè)試?
九、總結(jié)(尾部小驚喜)
生命不息,奮斗不止。每一份努力都不會(huì)被辜負(fù),只要堅(jiān)持不懈,終究會(huì)有回報(bào)。珍惜時(shí)間,追求夢(mèng)想。不忘初心,砥礪前行。你的未來(lái),由你掌握!
生命短暫,時(shí)間寶貴,我們無(wú)法預(yù)知未來(lái)會(huì)發(fā)生什么,但我們可以掌握當(dāng)下。珍惜每一天,努力奮斗,讓自己變得更加強(qiáng)大和優(yōu)秀。堅(jiān)定信念,執(zhí)著追求,成功終將屬于你!文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-618827.html
只有不斷地挑戰(zhàn)自己,才能不斷地超越自己。堅(jiān)持追求夢(mèng)想,勇敢前行,你就會(huì)發(fā)現(xiàn)奮斗的過(guò)程是如此美好而值得。相信自己,你一定可以做到!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-618827.html
到了這里,關(guān)于使用Pytest生成HTML測(cè)試報(bào)告的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!