tep用戶手冊幫你從unittest過渡到pytest

unittest和pytest是Python的2個強大的測試框架,常常用來作UI自動化或接口自動化。unittest是PyCharm的默認集成工具,也是咱們大多數人入門自動化的首選框架。pytest提供了更豐富的功能,相對的上手難度也要高一點。若是學了pytest後,想快速用pytest寫項目,用於工做實踐,那麼能夠試試我寫的這款測試工具:tep,try easy pytest。html

tep簡介

在Google中輸入python teppython

tep是一款測試工具,不是測試框架,它作的事情只是幫助你更輕鬆的使用pytest寫項目代碼,主要功能以下:mysql

  • 項目腳手架
  • pytest用例組織
  • 輸出HTML測試報告
  • 基於fixture管理環境變量
  • 基於fixture共享公共函數
  • 訪問MySQL數據庫
  • 集成經常使用第三方包
  • 登陸接口示例代碼

工具安裝

安裝

tep已經上傳到了PyPI(Python Package Index):git

能夠使用pip命令安裝:github

pip install tep

外網速度慢,pandas可能安裝失敗,推薦用國內鏡像:sql

pip --default-timeout=6000 install -i https://pypi.tuna.tsinghua.edu.cn/simple tep

因爲集成了第三方包,安裝可能會花幾分鐘,請耐心等待。shell

Python版本 3.6+數據庫

檢查

安裝完成後,檢查是否安裝成功:json

tep -V
0.5.3

或者:api

tep --version
0.5.3

升級

使用-U參數:

pip install -U tep

或者指定版本:

pip install tep==0.5.3

快速建立項目

tep提供了腳手架,預置了項目結構和代碼,打開cmd,使用startproject命令快速建立項目:

cd some_directory
tep startproject project_name
startproject

建立後的項目結果以下:

當前版本主要用來作接口自動化,建議把不一樣業務系統建成多個項目。

1個文件2處修改完成登陸請求

tep已經預置了登陸相關代碼,只須要打開fixtures\fixture_admin.py,修改2個地方的代碼,就能夠完成登陸請求。

修改環境變量

編輯fixtures/fixture_admin.py

@pytest.fixture(scope="session")
def env_vars(config):
    class Clazz:
        def __init__(self):
            env = config["env"]
            self.mapping = {
                "qa": {
                    "domain": "https://qa.com",
                    "mysql_engine": mysql_engine("127.0.0.1",  # host
                                                 "2306",  # port
                                                 "root",  # username
                                                 "123456",  # password
                                                 "test")  # db_name
                },
                "release": {
                    "domain": "https://release.com",
                    "mysql_engine": mysql_engine("127.0.0.1",
                                                 "2306",
                                                 "root",
                                                 "123456",
                                                 "release")
                }
                # Add your env and variables
            }
            self.domain = self.mapping[env]["domain"]
            self.mysql_engine = self.mapping[env]["mysql_engine"]
            # Add properties

        def add(self, env, key, value):
            self.mapping[config["env"]][key] = value

    return Clazz()

mapping是個字典,預置了2個環境:qarelease,每一個環境預置了2個變量:domainmysql_engine

domain

url = domain +uri,例如https://qa.com/api/users/login/的domain是``https://qa.com,uri是/api/users/login/`。

首先把qa環境的domain值改成你的測試域名。

修改登陸代碼

繼續編輯fixtures/fixture_admin.py

def _jwt_headers(token):
    return {"Content-Type": "application/json", "authorization": f"Bearer {token}"}


@pytest.fixture(scope="session")
def login():
    # Code your login
    logger.info("Administrator login")
    response = request(
        "post",
        url=url("/api/users/login/"),
        headers={"Content-Type": "application/json"},
        json={
            "username": "admin",
            "password": "123456",
        }
    )
    assert response.status_code < 400
    response_token = jmespath.search("token", response.json())

    class Clazz:
        token = response_token
        jwt_headers = _jwt_headers(response_token)

    return Clazz

# Code your login處開始修改代碼,替換API路徑/api/users/login/和請求參數json。若是你的登陸接口不會返回token,那麼修改jmespath.search("token", response.json())爲實際響應取值。

tep預置登陸返回了2個值:tokenjwt_headers

測試登陸

打開tests/login_test.py

from loguru import logger


def test_login(login):
    logger.info(login.token)

執行後就會調用登陸接口發起請求。

遇到問題沒法解決請留言或加羣。

編寫測試用例

用例組織

測試用例所有放在tests目錄下:

每一個.py模塊以test_前綴或_test後綴命名,每一個test函數以test前綴命名。只要遵循這個規則,目錄層次不影響。示例:

建議每一個.py模塊只包含1個test函數,也就是1條測試用例。

接口請求設計

每條測試用例能夠包含單個或多個接口請求。tep預置了1個POST請求示例代碼,打開tests/post_test.py

import jmespath
from loguru import logger

from tep.client import request


def test_post(faker_ch, url, login):
    # description
    logger.info("test post")
    # data
    fake = faker_ch
    # request
    response = request(
        "post",
        url=url("/api/users"),
        headers=login.jwt_headers,
        json={
            "name": fake.name()
        }
    )
    # assert
    assert response.status_code < 400
    # extract
    user_id = jmespath.search("id", response.json())

每一個請求由5部分組成,從上往下分別是描述、數據、請求、斷言和提取。

借鑑了JMeter元件和參數化關聯的設計思想。

描述

描述這個請求是幹嗎的。

數據

初始化局部變量,例如使用faker庫造測試數據。

請求

若是須要打印請求日誌,能夠from tep.client import requesttep.client.requestrequests.request除了記錄日誌外,沒有作任何修改。

若是請求報錯了,那麼極可能是代碼寫錯了。

也能夠直接使用原生requestfrom requests import request

不一樣請求方法的代碼以下:

request("get", url="", headers={}, json={})
request("post", url="", headers={}, params={})
request("put", url="", headers={}, json={})
request("delete", url="", headers={})

# 上傳excel
request("post",
        url="",
        headers={},
        files={
            "file": (
                file_name,
                open(file_path, "rb"),
                "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
            )
        },
        verify=False
    )

更多用法參考requests.request

斷言

斷言使用Python標準斷言assert 表達式,表達式跟if語句表達式如出一轍。

提取

推薦使用jmespath提取JSON數據,也能夠使用Python[]中括號提取。

HTML測試報告

批量執行用例

單個測試用例,在PyCharm中執行就能夠了。多個測試用例批量執行,須要打開左下角的Terminal,輸入命令來執行:

# 先進入tests目錄
cd tests
# 批量執行
pytest

只收集不執行

若是隻想統計用例條數,不執行代碼,那麼能夠使用如下命令:

pytest --co

HTML測試報告

tep提供了--tep-reports參數來生成allure測試報告:

pytest  --tep-reports

報告文件存放在根目錄的reports/中:

右鍵index.html選擇:

就會打開瀏覽器顯示測試報告了:

image-20201222172647121

默認allure報告右上角的TREND是沒法顯示數據的,--tep-reports修復了這個問題,根據history數據生成TREND走勢圖。

自定義環境變量

靜態添加

編輯fixtures/fixture_admin.py,在mapping字典中# Add your env and variables處添加環境變量,在# Add properties處添加屬性,參考domainmysql_engine。示例:

動態添加

使用add()方法動態添加環境變量:

env_vars.add("my_var", 789)

使用環境變量

env_vars返回了類對象實例,經過.運算符來使用環境變量:

env_vars.domain
env_vars.mysql_engine
env_vars.my_var

不須要import,而是給test函數添加參數,如def test(env_vars):

切換環境

conf.yaml文件中配置:

env: qa

默認爲qa環境。

團隊共享公共函數

經過fixture技術,咱們能夠把重複代碼提取出來,在團隊間進行復用。tep重度使用了這個技術,在fixtures目錄中,除了預置的fixture_admin.py,能夠繼續添加團隊成員的fixture:

新添加的fixture_your_name.py須要到根目錄的conftest.py中註冊才能生效:

# Import fixtures
exec("from .fixtures.fixture_admin import *")
exec("from .fixtures.fixture_your_name import *")

conftest.py模塊中建議所有定義成fixture,不對外提供function。

爲了不命名衝突和代碼跟蹤,團隊成員的公共函數命名建議加上_yourname後綴。

訪問MySQL數據庫

首先在fixtures\fixture_admin.py中修改mysql_engine

"mysql_engine": mysql_engine("127.0.0.1",  # host
                             "2306",  # port
                             "root",  # username
                             "123456",  # password
                             "test")  # db_name

依次填寫主機名、端口、用戶名、密碼、數據庫名。

接着使用pandas來訪問數據庫,tests\mysql_test.py預置了示例代碼:

from loguru import logger


def test_mysql(pd, env_vars):
    logger.info(pd.read_sql("select 1 from dual", env_vars.mysql_engine))

返回的數據能夠經過data["列名"]["行號"] 的方式讀取。

若是想在console中以表格方式顯示錶數據,能夠使用tep.dao.print_db_table()函數,如:

from loguru import logger
from tep.dao import print_db_table


def test_mysql(pd, env_vars):
    data = pd.read_sql("select 1 from dual", env_vars.mysql_engine)
    logger.info(print_db_table(data))

第三方包集成說明

tep使用了Poetry來管理包和依賴:

poetry

目前已集成:

# 造測試數據
faker = "^4.1.1"
# 提取JSON數據
jmespath = "^0.10.0"
# 屏蔽HTTPS警告
urllib3 = "^1.25.9"
# HTTP/HTTPS請求
requests = "^2.24.0"
# HTML測試報告
allure-pytest = "^2.8.16"
allure-python-commons = "^2.8.16"
# 打印日誌
loguru = "^0.5.1"
# 訪問數據庫
pandas = "^1.1.0"
# 配置文件
pyyaml = "^5.3.1"
# 爲pandas訪問數據庫提供engine
sqlalchemy = "^1.3.22"
# 把數據庫表打印成表格
texttable = "^1.6.3"
# 支持sqlalchemy使用
pymysql = "^0.10.1"

東方說

最先寫這個工具的想法是以項目工程方式使用pytest,並結合第三方包完成接口自動化落地。若是你也有相似的想法,那麼能夠參考tep的作法。tep用戶手冊是針對於tep工具自己的使用說明,不包含pytest框架搭建和基本使用,若是想入門pytest並深度學習,能夠閱讀我寫的pytest系列文章,共8篇。tep的最新版本是0.5.3,還不夠穩定,也存在bug,我會堅持維護下去,既是實用工具,也是技術沉澱。對tep有任何建議或問題,歡迎公衆號後臺回覆「加羣」討論哦:

參考資料:

源碼 https://github.com/dongfanger/tep

相關文章
相關標籤/搜索