Python单元测试之pytest
前提:需要安裝pytest和pytest-html(生成html測試報告)
pip install pytest
pip install pytest-html
安裝成功展示:
1.命名規則
Pytest單元測試中的類名和方法名必須是以test開頭,執行中只能找到test開頭的類 和方法,比unittest 更加嚴謹setup和teardown運行于測試方法的始末,即:運行一次測試函數會運行一次
setup_class和 teardown_class運行于測試方法的始末,但是不管有多少測試函數都只執行一次
案例:
2.Pytest生成自帶的html測試報告
前提條件:需要下載pytest-html模塊(python自帶的生成測試報告模塊)
pip install pytest-html案例一:
pytest.main(“模塊.py”)【運行指定模塊下,運行所有test開頭的類和測試用例】
pytest.main(["--html=./report.html","模塊.py"])
案例二:
運行指定模塊指定類指定用例,冒號分割,并生成測試報告
pytest.main([‘--html=./report.html’,‘模塊.py::類名::用例名'])
案例三:
直接執行pytest.main() 【自動查找當前目錄下,以test開頭的文件或者以test結尾的py文件】
pytest.main([‘--html=./report.html’])如果沒有找到以test開頭的文件或者以test結尾的py文件展示如下圖:
pytest調用語句
-x出現一條測試用例失敗就退出測試
擴展:跳充
使用@pytest.mark.skip()跳過該用例(函數)
跳過test01用例展示:
3.pytest的運行方式
. 點號,表示用例通過 F 表示失敗 Failure E 表示用例中存在異常 Error s 表示跳過用例4.文件讀取
讀取csv文件
import csv #導入csv模塊 class ReadCsv(): def read_csv(self): item =[] #定義一個空列表 c = csv.reader(open("../commonDemo/test1.csv","r")) #得到csv文件對象 for csv_i in c: item.append(csv_i) #將獲取的數據添加到列表中 return item r = ReadCsv() print(r.read_csv())讀取xml文件
from xml.dom import minidom class Readxml(): def read_xml(self,filename,onename,twoname): root =minidom.parse(filename) firstnode =root.getElementsByTagName(onename)[0]secondnode=firstnode.getElementsByTagName(twoname)[0].firstChild.data return secondnode5.allure
allure是一款輕量級并且非常靈活的開源測試報告框架。 它支持絕大多數測試框架, 例如TestNG、Pytest、JUint等。它簡單易用,易于集成。
首先配置allure的環境變量
驗證allure是否配置成功
其次要安裝allure
allure-pytest是Pytest的一個插件,通過它我們可以生成Allure所需要的用于生成測試報告的數據
allure常用的幾個特性
@allure.feature # 用于描述被測試產品需求 @allure.story # 用于描述feature的用戶場景,即測試需求 with allure.step: # 用于描述測試步驟,將會輸出到報告中 allure.attach # 用于向測試報告中輸入一些附加的信息,通常是一些測試數據, 截圖等案例一:實現用戶登錄功能,場景為登錄成功和登錄失敗
import pytest,allure,os # 導入模塊class TestAnli:@allure.feature('用戶登錄功能') # 用于定義被測試的功能,被測產品的需求點@allure.story('用戶登錄成功') # 用于定義被測功能的用戶場景,即子功能點def test_success(self):assert 1==1@allure.feature('用戶登錄功能') # 用于定義被測試的功能,被測產品的需求點@allure.story('用戶登錄失敗') # 用于定義被測功能的用戶場景,即子功能點def test_fail(self):assert 1==2if __name__ == '__main__':pytest.main(['--alluredir', 'report/result','test_denglu.py']) # 生成json類型的測 試報告split = 'allure ' + 'generate ' + './report/result ' + '-o ' + './report/html ' + '--clean' #將測試報告轉為html格式os.system(split) # system函數可以將字符串轉化成命令在服務器上運行pytest和allure效果展示
案例二:實現產品信息展示,車展中的各種車的品牌
pytest和allure效果展示
請欣賞福利
案例: 通過讀取csv/xml數據并且結合使用allure展示測試報告,驗證開發中的add() 和reduct()操作(在@allure.story分別實現相加減)第一種:xml文件讀取數據進行單元測試并生成測試報告
第一步:開發的代碼
class Demo:def add(self,a,b):c=a+breturn cdef reduct(self,a,b):c=a-breturn c第二步:創建一個xml文件
<node><add><add1>2</add1><add2>1</add2><add3>3</add3></add><reduct><reduct1>5</reduct1><reduct2>2</reduct2><reduct3>3</reduct3></reduct> </node>第三步:讀取xml文件
from xml.dom import minidom class Readxml():def read_xml(self,filename,onename,twoname):root =minidom.parse(filename)firstnode =root.getElementsByTagName(onename)[0]secondnode=firstnode.getElementsByTagName(twoname)[0].firstChild.datareturn secondnode r = Readxml()第四步:傳遞參數進行單元測試并結合allure生成測試報告
import pytest,allure,os from demo.demo import Demo from readdata.readxml import Readxmlr=Readxml() add1=r.read_xml('../data/testxml.xml','add','add1') add2=r.read_xml('../data/testxml.xml','add','add2') add3=r.read_xml('../data/testxml.xml','add','add3') re1=r.read_xml('../data/testxml.xml','reduct','reduct1') re2=r.read_xml('../data/testxml.xml','reduct','reduct2') re3=r.read_xml('../data/testxml.xml','reduct','reduct3') d=Demo()class TestFuli:@allure.feature('相加的操作')@allure.story('相加成功')def test_add(self):res=d.add(int(add1),int(add2))assert res==int(add3)@allure.feature('相減的操作')@allure.story('相減成功')def test_reduct(self):res = d.reduct(int(re1), int(re2))assert res == int(re3) if __name__ == '__main__':pytest.main(['--alluredir', 'report/result', 'test_lianxi.py']) # 生成json類型的測試報告split = 'allure ' + 'generate ' + './report/result ' + '-o ' + './report/html ' + '--clean' # 將測試報告轉為html格式os.system(split) # system函數可以將字符串轉化成命令在服務器上運行展示結果:
第二種:csv文件讀取數據進行單元測試并生成測試報告
第一步:開發的代碼
class Demo:def add(self,a,b):c=a+breturn cdef reduct(self,a,b):c=a-breturn c第二步:創建兩個csv文件
2,4,6 6,1,5第三步:讀取csv文件
import csv # 導入csv模塊class ReadCsv():def add_csv(self):item = [] # 定義一個空列表c = csv.reader(open("../data/testcsv1.csv", "r")) # 得到csv文件對象for csv_i in c:item.append(csv_i) # 將獲取的數據添加到列表中return itemdef reduct_csv(self):item = [] # 定義一個空列表c = csv.reader(open("../data/testcsv2.csv", "r")) # 得到csv文件對象for csv_i in c:item.append(csv_i) # 將獲取的數據添加到列表中return itemr = ReadCsv()第四步:傳遞參數進行單元測試并結合allure生成測試報告
import pytest,allure,os from demo.demo import Demo from readdata.readcsv import ReadCsvr=ReadCsv() add1=r.add_csv() re1=r.reduct_csv() d=Demo() class TestFuli:@allure.feature('相加的操作')@allure.story('相加成功')def test_add(self):for i in add1:res=d.add(int(i[0]),int(i[1]))assert res==int(i[2])@allure.feature('相減的操作')@allure.story('相減成功')def test_reduct(self):for i in re1:res=d.reduct(int(i[0]),int(i[1]))assert res==int(i[2]) if __name__ == '__main__':pytest.main(['--alluredir', 'report/result', 'test_xml.py']) # 生成json類型的測試報告split = 'allure ' + 'generate ' + './report/result ' + '-o ' + './report/html ' + '--clean' # 將測試報告轉為html格式os.system(split) # system函數可以將字符串轉化成命令在服務器上運行總結
以上是生活随笔為你收集整理的Python单元测试之pytest的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python单元测试之unittest
- 下一篇: Python接口测试之requests