Pytest從測試類外爲測試用例動態注入數據

今天Nelly問我Pytest能不能支持從TestClass類外傳入參數?從類外批量傳入各個test方法須要的參數。由於數據文件可能有不少狀況,不方便依次匹配。 然而又必須用類對用例進行歸類及複用,數據要經過類外進行遍歷。不能直接使用pytest.mark.parametrize。python

這裏採起的一個作法是:測試

  1. 添加命令行選項 --data,接受一個yaml文件
  2. data這個fixture方法裏,獲取--data傳進來的文件路徑,打開並加載全部數據,從request中獲取調用data 的用例名,從全部數據中取出該條用例的數據返回

具體參考如下代碼: data.yaml文件內容,注意數據字段要與測試方法名一致,方便自動對應數據。命令行

test_a: 
  a: 1
  b: 2

test_b:
  a: 3
  b: 4

conftest.py文件內容code

import pytest
import yaml

def pytest_addoption(parser):   # 添加運行參數
    parser.addoption("--data", action="store", help="data file")

@pytest.fixture
def data(request):
    file_path = request.config.getoption("--data")  # 獲取--data參數傳的文件路徑
    with open(file_path) as f:   # 加載全部數據
        all_data = yaml.safe_load(f) 

    test_case_name = request.function.__name__  # 獲取調用的data這個fixture方法的測試方法名稱

    return all_data.get(test_case_name)   # 只返回指定用例的數據

測試模塊test_demo3.py內容get

import pytest

class TestDemo(object):
    def test_a(self, data):  # 全部用例要帶上data這個fixture參數
        print(data)

    def test_b(self, data):
        print(data)


if __name__ == '__main__':
    pytest.main(['test_demo3.py', '-sq', '--data=data.yaml'])
相關文章
相關標籤/搜索