1. 程式人生 > >介面測試 Pytest引數化處理

介面測試 Pytest引數化處理

pytest的引數化方式

  • pytest.fixture()方式進行引數化,fixture裝飾的函式可以作為引數傳入其他函式

  • conftest.py 檔案中存放參數化函式,可作用於模組內的所有測試用例

  • pytest.mark.parametrize()方式進行引數化

本節測試依然以is_leap_year.py方法作為測試目標:


def
is_leap_year(year):
   # 先判斷year是不是整型    if isinstance(year, int) is not True:
       raise TypeError("傳入的引數不是整數")
   elif year == 0:
       raise
ValueError("公元元年是從公元一年開始!!")
   elif abs(year) != year:        
       raise ValueError("傳入的引數不是正整數")    
   elif (year % 4 ==0 and year % 100 != 0) or year % 400 == 0:        print("%d年是閏年" % year)        
       return True    else:        print("%d年不是閏年" % year)        
       return False

pytest.fixture()

fixture是pytest的閃光點,在pytest中fixture的功能很多,本節主要介紹用fixture的引數化功能。

  • pytest.fixture()中傳入的引數為list,用例執行時,遍歷list中的值,每傳入一次值,則相當於執行一次用例。

  • ps:@pytest.fixture()裝飾的函式中,傳入了一個引數為request,試試改成其他的會出現什麼情況。

  • 這裡的測試資料是直接存在list中的,能否存入json檔案或者xml檔案再進行讀取轉換為list呢?

    fixture_param.png

測試資料和用例分離

  • 引數化資料和用例怎麼進行分離呢?可以採用conftest.py檔案儲存引數化資料和函式,模組下的用例執行時,會自動讀取conftest.py檔案中的資料

# conftest.py 記住 他叫conftest.py

import pytest

# 準備測試資料
is_leap = [4, 40, 400, 800, 1996, 2996] is_not_leap = [1, 100, 500, 1000, 1999, 3000] is_valueerror = [0, -4, -100, -400, -1996, -2000] is_typeerror = ['-4', '4', '100', 'ins', '**', '中文']

# params中需要傳入list
@pytest.fixture(params=is_leap)

def is_leap_y(request):    return request.param@pytest.fixture(params=is_typeerror)

def is_type_error(request):    return request.param

  • 測試用例檔案:


# test_para.py

import sys sys.path.append('.')
import is_leap_year
import pytest
class TestPara():    def test_is_leap(self, is_leap_y):        assert is_leap_year.is_leap_year(is_leap_y) == True    def test_is_typeerror(self, is_type_error):        with pytest.raises(TypeError):            is_leap_year.is_leap_year(is_type_error)
  • 測試結果:

PS E:\python_interface_test\requests_practice> pytest -q .\test_para.py............                                                             [100%]12 passed in 0.03 seconds

pytest.mark.parametrize()方式進行引數化

  • 採用標記函式引數化,傳入單個引數,pytest.mark.parametrize("引數名",lists)

    mark.png

  • 採用標記函式傳入多個引數,如pytest.mark.parametrize("para1, para2", [(p1_data_0, p2_data_0), (p1_data_1, p2_data_1),...]

  • 測試用例中傳入2個引數,year和期望結果,使輸入資料與預期結果對應,構造了2組會失敗的資料,在執行結果中,可以看到失敗原因:

image.png

import sys
sys.path.append('.')
import is_leap_year
import pytest

class
TestPara():
   # 引數傳入year中    
   @pytest.mark.parametrize('year, expected',
   [(1, False),
   (4, True),
   (100, False),
   (400, True),
   (500, True)])
   def test_is_leap(self, year, expected):        assert is_leap_year.is_leap_year(year) == expected    
   
   @pytest.mark.parametrize('year, expected',
   [(0, ValueError),
   ('-4', TypeError),
   (-4, ValueError),
   ('ss', TypeError),
   (100, ValueError)])
   def test_is_typeerror(self, year,expected):        if expected == ValueError:
           with pytest.raises(ValueError) as excinfo:                is_leap_year.is_leap_year(year)        
               
           assert excinfo.type == expected        
       else:
           with pytest.raises(TypeError) as excinfo:                is_leap_year.is_leap_year(year)
           
           assert excinfo.type == expected