参数化的两种方式的区别,以及优缺点比较

我感觉第二种参数化方式的步骤比第一种更繁琐,请问平时工作中那种方式用的多呢?第二种参数化方式有什么优点吗?

参数化方式一:
直接在测试用例上加@pytest.mark.parametrize

def get_data(level):    
   with open("datas/data.yml", encoding='utf-8') as f:      
      datas = yaml.safe_load(f)     
      add_datas = datas.get("add")      
      div_datas = datas.get("div")    
      return (add_datas.get(level),div_datas.get(level))

add_P0_datas = get_data("P0")[0].get("datas")
add_P0_ids = get_data("P0")[0].get("ids")

calc = Calculator()

@pytest.mark.parametrize("a,b,expect", add_P0_datas, ids=add_P0_ids)
def test_case_add_p0(self, a, b, expect):
    print(a, b, expect)
    assert expect == self.calc.add(a, b)

参数化方式二:使用fixture

    def get_data_from_yaml(name,level='P0'):
        with open("datas/data.yml", encoding='utf-8') as f:
           data = yaml.safe_load(f)
           datas = data[name][level]['datas']        
           ids = data[name][level]['ids']
           return(datas,ids)

    @pytest.fixture(autouse=True)
    def get_instance():
        calc = Calculator()
        yield calc

    @pytest.fixture(params=get_data_from_yaml('add','P0')[0],ids=get_data_from_yaml('add','P0')[1])
    def get_datas_with_feature_add_p0(request):
        return request.param

    def test_add_p0(self, get_instance,get_datas_with_feature_add_p0):
        f = get_datas_with_feature_add_p0
        print(f[0],f[1],f[2])
        assert f[2] == round(get_instance.add(f[0], f[1]),3)
1 Like

一般推荐使用第一种方式进行参数化呢,专一的工具做专一的事情
第二种是pytest的装配器,它有很多的功能,非常强大,其实第一种方法在底层的实现上也是使用的装配器来做的,做了一层的封装

fixture 配合paramtrize可以更好的实现参数化+用例的前置和后置,注意parametrize的indirect属性设置成True,parametrize执行时会先调用同名参数的fixture,这样 case_set 这个fixture可以放在conftest,统一管理所有用例的前置和后置,也可以放在当前模块,管理当前模块的前后置,不需要每条用例都单独写fixture了

@pytest.fixture
def case_set(request):
    print("测试用例开始")
    yield request.param
    print("测试用例结束")

cases = ['用例1', '用例2']
@pytest.mark.parametrize('case_set', cases, indirect=True)
def test_case(case_set):
    print(f"执行用例{case_set}")