pytest封神之路第一步 tep介紹


『 tep is a testing tool to help you write pytest more easily. Try Easy Pytest! 』

tep前身

tep的前身是接口自動化測試框架pyface,一款面向對象設計的測試框架,我寫過一篇博客介紹。

測試框架 / 測試工具

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等,

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”

附上allure常用命令,

pytest --alluredir=result  # 報告目錄,會生成一堆數據文件
allure generate result -o html  # 生成html報告
allure serve html  # 啟動服務
allure open html  # 打開報告(直接執行自動啟動服務) PyCharm可以右鍵index.html選擇Open in Browser

allure下載地址,下載解壓后,把bin絕對路徑添加到系統環境變量Path中。allure需要安裝jdk。

輕封裝

tep尊重原生用法。

requests的封裝只通過裝飾器做了2個封裝,一是記錄接口請求響應耗時,二是打印日志。只需要 from tep.client import request ,就可以和 requests.request 一樣使用了,沒有做任何其他的冗余修改。

#!/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官網教程,閱讀英文文檔,才能真正理解作者的意思。不過,我也會通過"try easy pytest"一系列的文章,把pytest的知識點提煉出來,供你學習。學python,寫pytest,用tep。測試更專業!


免責聲明!

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



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