• python-pytest学习(十)函数传参


    一、前言

      为了提高代码的复用性,我们在写用例的时候,会用到函数,然后不同的用例去调用这个函数。

      比如登录操作,大部分用例都会先登录,那就需要把登录单独抽出来写一个函数,其他用例全部都调用这个登录函数就行。

      但是登录的账号不能写死,有时候我想用账号1去登录,执行用例1,用账号2去登录执行用例2,所以需要对函数传参。

    二、登录函数传参

      把登录单独成立,写一个函数,传2个参数user和psw,写用例的时候调用登录函数,输入几组user,psw参数化登录用例。

      测试用例传参需要用装饰器@pytest.mark.parametrize,里面写两个参数。

      第一个参数是字符串,多个参数中间用逗号隔开;

      第二个参数是list,多组数据用元组类型。

    import pytest
    
    # 测试登录数据
    test_login_data = [("admin","111111"),("admin","")]
    
    def login(user,psw):
        """普通登录函数"""
        print("登录账号:%s"%user)
        print("登录密码:%s"%psw)
        if psw:
            return True
        else:
            return False
    
    @pytest.mark.parametrize("user,psw",test_login_data)
    def test_login(user,psw):
        """登录用例"""
        result = login(user,psw)
        assert result == True,"失败原因:密码为空"
    
    if __name__ == "__main__":
        pytest.main(["-s","test_login.py"])

    运行结果:

    三、request参数

      如果想把登录插座放在前置操作里,也就是用到@pytest.fixture装饰器,传参就用默认的request参数。

      user = request.param这一步是接收传入的参数,本案例是传一个参数情况。

    import pytest
    
    # 测试账号数据
    test_user_data = ["admin1","admin2"]
    
    @pytest.fixture(scope="module")
    def login(request):
        user = request.param
        print("登录账号:%s"%user)
        return user
    
    @pytest.mark.parametrize("login",test_user_data,indirect=True)
    def test_login(login):
        """登录用例"""
        a = login
        print("测试用例中login的返回值:%s"%a)
        assert a != ""
    
    if __name__ == "__main__":
        pytest.main(["-s","test_login2.py"])

    运行结果:

       添加indirect = True参数是为了把login当成一个函数去执行,而不是一个参数。

    四、request传两个参数

      如果用到@pytest.fixture,里面用2个参数情况,可以把多个参数用一个字段去存储,这样最终还只传一个参数。

      不同的参数再从字典里面取对应key值就行,如:user = request.param["user"]

    import pytest
    
    # 测试账号数据
    test_user_data = [{"user":"admin1","psw":"1111111"},
                      {"user":"admin2","psw":""}]
    
    @pytest.fixture(scope="module")
    def login(request):
        user = request.param["user"]
        psw = request.param["psw"]
        print("登录用户:%s"%user)
        print("登录密码:%s"%psw)
        if psw:
            return True
        else:
            return False
    
    # indirect = True 声明login是个函数
    @pytest.mark.parametrize("login",test_user_data,indirect=True)
    def test_login(login):
        """登录用例"""
        a = login
        print("测试用例中login的返回值:%s"%a)
        assert a,"失败原因:密码为空"
    
    if __name__=="__main__":
        pytest.main(["-s","test_login3.py"])

    运行结果:

    E AssertionError: 失败原因:密码为空
    E assert False

       如果要用到login里面的返回值,def test_login(login)时,传入login参数,函数返回值就是login了。

    五、多个fixture

      用例上面是可以同时放多个fixture的,也就是多个前置操作,可以支持修饰器叠加,使用parametrize装饰器叠加时,用例组合是2个参数个数相乘。

    import pytest
    
    # 测试账号数据
    test_user = ["admin1","admin2"]
    test_psw = ["111111","222222"]
    
    @pytest.fixture(scope="module")
    def input_user(request):
        user = request.param
        print("登录用户:%s"%user)
        return user
    
    @pytest.fixture(scope="module")
    def input_psw(request):
        psw = request.param
        print("登录密码:%s"%psw)
        return psw
    
    @pytest.mark.parametrize("input_user",test_user,indirect=True)
    @pytest.mark.parametrize("input_psw",test_psw,indirect=True)
    def test_login(input_user,input_psw):
        """登录用例"""
        a = input_user
        b = input_psw
        print("测试数据a-> %s,b-> %s"%(a,b))
        assert b
    
    if __name__=="__main__":
        pytest.main(["-s","test_login4.py"])

    运行结果:

       如果参数user有2个数据,参数psw有2个数据,那么组合起来的案例是两个相乘,也就是组合2*2=4个用例。

    参考文章:https://www.jianshu.com/p/778eec13bb31

  • 相关阅读:
    tomcat架构分析和源码解读
    时代和命运,选择和放弃
    Python中的test测试
    python装饰器语法
    网上传言:程序员 = 宅男,程序员真的都宅吗?现实情况是这样!
    编程初学者,哪几种编程语言最值得你去学习?其实你应该这样做!
    C/C++编程笔记:《C语言》—— 数组知识详解,学编程建议收藏!
    细数程序员 10 种“辛酸与无奈”,程序员网友直言:这也太真实了!
    程序人生丨程序员的发展之路,怎样的发展决定你拥有怎样的薪资!
    程序人生丨提问环节面试官让程序员提问,五个程序员问这些,直接录取!
  • 原文地址:https://www.cnblogs.com/zhaocbbb/p/12835201.html
Copyright © 2020-2023  润新知