zoukankan      html  css  js  c++  java
  • 函数传参和firture传参数request

    前言

    为了提高代码的复用性,我们在写用例的时候,会用到函数,然后不同的用例去调用这个函数。
    比如登录操作,大部分的用例都会先登录,那就需要把登录单独抽出来写个函数,其它用例全部的调用这个登陆函数就行。
    但是登录的账号不能写死,有时候我想用账号1去登录,执行用例1,用账号2去登录执行用例2,所以需要对函数传参。

    登录函数传参

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

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

      • 第一个参数是字符串,多个参数中间用逗号隔开
      • 第二个参数是list,多组数据用元祖类型
    # test_01.py
    
    # coding:utf-8
    import pytest
    
    # ** 作者:上海-悠悠 QQ交流群:588402570**
    
    # 测试登录数据
    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_01.py"])

    运行结果

    ============================= test session starts =============================
    platform win32 -- Python 3.6.0, pytest-3.6.3, py-1.5.4, pluggy-0.6.0
    rootdir: D:\, inifile:
    plugins: metadata-1.7.0, html-1.19.0, allure-adaptor-1.7.10
    collected 2 items
    
    ............YOYOmarktest	est_01.py 登录账户:admin
    登录密码:111111
    .登录账户:admin
    登录密码:
    F
    user = 'admin', psw = ''
    
        @pytest.mark.parametrize("user, psw", [("admin", "111111"), ("admin", "")])
        def test_01(user, psw):
            result = login(user, psw)
    >       assert result == True
    E       assert False == True
    
    D:YOYOmarktest	est_01.py:18: AssertionError
    
    
    ================================== FAILURES ===================================
    _______________________________ test_01[admin-] _______________________________
    
    user = 'admin', psw = ''
    
        @pytest.mark.parametrize("user, psw", [("admin", "111111"), ("admin", "")])
        def test_01(user, psw):
            result = login(user, psw)
    >       assert result == True
    E       assert False == True
    
    D:YOYOmarktest	est_01.py:18: AssertionError

    从结果可以看出,有2个用例,一个测试通过,一个测试失败了,互不影响

    request参数

    如果想把登录操作放到前置操作里,也就是用到@pytest.fixture装饰器,传参就用默认的request参数
    user = request.param 这一步是接收传入的参数,本案例是传一个参数情况

    # test_02.py
    # coding:utf-8
    import pytest
    
    #** 作者:上海-悠悠 QQ交流群:588402570**
    
    # 测试账号数据
    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_02.py"])

    运行结果:

    ============================= test session starts =============================
    platform win32 -- Python 3.6.0, pytest-3.6.3, py-1.5.4, pluggy-0.6.0
    rootdir: D:\, inifile:
    plugins: metadata-1.7.0, html-1.19.0, allure-adaptor-1.7.10
    collected 2 items
    
    ............YOYOmarktest	est_02.py 登录账户:admin1
    测试用例中login的返回值:admin1
    .登录账户:admin2
    测试用例中login的返回值:admin2
    .
    
    ========================== 2 passed in 0.01 seconds ===========================

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

    request传2个参数

    如果用到@pytest.fixture,里面用2个参数情况,可以把多个参数用一个字典去存储,这样最终还是只传一个参数
    不同的参数再从字典里面取对应key值就行,如: user = request.param["user"]

    # test_03.py
    # coding:utf-8
    import pytest
    
    # ** 作者:上海-悠悠 QQ交流群:588402570**
    
    # 测试账号数据
    test_user_data = [{"user": "admin1", "psw": "111111"},
                      {"user": "admin1", "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_03.py"])

    运行结果

    ============================= test session starts =============================
    platform win32 -- Python 3.6.0, pytest-3.6.3, py-1.5.4, pluggy-0.6.0
    rootdir: D:\, inifile:
    plugins: metadata-1.7.0, html-1.19.0, allure-adaptor-1.7.10
    collected 2 items
    
    ............YOYOmarktest	est_03.py 登录账户:admin1
    登录密码:111111
    测试用例中login的返回值:True
    .登录账户:admin1
    登录密码:
    测试用例中login的返回值:False
    F
    login = False
    
        @pytest.mark.parametrize("login", test_user_data, indirect=True)
        def test_login(login):
            '''登录用例'''
            a = login
            print("测试用例中login的返回值:%s" % a)
    >       assert a, "失败原因:密码为空"
    E       AssertionError: 失败原因:密码为空
    E       assert False
    
    D:YOYOmarktest	est_03.py:25: AssertionError
    
    
    ================================== FAILURES ===================================
    _____________________________ test_login[login1] ______________________________
    
    login = False
    
        @pytest.mark.parametrize("login", test_user_data, indirect=True)
        def test_login(login):
            '''登录用例'''
            a = login
            print("测试用例中login的返回值:%s" % a)
    >       assert a, "失败原因:密码为空"
    E       AssertionError: 失败原因:密码为空
    E       assert False
    
    D:YOYOmarktest	est_03.py:25: AssertionError
    ===================== 1 failed, 1 passed in 0.05 seconds ======================

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

    多个fixtrue

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

    # test_04.py
    # ** 作者:上海-悠悠 QQ交流群:588402570**
    # coding:utf-8
    import pytest
    
    # 测试账号数据
    test_user = ["admin1", "admin2"]
    test_psw = ["11111", "22222"]
    
    
    @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_04.py"])

    运行结果

    ============================= test session starts =============================
    platform win32 -- Python 3.6.0, pytest-3.6.3, py-1.5.4, pluggy-0.6.0
    rootdir: E:YOYOpar, inifile:
    plugins: metadata-1.7.0, html-1.19.0
    collected 4 items
    
    test_04.py 登录账户:admin1
    登录密码:11111
    测试数据a-> admin1, b-> 11111
    .登录账户:admin2
    测试数据a-> admin2, b-> 11111
    .登录密码:22222
    测试数据a-> admin2, b-> 22222
    .登录账户:admin1
    测试数据a-> admin1, b-> 22222
    .
    
    ========================== 4 passed in 0.05 seconds ===========================

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

  • 相关阅读:
    HDU 4539郑厂长系列故事――排兵布阵(状压DP)
    HDU 2196Computer(树形DP)
    HDU 4284Travel(状压DP)
    HDU 1520Anniversary party(树型DP)
    HDU 3920Clear All of Them I(状压DP)
    HDU 3853LOOPS(简单概率DP)
    UVA 11983 Weird Advertisement(线段树求矩形并的面积)
    POJ 2886Who Gets the Most Candies?(线段树)
    POJ 2828Buy Tickets
    HDU 1394Minimum Inversion Number(线段树)
  • 原文地址:https://www.cnblogs.com/guo2733/p/10833493.html
Copyright © 2011-2022 走看看