程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

【Python自動化測試26】接口自動化測試實戰六_pytest框架+allure講解

編輯:Python

文章目錄

  • 一、前言
  • 二、pytest講解
    • 2.1 什麼是pytest?
    • 2.2 為什麼使用pytest?
    • 2.3 使用pytest
    • 2.4 pytest的運行方式
    • 2.5 pytest高級特性
      • 2.5.1 pytest用例篩選
      • 2.5.2 pytest實現數據驅動
      • 2.5.3 pytest夾具
    • 2.6 allure下載
    • 2.7 pytest插件:allure-pytest安裝與目錄生成
    • 2.8 unittest轉pytest形式

一、前言

本文章主要會講解Python中pytest框架的講解,介紹什麼是pytest、為何要測試、為何使用以及參考和擴展等,除此之外下方有系列文章的傳送門,還在持續更新中,感興趣的小伙伴也可以前往查看,話不多說,讓我們一起看看吧~

系列文章:
系列文章1:【Python自動化測試1】遇見Python之美
系列文章2:【Python自動化測試2】Python安裝配置及PyCharm基本使用
系列文章3:【Python自動化測試3】初識數據類型與基礎語法
系列文章4:【Python自動化測試4】字符串知識總結
系列文章5:【Python自動化測試5】列表與元組知識總結
系列文章6:【Python自動化測試6】字典與集合知識總結
系列文章7:【Python自動化測試7】數據運算符知識合集
系列文章8:【Python自動化測試8】流程控制語句講解
系列文章9:【Python自動化測試9】函數知識合集
系列文章10:【Python自動化測試10】文件基礎操作
系列文章11:【Python自動化測試11】模塊、包與路徑知識合集
系列文章12:【Python自動化測試12】異常處理機制知識合集
系列文章13:【Python自動化測試13】類、對象、屬性與方法知識合集
系列文章14:【Python自動化測試14】Python自動化測試基礎與進階練習題
系列文章15:【Python自動化測試15】unittest測試框架的核心概念與作用
系列文章16:【Python自動化測試16】測試用例數據分離
系列文章17:【Python自動化測試17】openpyxl二次封裝與數據驅動
系列文章18:【Python自動化測試18】配置文件解析與實際應用
系列文章19:【Python自動化測試19】日志系統logging講解
系列文章20:【Python自動化測試20】接口自動化測試框架模型搭建
系列文章21:【Python自動化測試21】接口自動化測試實戰一_接口概念、項目簡介及測試流程問答
系列文章22:【Python自動化測試22】接口自動化測試實戰二_接口框架修改及用例優化
系列文章23:【Python自動化測試23】接口自動化測試實戰三_動態參數化與數據偽造
系列文章24:【Python自動化測試24】接口自動化測試實戰四_Python操作數據庫
系列文章25:【Python自動化測試25】接口自動化測試實戰五_數據庫斷言、接口關聯及相關管理優化

二、pytest講解

2.1 什麼是pytest?

pytest是一款單元測試框架,在編程過程中,單元主要指的是代碼中最小的組成部分,例如函數或類,在面向對象中,最小的單元就是類下面的方法。
當我們編寫好一段程序後,會對這些函數和方法進行檢測,是否出現程序錯誤,這種對程序的函數和方法進行測試的過程,就叫做單元測試。
pytest的測試框架類似於unittest框架相似,但pytest的測試框架比unittest更加簡潔、高效,具體的pytest的基礎介紹,大家可以參考:pytest使用介紹

2.2 為什麼使用pytest?

pytestunittest類似,但pytest還是有很多的優勢:

""" pytest優勢 1、pytest能夠兼容unittest,如果之前用例是unittest編寫的,可以使用pytest直接進行使用 2、pytest的斷言直接使用assert斷言,並非使用self.asert等語法語句以及其他各式各樣的斷言方式 3、pytest對於失敗的測試用例會提供非常詳細的錯誤信息 4、pytest可以自動發現並收集測試用例 5、pytest有非常靈活的fixture管理 6、pytest有mark標記機制,可以標記某些用例為冒煙測試用例 7、pytest提供了非常豐富的插件系統 8、pytest不需要寫類,unittest是需要寫類並繼承的,這裡pytest更加簡潔 """

2.3 使用pytest

安裝pytest庫後設置默認的運行器為pytest

def test_add():
assert True



在之前的文章提到了,框架就意味著規則,pytest用例規則如下:

""" pytest用例規則: 1、模塊名稱 test開頭.py結尾,或者*_test.py 2、測試用例函數的名稱 def test_XXX() 3、可以不定義測試類 """
""" pytest的運行方式: 1、pycharm當中的運行圖標,pytest開頭開頭運行,如不是pytest可以在setting中查找pytest並設置成pytest運行器 2、pytest命令行:要進入項目的根目錄運行pytest命令,pytest命令會自動收集運行指令時候,所有子目錄下符合要求的測試用例,例如test_login.py,模塊且以test開頭,函數test開頭,類也是如此 3、通過python包或者python模塊運行 """

2.4 pytest的運行方式

pytest有三種運行方式:

""" 方式一:直接通過代碼左側的三角進行運行(pycharm) """
""" 方式二:通過命令行運行 -- pytest -- html=output.html """
""" 方式三:通過python運行 """
from datetime import datetime
import pytest
date_str = datetime.now().strftime("%Y-%m-%d-%H-%M-%S")
# 測試報告的名稱
report_name = date_str + "萌笑天的專屬測試報告.html"
pytest.main([f"--html={
report}"])

2.5 pytest高級特性

2.5.1 pytest用例篩選

我們都做過冒煙測試,也知道冒煙測試用例,pytest支持用例篩選,你可以在想要的用例上進行標記,以此來表示這是一個冒煙測試用例:

import pytest
# 格式為:@pytest.mark.自定義標記名
@pytest.mark.smoke
def test_True()
assert True
@pytest.mark.smoke
def test_False()
assert False

我們可以給一個用例或多個用例附上單獨的標記,但這樣是無法運行的,我們需要先注冊標記,新建一個pytest.ini的配置文件並進行配置:

[pytest]
markers =
smoke

注冊完成後我們需要運行,在命令行輸入pytest - m "smoke",這樣就可以運行剛剛標記過的測試用例了,值得一提的是,如果這個標記是在函數上,那麼就代表著函數屬於標記的篩選用例,如果標記在類上,那麼整個類下的所有函數都屬於篩選用例,如例子所示,即全部為冒煙測試用例

""" 用例篩選流程: 1、需要在pytest.ini中注冊標記的名稱 2、在測試用例函數或者測試用例類上面加上@pytest.mark.標記名 3、運行指定標簽 pytest -m "標記名" """

如果運行多個標記那麼可以繼續在函數或類上再次進行新的標記,例如login標記,意味著我只想要執行登錄模塊的冒煙測試用例裡,那麼再次進行注冊並運行即可,運行使用pytest -m "smoke and login",如果是冒煙測試用例和登錄模塊用例滿足一個即可,那麼就可以使用or即可,兩者選其一,滿足即運行

2.5.2 pytest實現數據驅動

pytest實現數據驅動可以使用unittest進行實現,也可以使用自己的ddt:

注意:pytest參數化與unittest的參數化只能有一個,不能夠共同使用

""" pytest使用unittest進行數據驅動的實現 """
import unittest
imoort pytest
from unittesetreport import ddt, list_data
@pytest.mark.smoke
@unittestreport.ddt
class TestAddwithUnittest(unittest.TestCase):
@unittestreport.list_data(["hello", "world", "mengxiaotian"])
def test_add_three(self, case_info):
aseert "萌笑天" in "最棒的萌笑天"
def test_add_four(self):
assert "萌笑天" in "最棒的萌笑天"
""" 使用自己的pytest實現 """
@pytest.mark.smoke
@pytest.mark.login
@pytest.mark.parametrize("case_info", ["hello", "world"])
def test_add(case_info):
assert True

2.5.3 pytest夾具

pytest夾具會與unittest有一些不同,詳見代碼:

def setup_function():
"""前置條件,每個測試用例之前"""
print("hello, world!")
def teardown_function():
"""後置條件,每個測試用例之後"""
def test_hello():
assert 520 == 1314
def test_world():
assert "萌" in "萌笑天"
import pytest
# 聲明這是一個測試夾具
@pytest.fixture()
def connet_to_db():
print("前置條件:正在連接數據庫...")
yield # 在yield前的都是前置
# 清理動作
print("後置清理,斷開數據庫連接...")
@pytest.mark.usefixtures("connect_to_db")
def test_mengxiaotian_love():
assert 1314 == 1314

2.6 allure下載

萬能百度搜索allure進入到GitHub下載或直接點擊超鏈接:allure下載
找到Download的字眼,並在其中點擊releases



2.7 pytest插件:allure-pytest安裝與目錄生成

通過pip install allure-pytest進行安裝
生成報告在命令行中輸入:pytest --alluredir=目錄
查看報告使用:allure serve 目錄
allure可以翻譯成中文,具體這裡不過多闡述如何查看報告數據,有興趣的同學可以自行了解

2.8 unittest轉pytest形式

如果以代碼形式呈現會比較復雜,筆者直接使用備注進行說明,大家如果之前的項目是unittest的項目那麼可以根據本次說明轉換成pytest

""" unittest轉pytest: 1、數據驅動的ddt換成pytest的標記形式 2、unittest的testcase繼承需要移除 3、self.asserEqual 需要重新封裝 4、setUpclass 改成 pytest setup_class (參考上面的代碼) """


好啦~以上就是本次文章分享的全部內容啦,你學會了嗎?希望能給大家帶來幫助哦!



  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved