今天Nelly問我Pytest能不能支持從TestClass類外傳入參數?從類外批量傳入各個test方法須要的參數。由於數據文件可能有不少狀況,不方便依次匹配。 然而又必須用類對用例進行歸類及複用,數據要經過類外進行遍歷。不能直接使用pytest.mark.parametrize。python
這裏採起的一個作法是:測試
- 添加命令行選項 --data,接受一個yaml文件
- 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'])