1. 程式人生 > >pytest封神之路第一步 tep介紹

pytest封神之路第一步 tep介紹

『 tep is a testing tool to help you write pytest more easily. Try Easy Pytest! 』 # tep前身 tep的前身是介面自動化測試框架pyface,一款面向物件設計的測試框架,我寫過一篇[部落格](https://www.cnblogs.com/df888/p/12592716.html)介紹。 # 測試框架 / 測試工具 tep的定位是 `a testing tool`,不是 `a testing framework`。 框架/工具,是有區別的。最大的區別,就是我自認為是沒有足夠的能力去自主開發一套“框架”!工具的能力,還是妥妥的! 自研的框架意味著不穩定,要花很多精力來踩坑填坑,別人不敢隨便用的。工具只是站在巨人的肩膀上,出了問題,這個鍋我不背! tep是 `try easy pytest` 的首字母縮寫,tep的目的是幫助你更簡單地寫pytest,比如用pytest+requests寫介面自動化。 pytest是python的測試框架,很成熟。tep是pytest的測試工具,很簡單。 pytest和tep都是開源專案。 # 設計理念 很大程度上借鑑了HttpRunner(優秀的框架)。不同的是,tep更著重寫python,而不是寫YAML檔案。 - 簡單是更好的 - 每個人都能用python寫自動化 這就是tep的設計理念。 # 專案結構 ``` tests __init__.py .gitignore conftest.py ``` tep提供了快速建立專案的能力,也就是腳手架。執行 `tep startproject project_name`,就可以建立專案結構,如,這裡建立一個demo, ``` $ tep startproject demo 2020-07-28 14:34:57.649 | INFO | tep.scaffold:create_scaffold:40 - Create new project: demo Project root dir: \PycharmProjects\demo Created folder: demo Created folder: demo\tests Created file: demo\tests\__init__.py Created file: demo\conftest.py Created file: demo\.gitignore ``` tests是一個package,用於存放測試指令碼,指令碼檔案以test\_開頭或\_test結尾,pytest才能識別到。個人喜歡以\_test結尾。 conftest.py是一個全域性檔案,定義全域性變數,也可以定義fixture、hook、plugin等, ```python import os import pytest @pytest.fixture(scope="session", autouse=True) def project_cache(request): request.config.cache.set("project_dir", os.path.dirname(os.path.abspath(__file__))) class Dev: test_url = 'https://dev.com' class Qa: test_url = 'https://qa.com' class Release: test_url = 'https://release.com' # choose environment env = Qa # you can define your variables and functions and so on ``` 1 定義了一個fixture,把專案路徑儲存到pytest快取中。 2 定義了環境的class,多環境切換,不需要修改測試指令碼。 3 自定義內容,比如使用者登入token等。 # 專注於寫指令碼 專案結構很清晰。在`conftest.py`進行一些初始化/引數化/清理工作,在`tests/`寫測試指令碼。 不像pyface那樣面向物件的封裝,tep更注重平鋪寫指令碼的方式,這樣就離“每個人都能用python寫自動化”更近一步。畢竟封裝之後看著容易暈,我也暈。 去除掉框架的約束,給每個人寫python的自由,在測試腳本里你可以盡情發揮你的程式碼風格,程式碼能力,千人千面。代價呢,就是程式碼質量參差不齊。 這又怎麼樣呢,用過各種開源/自主研發的測試平臺,還不是每個人都在寫著自己風格的自動化case! 大膽寫,能寫,寫出來,跑通,就已經是在寫自動化,就已經是在創造價值了! tep預設是不會建立 `reports` 資料夾的, 原因有二。 其一,如果你是本地執行的話,可以使用 `--tep-reports` 自定義命令列引數,來生成測試報告。 ``` $ pytest --tep-reports ``` 測試結束後會在 `project_dir/reports` 生成 `report-2020-07-28`的allure測試報告。 其二,如果你是持續整合的話,如Jenkins,已經提供了allure report的外掛,配置一下就可以自動生成測試報告,百度[“jenkins allure”](https://www.baidu.com/s?ie=UTF-8&wd=jenkins%20allure)。 附上allure常用命令, ``` pytest --alluredir=result # 報告目錄,會生成一堆資料檔案 allure generate result -o html # 生成html報告 allure serve html # 啟動服務 allure open html # 開啟報告(直接執行自動啟動服務) PyCharm可以右鍵index.html選擇Open in Browser ``` allure[下載地址](https://github.com/allure-framework/allure2/releases/),下載解壓後,把bin絕對路徑新增到系統環境變數Path中。allure需要安裝jdk。 # 輕封裝 tep尊重原生用法。 requests的封裝只通過裝飾器做了2個封裝,一是記錄介面請求響應耗時,二是列印日誌。只需要 `from tep.client import request` ,就可以和 `requests.request` 一樣使用了,沒有做任何其他的冗餘修改。 ```python #!/usr/bin/python # encoding=utf-8 """ @Author : Don @Date : 7/25/2020 2:02 PM @Desc : """ import decimal import json import time import requests import urllib3 from loguru import logger from requests import sessions from tep.funcs import NpEncoder urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) def request_encapsulate(req): def send(*args, **kwargs): # elapsed start = time.process_time() response = req(*args, **kwargs) end = time.process_time() elapsed = str(decimal.Decimal("%.3f" % float(end - start))) + "s" # log try: log4a = {"method": args[0]} for k, v in kwargs.items(): # if not json, str() try: json.dumps(v) except TypeError: v = str(v) log4a.setdefault(k, v) log4a.setdefault("status", response.status_code) log4a.setdefault("response", response.text) log4a.setdefault("elapsed", elapsed) logger.info(json.dumps(log4a, ensure_ascii=False, cls=NpEncoder)) except AttributeError: logger.error("request failed") except TypeError: logger.warning(log4a) return response return send @request_encapsulate def request(method, url, **kwargs): """此處省略1萬行程式碼,沒做任何修改,從原始碼copy過來,只加了個裝飾器""" ``` 1 使用 `time.process_time()` ,記錄了耗時。 2 列印日誌,把請求響應的method、url、headers、引數、響應狀態碼、響應體、耗時等資料儲存到json中,輸出控制檯。 日誌選擇用loguru取代logging,`from loguru import logger` 直接用,不用再管handler了。 - faker,造資料工具 - jmespath,json解析工具 - deepdiff,json比較工具 - pandas、numpy,資料處理工具 安裝tep,自動就把這些開源利器安裝上了,無需單獨安裝。未來會整合更多實用工具到tep中。 tep本身是很輕的。 # tep可持續發展 我是2014年參加工作的,2018年才開始接觸介面測試(汗!),現在有2年多的介面測試經驗,其中包括一整年的純後端介面測試經驗。 介面自動化第一次寫了介面自動化框架AIM(基於unittest),後來又有pyface,以及中間改造過的各種臨時版本。也用過一些開源框架如RobotFramwork、HttpRunner,使用過自研工具,如基於JMeter封裝的平臺。還有一些網上開源的“web介面自動化平臺”,這個我是打個大大的問號的。實用性很差,功能很雞肋,報錯還多。介面自動化測試框架的輪子,造也造不完。 tep“測試工具”的定位完美的避開了所有這些框架的弊端。工具不會定義你如何寫自動化指令碼,工具只會幫你更好地寫自動化指令碼。 有理由相信,tep會成長為一款實用的測試工具。 # 原始碼 https://github.com/dongfanger/tep 這裡安利一波pytest[官網教程](https://docs.pytest.org/),閱讀英文文件,才能真正理解作者的意思。不過,我也會通過"try easy pytest"一系列的文章,把pytest的知識點提煉出來,供你學習。學python,寫pytest,用tep。測試更專業!
專注測試,堅持原創,只做精品。歡迎關注公眾號『東方er』
版權申明:本文為博主原創文章,轉載請保留原文連結及