測試驅(qū)動技術(TDD)系列之-pytest實現(xiàn)測試數(shù)據(jù)驅(qū)動
本篇文章則介紹如何使用Python進行數(shù)據(jù)驅(qū)動。這里以pytest測試框架為例,重點講解pytest參數(shù)化相關知識。(關于pytest的環(huán)境配置以及基礎使用不在本文的討論范圍)
pytest中使用標簽@pytest.mark.parametrize 實現(xiàn)參數(shù)化功能,在執(zhí)行用例的時候該標簽迭代中的每組數(shù)據(jù)都會作為一個用例執(zhí)行。
一組參數(shù)化數(shù)據(jù)
定義參數(shù)化數(shù)據(jù),代碼如下:
- class TestDemo1:
- @pytest.mark.parametrize('actual_string, expect_string', [(1, 1), ('BB', 'BB'),('AA', 'BB')])
- def test_1(self, actual_string, expect_string):
- assert (expect_string == actual_string)
運行結(jié)果如下,三組數(shù)據(jù)在三條測試用例中運行,其中數(shù)據(jù)('AA', 'BB')運行失敗!

多組參數(shù)化數(shù)據(jù)
在一個測試類中,可以定義多組參數(shù)化數(shù)據(jù)(參數(shù)化數(shù)據(jù)個數(shù)不同,test_1二個,test_2三個),代碼如下:
- class TestDemo1:
- @pytest.mark.parametrize('actual_string, expect_string', [(1, 1), ('BB', 'BB'),('AA', 'BB')])
- def test_1(self, actual_string, expect_string):
- assert (expect_string == actual_string)
- @pytest.mark.parametrize('result, a,b', [(1, 1,0),(2, 1,0) ])
- def test_2(self, result, a,b):
- assert (result == a+b)
運行結(jié)果如下,二組數(shù)據(jù)分別在test_1和test_2中運行!

從excel中讀取數(shù)據(jù)作為參數(shù)
我們可以自定義一些方法,對外部文件進行讀取,然后把讀取的數(shù)據(jù)作為參數(shù)在pytest
中引用。把測試數(shù)據(jù)保存在excel中,如下圖

寫一個讀取excel類文件的方法,使用模塊pandas ,使用命令pip install pandas 安裝模塊,源碼如下:
- import pandas as pd
- # 讀取Excel文件 -- Pandas
- def read_data_from_pandas(excel_file, sheet_name):
- if not os.path.exists(excel_file):
- raise ValueError("File not exists")
- s = pd.ExcelFile(excel_file)
- df = s.parse(sheet_name)#解析sheet頁的數(shù)據(jù)
- return df.values.tolist()#數(shù)據(jù)返回為list
從excel中讀取數(shù)據(jù),并賦值給變量進行參數(shù)化,代碼如下:
- @pytest.mark.parametrize('actual_string, expect_string', read_data_from_pandas('E:/TestData.xls', 'data1'))
- def test_3(self, actual_string, expect_string):
- assert (expect_string == actual_string)
運行結(jié)果如下,三組數(shù)據(jù)在三條測試用例中運行!

注意:excel中的首行,默認不會作為測試數(shù)據(jù)處理。