Pytest的参数化之parametrize

在Pytest中,提供了两种参数化方式

  • 使用@pytest.mark.parametrize装饰器

  • 使用fixture,对没错,又是fixture

使用parametrize实现参数化

  • @pytest.mark.parametrize是pytest自带的装饰器之一,我们可以直接使用
  • @pytest.mark.parametrize可以直接装饰在任何的测试函数上面
    • 案例1:用户名做参数化
      import pytest
      
      name = ["张三", "李四", "王五"]
      @pytest.mark.parametrize("item", name)
      def test_login(item):
          print(item)
    • 案例2:如果存在用户名和密码做参数化
      • 如果按照案例1中的写法,如下:
        import pytest
        
        name = ["zhangsan", "lisi", "wangwu"]
        pwd = ["123", "234", "345"]
        
        @pytest.mark.parametrize("item", name)
        @pytest.mark.parametrize("pwd", pwd)
        def test_login(item, pwd):
            print(item, pwd)

         

        执行结果:"zhangsan 123","lisi 123","wangwu 123","zhangsan 234","lisi 234","wangwu 234","zhangsan 345","lisi 345","wangwu 345"

         

        注:按照这样写法,就会执行9条用例,每个用户名都会对密码执行一遍,这就不能做到一个账号对应一个密码了
    • 案例3:参数化,解决一个账号对应一个密码问题
      • 只需要在参数化中进行修改传入参数方式即可
        import pytest
        
        name = ["zhangsan", "lisi", "wangwu"]
        pwd = ["123", "234", "345"]
        
        @pytest.mark.parametrize("item,pwd", zip(name,pwd))
        def test_login(item, pwd):
            print(item, pwd)

         

        执行结果:"zhangsan 123","lisi 234","wangwu 345"

          注:在parametrize中传入的两个参数加上zip,也要进行接收两个参数,表示为一一对应

    • 案例4:升级案例,测试登录时需要有以下几种场景
      • 场景1:正常登录(账号和密码正确)
      • 场景2:异常登录(账号不存在)
      • 场景3:异常登录(账号正确,密码错误)
      • 场景5:异常登录(账号和密码为空)
        import pytest
        
        username = [
            {
                "case": "登录成功",
                "name": "zhangsan",
                "pwd": 123
            },
            {
                "case": "账号不存在",
                "name": "lisi",
                "pwd": 234
            },
            {
                "case": "账号或密码错误",
                "name": "wangwu",
                "pwd": 345
            },
            {
                "case": "账号或密码不能为空",
                "name": "",
                "pwd": ""
            },
        ]
        
        @pytest.mark.parametrize("item", username,ids=[data.get("case") for data in username])
        def test_login(item):
            name = item.get("name")
            pwd = item.get("pwd")
            print(f"user:{name},pwd:{pwd}")
            # 调用登录接口,传入name和pwd即可,代码省略

        执行结果:

        执行结果中出现中文乱码的现象,需要对乱码进行处理,在conftest.py(该文件在测试固件中已写)文件找那个加入一下代码对乱码进行处理
        def pytest_collection_modifyitems(items):
            '''
            处理用例名称中文乱码的问题
            :param items:
            :return:
            '''
            for item in items:
                item.name = item.name.encode("utf-8").decode("unicode_escape")
                item._nodeid = item.nodeid.encode("utf-8").decode("unicode_escape")
        处理后的执行结果
posted @ 2023-04-14 14:41  A熙  阅读(137)  评论(0)    收藏  举报